<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>งานเขียนของกันต์ธณวิชญ์</title>
<link>https://kanthanawit.in.th/writing/</link>
<atom:link href="https://kanthanawit.in.th/writing/index.xml" rel="self" type="application/rss+xml"/>
<description>Kanthanawit&#39;s playground — rice research, R packages, agricultural statistics, and other small things built along the way</description>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Wed, 20 May 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>การทำงานกับ Claude</title>
  <link>https://kanthanawit.in.th/writing/how-to-claude/</link>
  <description><![CDATA[ 




<section id="สราง-project-แทนการเปดแชทมว-ๆ" class="level2">
<h2 class="anchored" data-anchor-id="สราง-project-แทนการเปดแชทมว-ๆ">1. สร้าง Project แทนการเปิดแชทมั่ว ๆ</h2>
<p>ทุกครั้งที่เปิดแชทใหม่ Claude เริ่มจากศูนย์ ไม่รู้ว่าเราเป็นใคร ทำงานอะไร หรือชอบคำตอบแบบไหน ผลคือต้องอธิบายตัวเองซ้ำทุกครั้ง หรือได้คำตอบ generic ที่ไม่ตรงกับงานเรา</p>
<p><strong>วิธีแก้:</strong> ใช้ Projects — สร้าง Project แยกตามบริบท เช่น งาน / ธุรกิจ / การเรียน / เขียนคอนเทนต์ Claude จะมี context ของงานนั้นติดอยู่ตลอด ไม่ต้องเริ่มใหม่ทุกแชท</p>
<hr>
</section>
<section id="บอก-claude-ใหรจกเรากอน" class="level2">
<h2 class="anchored" data-anchor-id="บอก-claude-ใหรจกเรากอน">2. บอก Claude ให้รู้จักเราก่อน</h2>
<p>Claude ช่วยได้ดีขึ้นมากถ้ารู้ว่าเราเป็นใคร ใส่ข้อมูลนี้ไว้ใน Project Instructions ตั้งแต่ต้น:</p>
<ul>
<li>ชื่อ + ทำงานอะไร + หน้าที่หลักคืออะไร</li>
<li>เป้าหมายตอนนี้คืออะไร</li>
<li>ถนัดเรื่องไหน กำลังเรียนรู้เรื่องไหน</li>
<li>ชอบคำตอบสั้นหรือยาว ไม่ชอบคำตอบแบบไหน</li>
</ul>
<p>ยิ่งให้ context ชัด คำตอบยิ่งตรง</p>
<hr>
</section>
<section id="ตง-custom-instructions-ให-claude-ทำงานในสไตลเรา" class="level2">
<h2 class="anchored" data-anchor-id="ตง-custom-instructions-ให-claude-ทำงานในสไตลเรา">3. ตั้ง Custom Instructions ให้ Claude ทำงานในสไตล์เรา</h2>
<p>รู้จักเราแล้ว ยังต้องบอกอีกว่าอยากให้มัน “ทำงานกับเราแบบไหน” ตัวอย่าง Instructions ที่ใช้ได้เลย:</p>
<blockquote class="blockquote">
<p>ตอบตรง ๆ ไม่ต้องเกริ่น ไม่ต้องชมก่อนตอบ ไม่ต้องพูดซ้ำคำถาม ถ้าไม่แน่ใจให้ถามก่อน ถ้าเป็นงานธุรกิจให้คิดแบบ CEO ถ้าเป็นงานเขียนให้ใช้โทนกันเอง ถ้างานซับซ้อนให้แตกเป็นขั้นตอน</p>
</blockquote>
<p>ข้อนี้สำคัญมาก เพราะทำให้ Claude ไม่ตอบตาม default แต่ตอบในแบบที่เหมาะกับเราจริง ๆ</p>
<hr>
</section>
<section id="อยาใช-claude-เหมอน-google" class="level2">
<h2 class="anchored" data-anchor-id="อยาใช-claude-เหมอน-google">4. อย่าใช้ Claude เหมือน Google</h2>
<p>Claude ไม่ได้เก่งสุดที่การตอบนิยาม แต่เก่งมากตอนช่วยคิด วิเคราะห์ และตัดสินใจ</p>
<p>❌ แบบที่ได้แค่นิยาม: &gt; “Prompt caching คืออะไร?”</p>
<p>✅ แบบที่ได้งานจริง: &gt; “ผมทำ workflow ที่เรียก Claude 20 ครั้งต่อ session ช่วยวิเคราะห์ว่า prompt caching จะลดต้นทุนได้จริงไหม และควรออกแบบ flow ยังไง”</p>
<p>ให้ context + ปัญหาจริงไปด้วย แล้วคำตอบจะต่างกันเยอะมาก</p>
<hr>
</section>
<section id="กอนเรมงานใหญ-ให-claude-ถามกอน" class="level2">
<h2 class="anchored" data-anchor-id="กอนเรมงานใหญ-ให-claude-ถามกอน">5. ก่อนเริ่มงานใหญ่ ให้ Claude ถามก่อน</h2>
<p>งานซับซ้อนอย่างเขียนอีเมลขายของ วางแผนธุรกิจ หรือวางระบบ — อย่าให้มันทำทันที</p>
<p>ใช้ prompt นี้ก่อนเริ่มงานสำคัญทุกครั้ง:</p>
<blockquote class="blockquote">
<p>“ก่อนเริ่ม ช่วยถามผม 5 คำถามที่จำเป็นที่สุด เพื่อให้งานนี้ออกมาดีที่สุด”</p>
</blockquote>
<p>Claude จะไม่ต้องเดาเองว่า context คืออะไร ผลลัพธ์ที่ได้จะตรงกว่าเดิมมาก</p>
<hr>
</section>
<section id="ให-claude-clone-สไตลการเขยนของเรา" class="level2">
<h2 class="anchored" data-anchor-id="ให-claude-clone-สไตลการเขยนของเรา">6. ให้ Claude clone สไตล์การเขียนของเรา</h2>
<p>ถ้าให้เขียนโดยไม่มีตัวอย่าง งานที่ได้จะดีแบบ AI แต่ไม่เหมือนเรา</p>
<p><strong>วิธีทำ:</strong> เอางานเขียนเก่า 3–5 ชิ้นให้มันดู แล้วสั่งว่า:</p>
<blockquote class="blockquote">
<p>“วิเคราะห์สไตล์การเขียนของผม ดูว่าผมใช้ประโยคยาวไหม เปิดบทความยังไง โทนเป็นทางการแค่ไหน มี pattern อะไรที่ทำให้งานดูเป็นผม หลังจากนั้นทุกครั้งที่ผมให้เขียนอะไร ให้เลียนสไตล์นี้”</p>
</blockquote>
<p>ทำครั้งเดียว ใช้ได้ตลอด Project</p>
<hr>
</section>
<section id="ใช-claude-เปนคนเถยง-ไมใชแคคนชวยคด" class="level2">
<h2 class="anchored" data-anchor-id="ใช-claude-เปนคนเถยง-ไมใชแคคนชวยคด">7. ใช้ Claude เป็นคนเถียง ไม่ใช่แค่คนช่วยคิด</h2>
<p>AI มักตอบเห็นด้วยกับเราเสมอ ถ้าจะใช้ให้คุ้ม ต้องให้มันช่วย “ทุบไอเดีย” ด้วย</p>
<p>เวลามีแผนธุรกิจหรือกำลังตัดสินใจเรื่องใหญ่ ใช้ 2 prompt นี้ต่อกัน:</p>
<p><strong>รอบแรก — หาจุดอ่อน:</strong> &gt; “ช่วยทำลายแผนนี้หน่อย หาจุดอ่อน สมมติฐานที่อาจผิด วิธีที่มันจะล้มเหลว และเหตุผลว่าทำไมผมอาจคิดผิด”</p>
<p><strong>รอบสอง — เสริมให้แข็ง:</strong> &gt; “ตอนนี้ช่วย steelman ฝั่งผม ทำให้ไอเดียนี้แข็งแรงที่สุดเท่าที่จะเป็นไปได้”</p>
<p>เห็นทั้งด้านที่แย่ที่สุดและด้านที่แข็งแกร่งที่สุด ก่อนตัดสินใจจริง</p>
<hr>
</section>
<section id="ใช-extended-thinking-กบงานทตองคดหนก" class="level2">
<h2 class="anchored" data-anchor-id="ใช-extended-thinking-กบงานทตองคดหนก">8. ใช้ Extended Thinking กับงานที่ต้องคิดหนัก</h2>
<p>งานง่าย ๆ ไม่จำเป็นต้องใช้ แต่ถ้าเป็นงานพวกนี้ให้เปิด Extended Thinking:</p>
<ul>
<li>วิเคราะห์ธุรกิจ / ตัดสินใจลงทุน</li>
<li>วางระบบหรือแก้ปัญหาเชิงกลยุทธ์</li>
<li>เปรียบเทียบหลายทางเลือก</li>
<li>หาจุดเสี่ยงของแผน</li>
</ul>
<p>หรือบอกตรง ๆ ใน prompt ว่า “คิดแบบละเอียดก่อนตอบ อย่ารีบสรุป” — ผลลัพธ์จะดีกว่าการให้มันตอบเร็ว ๆ เยอะมาก</p>
<hr>
</section>
<section id="ให-claude-เขยน-prompt-ให-claude-เอง" class="level2">
<h2 class="anchored" data-anchor-id="ให-claude-เขยน-prompt-ให-claude-เอง">9. ให้ Claude เขียน prompt ให้ Claude เอง</h2>
<p>ถ้าไม่รู้จะสั่งยังไงให้ได้งานดี ถามมันตรง ๆ เลย:</p>
<blockquote class="blockquote">
<p>“ผมอยากให้ Claude ช่วยทำ [งานนี้] ช่วยเขียน prompt ที่ดีที่สุดให้หน่อย ใส่ role, context, format, และ constraints ให้ครบ แล้วใช้ prompt นั้นทำงานต่อทันที”</p>
</blockquote>
<p>หลายครั้งปัญหาไม่ได้อยู่ที่ Claude ไม่เก่ง แต่อยู่ที่เรายังอธิบายโจทย์ไม่ดีพอ</p>
<hr>
</section>
<section id="กำหนดความยาวคำตอบทกครง" class="level2">
<h2 class="anchored" data-anchor-id="กำหนดความยาวคำตอบทกครง">10. กำหนดความยาวคำตอบทุกครั้ง</h2>
<p>ถ้าไม่บอก Claude จะตอบยาวกว่าที่ต้องการเสมอ บอกชัด ๆ ไปเลยว่า:</p>
<ul>
<li>“ตอบไม่เกิน 3 ประโยค”</li>
<li>“ขอ 5 bullet points”</li>
<li>“เขียนไม่เกิน 150 คำ”</li>
<li>“เอาเฉพาะข้อสรุป ไม่ต้องอธิบาย”</li>
</ul>
<p>ช่วยประหยัดทั้งเวลาอ่านและ token โดยเฉพาะคนที่ใช้ Claude บ่อย</p>
<hr>
</section>
<section id="ตดคำเกรนทไมจำเปนออก" class="level2">
<h2 class="anchored" data-anchor-id="ตดคำเกรนทไมจำเปนออก">11. ตัดคำเกริ่นที่ไม่จำเป็นออก</h2>
<p>Claude มักเริ่มด้วย “เป็นคำถามที่ดีมาก” / “เข้าใจครับ” / “มาดูกันทีละส่วน” — ถ้าไม่ต้องการ ใส่ไว้ใน Custom Instructions เลยว่า:</p>
<blockquote class="blockquote">
<p>“ไม่ต้องเกริ่น ไม่ต้องชม ไม่ต้องพูดซ้ำคำถาม เข้าคำตอบทันที และไม่ต้องสรุปท้ายถ้าไม่ได้ขอ”</p>
</blockquote>
<p>เล็กน้อยแต่ทำให้คำตอบสะอาดขึ้นเยอะ</p>
<hr>
</section>
<section id="อยาอธบายตวเองซำทกแชท" class="level2">
<h2 class="anchored" data-anchor-id="อยาอธบายตวเองซำทกแชท">12. อย่าอธิบายตัวเองซ้ำทุกแชท</h2>
<p>ถ้าต้อง paste ข้อมูลตัวเองทุกครั้ง แปลว่า setup ยังไม่ดี</p>
<p>ข้อมูลที่ใช้บ่อยควรอยู่ใน Project Instructions ไม่ใช่ copy-paste ใหม่ทุกแชท เพราะยิ่งใช้บ่อย ยิ่งเปลืองเวลา ยิ่งเปลือง token และ Claude ก็ยังตอบไม่สม่ำเสมออยู่ดี</p>
<hr>
</section>
<section id="ถาเปลยนเรอง-ใหเปดแชทใหมใน-project-เดม" class="level2">
<h2 class="anchored" data-anchor-id="ถาเปลยนเรอง-ใหเปดแชทใหมใน-project-เดม">13. ถ้าเปลี่ยนเรื่อง ให้เปิดแชทใหม่ใน Project เดิม</h2>
<p>คุยทุกอย่างในแชทเดียวนาน ๆ context จะยาวเกินไป Claude เริ่มเอาเรื่องเก่ามาปนเรื่องใหม่</p>
<p>ถ้าเปลี่ยนหัวข้อชัด ๆ เช่น จากงานเขียนไปวางระบบ หรือจากธุรกิจไปเรื่องส่วนตัว — เปิดแชทใหม่ใน Project เดิม ยังได้ context ของ Project แต่ไม่แบกข้อมูลเก่าที่ไม่เกี่ยวเข้ามาด้วย</p>
<hr>
</section>
<section id="ให-claude-อธบายเรองยากดวย-feynman-method" class="level2">
<h2 class="anchored" data-anchor-id="ให-claude-อธบายเรองยากดวย-feynman-method">14. ให้ Claude อธิบายเรื่องยากด้วย Feynman Method</h2>
<p>อยากเข้าใจเรื่องยากจริง ๆ อย่าให้มันอธิบายด้วยศัพท์เทคนิค ใช้ prompt นี้แทน:</p>
<blockquote class="blockquote">
<p>“อธิบายเรื่องนี้ด้วย analogy และตัวอย่างในชีวิตประจำวัน ห้ามใช้ศัพท์ยาก สมมติว่าผมไม่มีพื้นฐานเลย แล้วถามผมกลับทีละคำถามเพื่อเช็กว่าผมเข้าใจจริงไหม”</p>
</blockquote>
<p>เหมาะกับทุกเรื่องที่ยาก เช่น การเงิน การลงทุน ระบบ API AI ฟิสิกส์ เพราะเป้าหมายไม่ใช่แค่จำคำตอบ แต่เข้าใจจนพูดเองได้</p>
<hr>
</section>
<section id="ใช-claude-วางแผนเทยวแบบเขากบสไตลเราจรง-ๆ" class="level2">
<h2 class="anchored" data-anchor-id="ใช-claude-วางแผนเทยวแบบเขากบสไตลเราจรง-ๆ">15. ใช้ Claude วางแผนเที่ยวแบบเข้ากับสไตล์เราจริง ๆ</h2>
<p>อย่าถามแค่ “ไปญี่ปุ่น 5 วัน เที่ยวไหนดี” — บอกสไตล์การเที่ยวด้วย:</p>
<blockquote class="blockquote">
<p>“ผมชอบตื่นสาย เที่ยวชิล ๆ ไม่แน่น ชอบร้าน local มากกว่าร้านดัง งบวันละ X บาท ไปสองคน เดินเยอะได้ อยากเลี่ยง tourist trap ช่วยวางแผน 5 วันในโตเกียวให้หน่อย”</p>
</blockquote>
<p>ได้ itinerary ที่เหมาะกับเราจริง ๆ ไม่ใช่ template ทั่วไป</p>
<hr>
</section>
<section id="ใช-claude-วเคราะหรายจายแบบมขอสรปจรง" class="level2">
<h2 class="anchored" data-anchor-id="ใช-claude-วเคราะหรายจายแบบมขอสรปจรง">16. ใช้ Claude วิเคราะห์รายจ่ายแบบมีข้อสรุปจริง</h2>
<p>เอารายจ่ายทั้งเดือนให้ Claude ดู แต่ต้องบอกเป้าหมายทางการเงินด้วย เช่น อยากเก็บเงิน ลดหนี้ หรืออยากรู้ว่าเงินหายไปกับอะไร</p>
<p>แล้วให้มันวิเคราะห์: - หมวดไหนใช้เยอะที่สุด - ค่าใช้จ่ายไหนผิดปกติ - อะไรตัดได้โดยไม่กระทบชีวิตมาก - การเปลี่ยนแปลงหนึ่งอย่างที่กระทบการเงินมากที่สุดคืออะไร</p>
<p>ดีกว่าแค่ดู statement แล้วรู้สึกผิดอยู่คนเดียว</p>
<hr>
</section>
<section id="ใช-claude-เปน-personal-thinking-partner" class="level2">
<h2 class="anchored" data-anchor-id="ใช-claude-เปน-personal-thinking-partner">17. ใช้ Claude เป็น personal thinking partner</h2>
<p>บางเรื่องเราไม่ได้ต้องการคำตอบทันที แต่ต้องการคนช่วยถาม ช่วยสะท้อน และช่วยให้เราคิดชัดขึ้น</p>
<p>บอก Claude ตรง ๆ ว่า:</p>
<blockquote class="blockquote">
<p>“ผมอยากคิดเรื่องนี้ให้ชัดขึ้น ช่วยถามผมก่อนเพื่อเข้าใจสถานการณ์ สะท้อนสิ่งที่คุณได้ยิน แล้วค่อยให้มุมมองตรง ๆ อย่าแค่ปลอบใจ ถ้ามีอะไรที่ผมอาจคิดผิดให้พูดตรง ๆ ด้วย”</p>
</blockquote>
<p>เหมาะกับเรื่องชีวิต งาน ความสัมพันธ์ หรือการตัดสินใจที่ติดอยู่ในหัวนาน ๆ</p>
<hr>
</section>
<section id="ใช-claude-stress-test-ไอเดยธรกจกอนลงเงนจรง" class="level2">
<h2 class="anchored" data-anchor-id="ใช-claude-stress-test-ไอเดยธรกจกอนลงเงนจรง">18. ใช้ Claude stress-test ไอเดียธุรกิจก่อนลงเงินจริง</h2>
<p>ก่อนเอาเวลาและเงินไปลงกับไอเดียไหน ให้ Claude ช่วยหารูรั่วก่อน:</p>
<blockquote class="blockquote">
<p>“ช่วยถามและวิเคราะห์ไอเดียนี้ให้ผม: สมมติฐานไหนอาจผิด ลูกค้าอาจไม่จ่ายเพราะอะไร คู่แข่งคือใครและเราจะแพ้ตรงไหน อะไรคือปัญหาใหญ่ที่สุด และต้องปรับยังไงถึงจะเวิร์กขึ้น”</p>
</blockquote>
<p>เจอปัญหาก่อนเสียเงินจริง — คุ้มมากสำหรับคนทำธุรกิจ</p>


</section>

 ]]></description>
  <category>Claude</category>
  <guid>https://kanthanawit.in.th/writing/how-to-claude/</guid>
  <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>วิธีการทดสอบ Paired T-Test และ Wilcoxon Signed-Rank Test ในงานเกษตร</title>
  <link>https://kanthanawit.in.th/writing/pair-ttest/</link>
  <description><![CDATA[ 




<p>บ่อยครั้งในทางการเกษตร เมื่อเราทำการทดลองเพื่อเปรียบเทียบ <strong>“วิธีการใหม่”</strong> กับ <strong>“วิธีการดั้งเดิมของเกษตรกร”</strong> ในระดับการประเมินเทคโนโลยี (Technology Verification)มักเผชิญปัญหาความแปรปรวนของพื้นที่</p>
<p>เนื่องจากสภาพแวดล้อมในแปลงของเกษตรกรแต่ละรายมีความแตกต่างกัน (เช่น แปลงที่ 1 ดินอุดมสมบูรณ์มาก แปลงที่ 10 เป็นดินทรายไม่อุ้มน้ำ) การนำค่าเฉลี่ยของผลผลิตหรือการเจริญเติบโตของทั้ง 12 รายมาเทียบกันโดยตรง อาจทำให้เกิดความคลาดเคลื่อนจากปัจจัยสภาพพื้นที่ได้ นักวิจัยจึงนิยมเลือกใช้ <strong>การทดสอบแบบจับคู่ (Paired Comparison)</strong> เพื่อลดอคติจากความแตกต่างทางสภาพแวดล้อมเหล่านี้</p>
<section id="เลอกใชสถตแบบไหนด" class="level2">
<h2 class="anchored" data-anchor-id="เลอกใชสถตแบบไหนด">เลือกใช้สถิติแบบไหนดี?</h2>
<p>ในการวิเคราะห์ข้อมูลแบบจับคู่ เรามักจะเลือกระหว่างสถิติ 2 ตัวหลักๆ ขึ้นอยู่กับลักษณะการแจกแจงของข้อมูล (Data Distribution):</p>
<ol type="1">
<li><strong>Paired T-test (Parametric):</strong> หากข้อมูลที่เก็บมา (เช่น ผลผลิตต่อไร่, ความสูงของต้น) มีการกระจายตัวแบบปกติ (Normal Distribution) สถิติตัวนี้จะช่วยให้นักวิจัยมองเห็น “ส่วนต่างเฉลี่ย” ที่เพิ่มขึ้นหรือลดลงอย่างชัดเจน</li>
<li><strong>Wilcoxon Signed-Rank Test (Non-parametric):</strong> หากข้อมูลเป็นประเภทลำดับขั้น (Ordinal) เช่น คะแนนความเข้มของสีใบ (ระดับ 1-6) หรือข้อมูลที่มีการแจกแจงไม่ปกติ (Non-normal Distribution) เพราะสามารถช่วยยืนยันได้ว่า “วิธีใหม่” ให้ผลลัพธ์ที่ดีกว่า “วิธีของเกษตรกร” อย่างมีนัยสำคัญหรือไม่ โดยไม่ต้องสนใจ assumption เรื่องการแจกแจงปกติ</li>
</ol>
<hr>
</section>
<section id="ตวอยางการวเคราะหดวย-r-r-code-example" class="level2">
<h2 class="anchored" data-anchor-id="ตวอยางการวเคราะหดวย-r-r-code-example">ตัวอย่างการวิเคราะห์ด้วย R (R Code Example)</h2>
<p>ด้านล่างนี้คือตัวอย่างการจำลองข้อมูลเปรียบเทียบคะแนนความเข้มสีใบพืช (ระดับ 1-6) ระหว่างวิธีของเกษตรกรและวิธีการใหม่ พร้อมการแสดงผลด้วยกราฟและการตั้งสมมติฐานทางสถิติ</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># โหลดแพ็กเกจที่จำเป็นสำหรับการจัดการข้อมูลและสร้างกราฟ</span></span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dplyr)</span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tidyr)</span>
<span id="cb1-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ggplot2)</span>
<span id="cb1-5"></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. เตรียมข้อมูลจำลอง (Mockup Data)</span></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สมมติเราลงพื้นที่ประเมินเกษตรกร 12 ราย วัดค่าความเข้มสีใบ (คะแนน 1-6)</span></span>
<span id="cb1-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">123</span>) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ล็อคค่าสุ่มเพื่อให้ผลรันเหมือนเดิมทุกครั้ง</span></span>
<span id="cb1-9"></span>
<span id="cb1-10">data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb1-11">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Farmer_ID =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Farmer_"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>),</span>
<span id="cb1-12">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Farmer_Method =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>), <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># วิธีของเกษตรกร</span></span>
<span id="cb1-13">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Our_Method =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># วิธีการทดลองใหม่</span></span>
<span id="cb1-14">)</span>
<span id="cb1-15"></span>
<span id="cb1-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. จัดรูปแบบข้อมูลดิบจาก Wide เป็น Long format สำหรับสร้างกราฟ</span></span>
<span id="cb1-17">data_long <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-18">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pivot_longer</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cols =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Farmer_Method"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Our_Method"</span>),</span>
<span id="cb1-19">               <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">names_to =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Method"</span>,</span>
<span id="cb1-20">               <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values_to =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Score"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-21">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Method =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">factor</span>(Method, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">levels =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Farmer_Method"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Our_Method"</span>),</span>
<span id="cb1-22">                         <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">labels =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"วิธีเกษตรกร"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"วิธีใหม่"</span>)))</span>
<span id="cb1-23"></span>
<span id="cb1-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. สร้างกราฟแสดงผลแบบคู่ (Slope Graph / Paired Plot)</span></span>
<span id="cb1-25"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ช่วยให้เห็นแนวโน้มการเปลี่ยนแปลงของเกษตรกรแต่ละรายได้ชัดเจนขึ้น</span></span>
<span id="cb1-26"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ggplot</span>(data_long, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> Method, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> Score, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">group =</span> Farmer_ID)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb1-27">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_point</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">color =</span> Method), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">size =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">alpha =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb1-28">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_line</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">color =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gray60"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">alpha =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">linewidth =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb1-29">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme_minimal</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">base_size =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb1-30">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">labs</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">title =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"เปรียบเทียบระดับความเข้มสีใบของพืช (รายแปลง)"</span>,</span>
<span id="cb1-31">       <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">subtitle =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"เส้นเชื่อมแสดงความแตกต่างภายในแปลงของเกษตรกรรายเดียวกัน"</span>,</span>
<span id="cb1-32">       <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"วิธีการปลูก"</span>,</span>
<span id="cb1-33">       <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"คะแนนความเข้มสีใบ (1-6)"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb1-34">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">scale_color_manual</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"วิธีเกษตรกร"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#E69F00"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"วิธีใหม่"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#009E73"</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb1-35">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">legend.position =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"none"</span>)</span>
<span id="cb1-36"></span>
<span id="cb1-37"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. การประเมินผลทางสถิติ</span></span>
<span id="cb1-38"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เนื่องจากข้อมูลลักษณะนี้เป็นระดับคะแนน (Ordinal score 1-6)</span></span>
<span id="cb1-39"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># การใช้ Wilcoxon Signed-Rank Test แบบจับคู่จึงเป็นวิธีที่เหมาะสมที่สุด</span></span>
<span id="cb1-40">wilcox_result <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">wilcox.test</span>(data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Our_Method, data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Farmer_Method, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">paired =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span>
<span id="cb1-41">wilcox_result</span>
<span id="cb1-42"></span>
<span id="cb1-43"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># อย่างไรก็ตาม หากข้อมูลเป็นตัวเลขความต่อเนื่อง (เช่น น้ำหนัก, ส่วนสูง)</span></span>
<span id="cb1-44"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># และแจกแจงแบบปกติ สามารถใช้ Paired t-test ได้ดังนี้</span></span>
<span id="cb1-45">t_result <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">t.test</span>(data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Our_Method, data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Farmer_Method, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">paired =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span>
<span id="cb1-46">t_result</span></code></pre></div></div>
<section id="การแปลผลลพธ-interpretation" class="level3">
<h3 class="anchored" data-anchor-id="การแปลผลลพธ-interpretation">การแปลผลลัพธ์ (Interpretation)</h3>
<p>จากโค้ดด้านบน หากค่า p-value ที่ได้จากสถิติ <code>wilcox.test</code> หรือ <code>t.test</code> มีค่าน้อยกว่าระดับนัยสำคัญที่เราตั้งไว้ (เช่น p &lt; 0.05) สามารถสรุปได้ว่า <strong>“วิธีการใหม่”</strong> ทำให้พืชมีแนวโน้มความเข้มสีใบสูงกว่า <strong>“วิธีการของเกษตรกร”</strong> อย่างมีนัยสำคัญทางสถิติ ซึ่งเป็นหลักฐานที่ช่วยยืนยันความสำเร็จของการทดสอบเทคโนโลยีนี้ได้อย่างเป็นรูปธรรม</p>


</section>
</section>

 ]]></description>
  <category>R</category>
  <category>Statistics</category>
  <guid>https://kanthanawit.in.th/writing/pair-ttest/</guid>
  <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/paired_test_cover.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>คู่มือสร้าง R Package ฉบับ 2026</title>
  <link>https://kanthanawit.in.th/writing/r-package-dev-2026/</link>
  <description><![CDATA[ 




<section id="คมอสราง-r-package-ฉบบ-2026" class="level1">
<h1>คู่มือสร้าง R Package ฉบับ 2026</h1>
<p>การสร้าง R Package ในปี 2026 เน้นความเร็ว (Performance) และการทำงานร่วมกับ AI บทความนี้สรุปขั้นตอนจากวิดีโอของ <a href="https://www.youtube.com/@Riffomonas">Pat Schloss (Riffomonas Project)</a> และปรับปรุงด้วยเครื่องมือสมัยใหม่อย่าง Positron, <code>pak</code>, และ Quarto</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-1-contents" aria-controls="callout-1" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>ทำไมต้องสร้าง R Package?
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-1" class="callout-1-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>แม้แต่โค้ดที่ใช้งานส่วนตัว การจัด Package ช่วยให้คุณ: - <strong>แชร์งาน</strong> กับทีมหรือชุมชนนักวิจัยได้ง่าย - <strong>จัดการ Dependencies</strong> อย่างเป็นระบบ ไม่มีปัญหา “ใน PC ฉันรันได้นะ” - <strong>เขียน Documentation</strong> ที่ใช้จริงได้ผ่าน Roxygen2 และ Quarto - <strong>ทดสอบโค้ดอัตโนมัติ</strong> ด้วย <code>testthat</code> ก่อนที่คนอื่นจะเจอบัก</p>
</div>
</div>
</div>
<hr>
<section id="เตรยมกระเปาเครองมอ-2026-essentials" class="level2">
<h2 class="anchored" data-anchor-id="เตรยมกระเปาเครองมอ-2026-essentials">🛠️ 0. เตรียมกระเป๋าเครื่องมือ (2026 Essentials)</h2>
<p>ในปี 2026 เราเปลี่ยนมาใช้เครื่องมือที่เร็วและฉลาดกว่าเดิม ก่อนเริ่มควรติดตั้งสิ่งเหล่านี้ให้ครบ:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>เครื่องมือ</th>
<th>หน้าที่</th>
<th>ทำไมต้องใช้?</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Positron</strong> หรือ RStudio</td>
<td>IDE สำหรับพัฒนา R</td>
<td>Positron เร็วกว่ามากสำหรับโปรเจกต์ใหญ่</td>
</tr>
<tr class="even">
<td><strong>pak</strong></td>
<td>ติดตั้ง Package</td>
<td>เร็วกว่า <code>install.packages()</code> หลายเท่า รองรับ parallel install</td>
</tr>
<tr class="odd">
<td><strong>devtools</strong></td>
<td>เครื่องมือพัฒนา Package</td>
<td>ครอบคลุมทุก Workflow หลัก</td>
</tr>
<tr class="even">
<td><strong>usethis</strong></td>
<td>สร้างโครงสร้างอัตโนมัติ</td>
<td>ลด Boilerplate ได้ 90%</td>
</tr>
<tr class="odd">
<td><strong>testthat</strong></td>
<td>Unit Testing</td>
<td>ช่วยให้โค้ดเชื่อถือได้</td>
</tr>
<tr class="even">
<td><strong>roxygen2</strong></td>
<td>สร้างเอกสารจากโค้ด</td>
<td>เขียนครั้งเดียว ได้ Help file อัตโนมัติ</td>
</tr>
<tr class="odd">
<td><strong>AI Assistant</strong></td>
<td>ช่วยร่าง docs &amp; tests</td>
<td>เพิ่มความเร็วในการพัฒนา</td>
</tr>
</tbody>
</table>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้ง pak ก่อนเป็นอันดับแรก</span></span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pak"</span>)</span>
<span id="cb1-3"></span>
<span id="cb1-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># จากนั้นใช้ pak ติดตั้งทุกอย่างพร้อมกัน (เร็วมาก)</span></span>
<span id="cb1-5">pak<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pkg_install</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"devtools"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"usethis"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"testthat"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"roxygen2"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"quarto"</span>))</span></code></pre></div></div>
<hr>
</section>
<section id="ตงคา-.rprofile-เพอความสะดวกสงสด" class="level2">
<h2 class="anchored" data-anchor-id="ตงคา-.rprofile-เพอความสะดวกสงสด">⚙️ 0.5 ตั้งค่า <code>.Rprofile</code> เพื่อความสะดวกสูงสุด</h2>
<p>เพื่อให้ R <strong>โหลดเครื่องมือพัฒนาโดยอัตโนมัติทุกครั้งที่เปิดโปรเจกต์</strong> ให้ตั้งค่า <code>.Rprofile</code> ไว้ล่วงหน้าสักครั้ง แล้วจะไม่ต้องรัน <code>library(devtools)</code> เองอีกเลย</p>
<p><strong>เปิดไฟล์ตั้งค่า:</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">edit_r_profile</span>()</span></code></pre></div></div>
<p><strong>เพิ่ม Code นี้ลงไป:</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">interactive</span>()) {</span>
<span id="cb3-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">suppressMessages</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(devtools))</span>
<span id="cb3-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">suppressMessages</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(usethis))</span>
<span id="cb3-4">}</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>ทำไมต้องเช็ค interactive()?
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>เงื่อนไข <code>if (interactive())</code> ป้องกันไม่ให้ <code>devtools</code> และ <code>usethis</code> ถูกโหลดเมื่อ R รันแบบอัตโนมัติ (เช่น ใน GitHub Actions หรือ Rscript จาก Terminal) ซึ่งเป็น Best practice สำคัญ — Package เหล่านี้ควรโหลดเฉพาะในเซสชัน interactive ของนักพัฒนาเท่านั้น ไม่ควรรันในสภาพแวดล้อม production</p>
</div>
</div>
</div>
<p><strong>ผลที่ได้:</strong> คุณสามารถใช้คีย์ลัดอย่าง <code>Ctrl + Shift + L</code> ได้ทันทีทุกครั้งที่เปิด RStudio หรือ Positron โดยไม่ต้องรัน <code>library()</code> เองก่อน</p>
<hr>
</section>
<section id="กอสรางโครงสรางพนฐาน-setup" class="level2">
<h2 class="anchored" data-anchor-id="กอสรางโครงสรางพนฐาน-setup">🏗️ 1. ก่อสร้างโครงสร้างพื้นฐาน (Setup)</h2>
<section id="สราง-package-ใหม" class="level3">
<h3 class="anchored" data-anchor-id="สราง-package-ใหม">สร้าง Package ใหม่</h3>
<p>คำสั่งเดียวจบ — <code>usethis</code> จะสร้างโฟลเดอร์และไฟล์พื้นฐานทั้งหมดให้อัตโนมัติ:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">create_package</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"path/to/YourPackageName"</span>)</span></code></pre></div></div>
<p>หลังรันคำสั่งนี้ คุณจะได้โครงสร้างเริ่มต้นแบบนี้:</p>
<pre><code>YourPackageName/
├── DESCRIPTION      # ข้อมูล Package (ชื่อ, เวอร์ชัน, Dependencies)
├── NAMESPACE        # ควบคุมว่าฟังก์ชันไหนเป็น Public/Private
├── R/               # 📁 โฟลเดอร์สำหรับวางโค้ด R ทุกไฟล์
└── YourPackageName.Rproj</code></pre>
</section>
<section id="เชอมตอกบ-git-github" class="level3">
<h3 class="anchored" data-anchor-id="เชอมตอกบ-git-github">เชื่อมต่อกับ Git &amp; GitHub</h3>
<p>ในปี 2026 เราไม่แค่ใช้ Git แต่เราตั้ง CI/CD ให้ทำงานอัตโนมัติทันทีตั้งแต่วันแรก:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_git</span>()                              <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เริ่มต้น Git repository</span></span>
<span id="cb6-2">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_github</span>()                           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Push ขึ้น GitHub</span></span>
<span id="cb6-3">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_github_action_check_standard</span>()    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ตั้ง CI: ตรวจโค้ดอัตโนมัติทุกครั้งที่ Push</span></span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-3-contents" aria-controls="callout-3" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>GitHub Actions คืออะไร?
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-3" class="callout-3-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>GitHub Actions จะรัน <code>R CMD check</code> บนเซิร์ฟเวอร์ของ GitHub ทุกครั้งที่คุณ Push โค้ดขึ้นไป ช่วยให้คุณรู้ทันทีว่าโค้ดของคุณผ่านมาตรฐาน CRAN หรือไม่ โดยไม่ต้องรอทดสอบเองบนเครื่อง</p>
</div>
</div>
</div>
</section>
<section id="ใสใบอนญาต-license" class="level3">
<h3 class="anchored" data-anchor-id="ใสใบอนญาต-license">ใส่ใบอนุญาต (License)</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb7-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_mit_license</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Your Name"</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># MIT เป็น License ที่นิยมมากสำหรับ Open-source</span></span></code></pre></div></div>
<hr>
</section>
</section>
<section id="วงจรการพฒนา-the-modern-dev-loop" class="level2">
<h2 class="anchored" data-anchor-id="วงจรการพฒนา-the-modern-dev-loop">🔄 2. วงจรการพัฒนา (The Modern Dev Loop)</h2>
<p>หัวใจสำคัญของการพัฒนา R Package คือ <strong>“The Golden Cycle”</strong> ซึ่งในปี 2026 ทำได้ลื่นไหลและเร็วขึ้น:</p>
<pre><code>Edit code → Load All → Test in Console → Repeat</code></pre>
<section id="ขนตอนท-1-สรางฟงกชนใหม" class="level3">
<h3 class="anchored" data-anchor-id="ขนตอนท-1-สรางฟงกชนใหม">ขั้นตอนที่ 1: สร้างฟังก์ชันใหม่</h3>
<p>ใช้ <code>usethis</code> สร้างไฟล์ใน <code>R/</code> โฟลเดอร์ให้อัตโนมัติ (พร้อมตั้งชื่อไฟล์ให้ถูกต้อง):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb9-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_r</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"my_cool_function"</span>)</span></code></pre></div></div>
</section>
<section id="ขนตอนท-2-โหลดโคดเพอทดสอบ-load_all" class="level3">
<h3 class="anchored" data-anchor-id="ขนตอนท-2-โหลดโคดเพอทดสอบ-load_all">ขั้นตอนที่ 2: โหลดโค้ดเพื่อทดสอบ (<code>load_all</code>)</h3>
<p>นี่คือคำสั่งที่คุณจะใช้บ่อยที่สุดตลอดการพัฒนา มันจำลองการ <code>library()</code> ทั้ง Package แต่จากโค้ดในเครื่องของคุณโดยตรง:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1">devtools<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">load_all</span>()</span>
<span id="cb10-2"></span>
<span id="cb10-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># หรือใช้ Shortcut ที่เร็วกว่า:</span></span>
<span id="cb10-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Windows: Ctrl + Shift + L</span></span>
<span id="cb10-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Mac:     Cmd  + Shift + L</span></span></code></pre></div></div>
<p>ใน 2026 <code>load_all()</code> ทำงานได้ฉลาดขึ้น — มันจะ “Incremental load” คือโหลดเฉพาะส่วนที่เปลี่ยนแปลงไป ไม่โหลดซ้ำทั้งหมด ทำให้เร็วขึ้นมากสำหรับ Package ขนาดใหญ่</p>
<hr>
</section>
</section>
<section id="การทำคมอ-ai-assisted-documentation" class="level2">
<h2 class="anchored" data-anchor-id="การทำคมอ-ai-assisted-documentation">📝 3. การทำคู่มือ (AI-Assisted Documentation)</h2>
<p>เรายังคงใช้ <strong>Roxygen2</strong> เป็น standard แต่ในปี 2026 AI ช่วยร่างได้เบื้องต้น เหลือแค่ให้เราตรวจสอบและเติมรายละเอียดสำคัญ</p>
<section id="โครงสราง-roxygen2-ของฟงกชน" class="level3">
<h3 class="anchored" data-anchor-id="โครงสราง-roxygen2-ของฟงกชน">โครงสร้าง Roxygen2 ของฟังก์ชัน</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb11-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' คำนวณค่าเฉลี่ยรายวัน</span></span>
<span id="cb11-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#'</span></span>
<span id="cb11-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' ฟังก์ชันนี้รับ Vector ตัวเลขและคืนค่าเฉลี่ย โดยสามารถเลือก</span></span>
<span id="cb11-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' กำจัด NA ออกก่อนคำนวณได้</span></span>
<span id="cb11-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#'</span></span>
<span id="cb11-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param x Numeric vector ที่ต้องการคำนวณ</span></span>
<span id="cb11-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param na.rm Logical ถ้าเป็น TRUE (ค่าเริ่มต้น) จะกำจัด NA ก่อนคำนวณ</span></span>
<span id="cb11-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#'</span></span>
<span id="cb11-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @return ค่าเฉลี่ยของ Vector ที่รับเข้ามา (Numeric scalar)</span></span>
<span id="cb11-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#'</span></span>
<span id="cb11-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @export</span></span>
<span id="cb11-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#'</span></span>
<span id="cb11-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @examples</span></span>
<span id="cb11-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' daily_mean(c(10, 20, 30))</span></span>
<span id="cb11-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' daily_mean(c(10, NA, 30), na.rm = TRUE)</span></span>
<span id="cb11-16">daily_mean <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>) {</span>
<span id="cb11-17">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mean</span>(x, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> na.rm)</span>
<span id="cb11-18">}</span></code></pre></div></div>
<p>Tags ที่สำคัญต้องรู้:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Tag</th>
<th>ความหมาย</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>@param</code></td>
<td>อธิบาย argument แต่ละตัว</td>
</tr>
<tr class="even">
<td><code>@return</code></td>
<td>อธิบายสิ่งที่ฟังก์ชันส่งกลับ</td>
</tr>
<tr class="odd">
<td><code>@export</code></td>
<td>ทำให้ผู้ใช้เรียกฟังก์ชันนี้ได้จากภายนอก</td>
</tr>
<tr class="even">
<td><code>@examples</code></td>
<td>ใส่โค้ดตัวอย่าง — <strong>สำคัญมาก</strong> ถ้าส่ง CRAN</td>
</tr>
<tr class="odd">
<td><code>@import</code></td>
<td>ระบุ Package อื่นที่ฟังก์ชันนี้ต้องการทั้ง Package</td>
</tr>
<tr class="even">
<td><code>@importFrom</code></td>
<td>ระบุเฉพาะฟังก์ชันที่ต้องการจาก Package อื่น</td>
</tr>
</tbody>
</table>
</section>
<section id="สรางไฟล-help-.rd-files" class="level3">
<h3 class="anchored" data-anchor-id="สรางไฟล-help-.rd-files">สร้างไฟล์ Help (<code>.Rd</code> files)</h3>
<p>หลังเขียน Roxygen comment แล้ว รันคำสั่งนี้เพื่อสร้างไฟล์ Help จริงๆ:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1">devtools<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">document</span>()</span>
<span id="cb12-2"></span>
<span id="cb12-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Shortcut: Ctrl + Shift + D (Windows) / Cmd + Shift + D (Mac)</span></span></code></pre></div></div>
<hr>
</section>
</section>
<section id="การจดการ-dependencies-fast-path" class="level2">
<h2 class="anchored" data-anchor-id="การจดการ-dependencies-fast-path">📦 4. การจัดการ Dependencies (Fast Path)</h2>
<section id="กฎทองทตองจำ-หามใช-library-ในโคด-package-เดดขาด" class="level3">
<h3 class="anchored" data-anchor-id="กฎทองทตองจำ-หามใช-library-ในโคด-package-เดดขาด">กฎทองที่ต้องจำ: ห้ามใช้ <code>library()</code> ในโค้ด Package เด็ดขาด!</h3>
<p>เหตุผลที่ห้ามใช้ <code>library()</code> ในโค้ดของ Package คือมันจะ <strong>บังคับโหลด Package เข้า Search path ของผู้ใช้</strong> ซึ่งอาจทับฟังก์ชันชื่อเดียวกันที่ผู้ใช้กำลังใช้งานอยู่ได้</p>
<p><strong>วิธีที่ถูกต้อง:</strong></p>
<p><strong>ขั้นตอนที่ 1:</strong> ลงทะเบียน Dependency ใน <code>DESCRIPTION</code> file</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb13-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ลงทะเบียนว่า Package ของคุณต้องการ dplyr</span></span>
<span id="cb13-2">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_package</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dplyr"</span>)</span></code></pre></div></div>
<p><strong>ขั้นตอนที่ 2:</strong> เรียกใช้ฟังก์ชันด้วยการระบุ Namespace ชัดเจน</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb14-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ✅ วิธีที่ถูกต้อง — ระบุ Package ที่มาอย่างชัดเจน</span></span>
<span id="cb14-2">my_function <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(df) {</span>
<span id="cb14-3">  dplyr<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(df, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">new_col =</span> value <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb14-4">}</span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>💡 Tip: ใช้ <code>use_import_from</code> เพื่อความเร็ว
</div>
</div>
<div class="callout-body-container callout-body">
<p>หากคุณเรียกใช้ฟังก์ชันเดิมซ้ำๆ หลายร้อยครั้งในโค้ด สามารถ import เข้ามาตรงๆ เพื่อเพิ่มความเร็วและลดการพิมพ์ได้:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb15-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_import_from</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dplyr"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mutate"</span>)</span></code></pre></div></div>
<p>การทำแบบนี้จะเพิ่ม <code>@importFrom dplyr mutate</code> เข้า NAMESPACE ซึ่งถือว่าเป็น Best practice สำหรับฟังก์ชันที่ใช้บ่อยมากๆ ครับ</p>
</div>
</div>
<hr>
</section>
</section>
<section id="การตรวจสอบคณภาพ-the-final-boss" class="level2">
<h2 class="anchored" data-anchor-id="การตรวจสอบคณภาพ-the-final-boss">✅ 5. การตรวจสอบคุณภาพ (The Final Boss)</h2>
<section id="เขยน-unit-test-ยคใหม" class="level3">
<h3 class="anchored" data-anchor-id="เขยน-unit-test-ยคใหม">เขียน Unit Test (ยุคใหม่)</h3>
<p>ปี 2026 เน้น <strong>Test-Driven Development (TDD)</strong> — หมายความว่าเขียน Test ก่อน แล้วค่อยเขียน Code ให้ผ่าน Test</p>
<p><strong>ขั้นตอนที่ 1:</strong> สร้างไฟล์ Test</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb16-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_test</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"my_cool_function"</span>)</span>
<span id="cb16-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># จะสร้างไฟล์ tests/testthat/test-my_cool_function.R</span></span></code></pre></div></div>
<p><strong>ขั้นตอนที่ 2:</strong> เขียน Test ด้วย <code>testthat</code></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb17-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ไฟล์: tests/testthat/test-daily_mean.R</span></span>
<span id="cb17-2"></span>
<span id="cb17-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">test_that</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"daily_mean คำนวณค่าเฉลี่ยได้ถูกต้อง"</span>, {</span>
<span id="cb17-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expect_equal</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">daily_mean</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>)), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)</span>
<span id="cb17-5">})</span>
<span id="cb17-6"></span>
<span id="cb17-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">test_that</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"daily_mean จัดการ NA ได้"</span>, {</span>
<span id="cb17-8">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expect_equal</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">daily_mean</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)</span>
<span id="cb17-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expect_true</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">daily_mean</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)))</span>
<span id="cb17-10">})</span>
<span id="cb17-11"></span>
<span id="cb17-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">test_that</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"daily_mean รับได้เฉพาะตัวเลข"</span>, {</span>
<span id="cb17-13">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expect_error</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">daily_mean</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ข้อความ"</span>))</span>
<span id="cb17-14">})</span></code></pre></div></div>
<p><strong>ขั้นตอนที่ 3:</strong> รัน Test ทั้งหมด</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb18-1">devtools<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">test</span>()</span>
<span id="cb18-2"></span>
<span id="cb18-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Shortcut: Ctrl + Shift + T (Windows) / Cmd + Shift + T (Mac)</span></span></code></pre></div></div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>ใช้ AI ช่วยหา Edge Case
</div>
</div>
<div class="callout-body-container callout-body">
<p>วิธีง่ายๆ คือวางโค้ดฟังก์ชันของคุณให้ AI แล้วถามว่า <em>“ช่วยหา Edge cases และเขียน testthat tests ให้หน่อยได้ไหม?”</em> AI มักจะนึกถึงกรณีที่เรามักมองข้ามได้ดี เช่น ค่าว่าง (<code>NULL</code>), vector ความยาวเป็น 0, หรือค่าติดลบ</p>
</div>
</div>
</section>
<section id="การตรวจสอบสดทาย-the-full-check" class="level3">
<h3 class="anchored" data-anchor-id="การตรวจสอบสดทาย-the-full-check">การตรวจสอบสุดท้าย (The Full Check)</h3>
<p>นี่คือขั้นตอนสำคัญที่สุดก่อน Release — <code>devtools::check()</code> จะรันกระบวนการทดสอบทั้งหมด (<code>R CMD check</code>) เหมือนกับที่ CRAN ใช้จริงๆ:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb19" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb19-1">devtools<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check</span>()</span>
<span id="cb19-2"></span>
<span id="cb19-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Shortcut: Ctrl + Shift + E (Windows) / Cmd + Shift + E (Mac)</span></span></code></pre></div></div>
<p><strong>เป้าหมาย:</strong> ต้องให้ได้ผลลัพธ์นี้ก่อนปล่อย Version ใหม่ทุกครั้ง:</p>
<pre><code>── R CMD check results ─────────────────────────────────
Duration: 23.4s

0 errors ✔ | 0 warnings ✔ | 0 notes ✔

R CMD check succeeded</code></pre>
<p>ปัญหาที่พบอยู่จากประสบการณ์ เมื่อมีการติดตั้งหรือมีภาษาไทย ใน package และ เมื่อ upload แล้ว</p>
<pre><code>.github/workflows/R-CMD-check.yaml</code></pre>
<p>จะเป็นการ R CMD check ในระบบ CI/CD ของ GitHub ซึ่งจะช่วยให้เราสามารถตรวจสอบ package ของเราได้ว่ามีปัญหาอะไรบ้าง</p>
<ul>
<li>ERROR: Examples รันพลาด (Missing value where TRUE/FALSE needed) สาเหตุ: * โค้ดพังตอนดึง API หน้า 2: ในตัวอย่างการใช้งานฟังก์ชัน <code>get_production_index_month()</code> ระบบพยายามดึงข้อมูลหน้าที่ 2 แต่ฝั่ง API น่าจะส่งข้อมูลกลับมาผิดปกติ (หรือว่างเปล่า) ทำให้ตัวแปรที่เช็คในเงื่อนไข if กลายเป็นค่า NA (R เลยฟ้องว่าต้องการค่า TRUE/FALSE แต่ดันได้ค่า NA หรือ missing value แทน)</li>
<li>รันนานเกินไป (Elapsed time &gt; 5s): ใน Log แจ้งเตือนเรื่องเวลาด้วยครับว่าตัวอย่าง <code>get_daily_prices</code> ใช้เวลารันไป 11.11 วินาที ซึ่งตามกฎของ R CMD check (และ CRAN) โค้ดตัวอย่างห้ามใช้เวลารันเกิน 5 วินาทีครับ</li>
</ul>
<p>วิธีแก้สำหรับการทำ Package ให้ผ่าน: แนะนำให้เอา ไปครอบตัวอย่างของฟังก์ชัน <code>get_production_index_month()</code> และ ทุกฟังก์ชันที่มีการเรียกใช้ API จริงๆ เพื่อไม่ให้ระบบต้องมารอโหลด API ตอนตรวจแพ็กเกจครับ</p>
<pre><code>#' @examples
#' \donttest{
#' get_production_index_month(year_th = 2568, month = 12)
#' }</code></pre>
<ul>
<li>ซ่อนโฟลเดอร์ เมื่อระบบเจอ โฟลเดอร์ซ่อน เช่น <code>.claude.md</code> (ซึ่งน่าจะเป็นโฟลเดอร์คอนฟิกหรือแชทชั่วคราวของ AI ที่คุณใช้) ปะปนอยู่ในโปรเจค ซึ่งตามกฎแล้วไฟล์พวกนี้ห้ามแพ็กรวมเข้าไปในไฟล์ติดตั้งของ R Package ครับ</li>
</ul>
<p>วิธีแก้: เราต้องบอกระบบว่าให้ข้ามโฟลเดอร์นี้ไปตอนสร้างแพ็กเกจ พิมพ์คำสั่งนี้ใน R Console ได้เลยครับ:</p>
<pre><code>usethis::use_build_ignore(".claude")</code></pre>
</section>
</section>
<section id="คำสงนจะไปเตมชอโฟลเดอรลงในไฟล-.rbuildignore-ใหอตโนมตครบ" class="level2">
<h2 class="anchored" data-anchor-id="คำสงนจะไปเตมชอโฟลเดอรลงในไฟล-.rbuildignore-ใหอตโนมตครบ">(คำสั่งนี้จะไปเติมชื่อโฟลเดอร์ลงในไฟล์ .Rbuildignore ให้อัตโนมัติครับ)</h2>
</section>
<section id="readme-และ-vignettes-ดวย-quarto" class="level2">
<h2 class="anchored" data-anchor-id="readme-และ-vignettes-ดวย-quarto">📄 6. README และ Vignettes ด้วย Quarto</h2>
<p>ในปี 2026 <strong>Quarto (<code>.qmd</code>)</strong> ได้เข้ามาแทนที่ R Markdown อย่างเต็มตัวใน Workflow การพัฒนา Package:</p>
<section id="สราง-readme" class="level3">
<h3 class="anchored" data-anchor-id="สราง-readme">สร้าง README</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb24" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb24-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สร้าง README.qmd (แนะนำ) หรือ README.Rmd แบบเก่า</span></span>
<span id="cb24-2">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_readme_qmd</span>()</span></code></pre></div></div>
<p>README ที่ดีควรมีส่วนเหล่านี้: - <strong>ชื่อ Package + คำอธิบายสั้นๆ</strong> ว่า Package ทำอะไร - <strong>Installation instructions</strong> (ทั้ง CRAN และ GitHub version) - <strong>Quick Start Example</strong> — ตัวอย่างใช้งานพื้นฐาน 10 บรรทัด - <strong>Badge</strong> สถานะ CI จาก GitHub Actions แสดงผล pass/fail อัตโนมัติ</p>
</section>
<section id="สราง-vignette-คมอเจาะลก" class="level3">
<h3 class="anchored" data-anchor-id="สราง-vignette-คมอเจาะลก">สร้าง Vignette (คู่มือเจาะลึก)</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb25" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb25-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_vignette</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"getting-started"</span>)</span>
<span id="cb25-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># จะสร้างไฟล์ vignettes/getting-started.qmd</span></span></code></pre></div></div>
<p>Quarto มีข้อดีสำคัญเหนือ R Markdown สำหรับ Package documentation: - รองรับทั้ง <strong>R และ Python</strong> ในเอกสารเดียวกันได้ - Export ได้หลากหลายรูปแบบ: HTML, PDF, Word, Presentation - ทำงานร่วมกับ <strong>Positron</strong> ได้ดีกว่า</p>
<hr>
</section>
</section>
<section id="สรางเวบ-documentation-ดวย-pkgdown" class="level2">
<h2 class="anchored" data-anchor-id="สรางเวบ-documentation-ดวย-pkgdown">🌐 8. สร้างเว็บ Documentation ด้วย pkgdown</h2>
<p>ในปี 2026 <strong>ไม่ให้ Package ใดไม่มี Documentation Website</strong> <code>pkgdown</code> คือเครื่องมือมาตรฐานที่จะแปลง Roxygen comments, Vignettes และ README ของคุณให้กลายเป็นเว็บไซต์ที่สวยงาม เหมือนที่คุณเห็นใน Package ชั้นนำทุกตัวบน CRAN</p>
<section id="ทำไมตอง-pkgdown" class="level3">
<h3 class="anchored" data-anchor-id="ทำไมตอง-pkgdown">ทำไมต้อง pkgdown?</h3>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>ประเด็น</th>
<th>ไม่มี pkgdown</th>
<th>มี pkgdown</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>การค้นหา</strong></td>
<td>ผู้ใช้ต้องรัน <code>?function()</code> บน R</td>
<td>Google แล้วเจอหน้าเว็บสวยๆ ทันที</td>
</tr>
<tr class="even">
<td><strong>ภาพรวม</strong></td>
<td>ต้องดีบักไฟล์ <code>.Rd</code> ที่ยาก</td>
<td>มี Function reference แบบค้นหาได้</td>
</tr>
<tr class="odd">
<td><strong>Tutorial</strong></td>
<td>Vignettes แยกกระจัดกระจาย</td>
<td>รวมหน้าเว็บเดียวจบ พร้อม Navbar</td>
</tr>
<tr class="even">
<td><strong>บำรุงรักษา</strong></td>
<td>ผู้ใช้ดู Help ยาก</td>
<td>Link มาจาก CRAN/GitHub อัตโนมัติ</td>
</tr>
</tbody>
</table>
</section>
<section id="ตดตงและตงคาพนฐาน" class="level3">
<h3 class="anchored" data-anchor-id="ตดตงและตงคาพนฐาน">ติดตั้งและตั้งค่าพื้นฐาน</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb26" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb26-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้ง pkgdown</span></span>
<span id="cb26-2">pak<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pkg_install</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pkgdown"</span>)</span>
<span id="cb26-3"></span>
<span id="cb26-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สร้างไฟล์ตั้งค่าพื้นฐาน</span></span>
<span id="cb26-5">pkgdown<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">init</span>()</span></code></pre></div></div>
<p>คำสั่ง <code>pkgdown::init()</code> จะสร้างไฟล์ <code>_pkgdown.yml</code> ให้คุณ:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb27" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb27-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">url</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> https://yourusername.github.io/YourPackageName</span></span>
<span id="cb27-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">title</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> YourPackageName</span></span>
<span id="cb27-3"></span>
<span id="cb27-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">template</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb27-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bootstrap</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span></span>
<span id="cb27-6"></span>
<span id="cb27-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">reference</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb27-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">title</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ฟังก์ชันหลัก"</span></span>
<span id="cb27-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">contents</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb27-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> daily_mean</span></span>
<span id="cb27-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> my_cool_function</span></span>
<span id="cb27-12"></span>
<span id="cb27-13"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">articles</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb27-14"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">title</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"คู่มือ"</span></span>
<span id="cb27-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">contents</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb27-16"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> getting-started</span></span></code></pre></div></div>
</section>
<section id="build-เวบทดสอบ" class="level3">
<h3 class="anchored" data-anchor-id="build-เวบทดสอบ">Build เว็บทดสอบ</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb28" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb28-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Build และ Preview เว็บบนเครื่อง</span></span>
<span id="cb28-2">pkgdown<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">build_site</span>()</span></code></pre></div></div>
<p>หลังจาก Build คุณจะได้โฟลเดอร์ <code>docs/</code> ซึ่งเป็นไฟล์ HTML ทั้งหมด สามารถเปิดดูได้ทันที</p>
</section>
<section id="deploy-อตโนมตไป-github-pages" class="level3">
<h3 class="anchored" data-anchor-id="deploy-อตโนมตไป-github-pages">Deploy อัตโนมัติไป GitHub Pages</h3>
<p>วิธีที่ง่ายที่สุดคือใช้ GitHub Actions — push ครั้งเดียว เว็บ Deploy เอง:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb29" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb29-1">usethis<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">use_pkgdown_github_pages</span>()</span></code></pre></div></div>
<p>คำสั่งนี้จะ: 1. สร้าง workflow ใน <code>.github/workflows/pkgdown.yaml</code> 2. Set up GitHub Pages ให้ point ไปที่ <code>gh-pages</code> branch 3. Deploy อัตโนมัติทุกครั้งที่คุณ push ไป branch <code>main</code> หรือ <code>master</code></p>
</section>
<section id="custom-theme-ใหเวบสวยขน" class="level3">
<h3 class="anchored" data-anchor-id="custom-theme-ใหเวบสวยขน">Custom Theme ให้เว็บสวยขึ้น</h3>
<p>ปี 2026 มี Theme Template สวยๆ ให้เลือกเยอะครับ แก้ใน <code>_pkgdown.yml</code>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb30" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb30-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">template</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb30-2"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bootstrap</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span></span>
<span id="cb30-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bootswatch</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> flatly</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    # เลือก theme: cerulean, cosmo, flatly, journal, และอื่นๆ</span></span>
<span id="cb30-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bslib</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb30-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pkgdown-nav-height</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> 70px</span></span>
<span id="cb30-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">primary</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#2c3e50"</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">   # เปลี่ยนสีหลักตาม Brand ของคุณ</span></span></code></pre></div></div>
</section>
<section id="เพม-search-functionality" class="level3">
<h3 class="anchored" data-anchor-id="เพม-search-functionality">เพิ่ม Search Functionality</h3>
<p>เว็บ pkgdown มี search engine ในตัว (ใช้ lunr.js) ทำให้ผู้ใช้ค้นหาฟังก์ชันได้ทันที ไม่ต้อง browse ทีละหน้า</p>
</section>
<section id="เพม-logo-และ-favicon" class="level3">
<h3 class="anchored" data-anchor-id="เพม-logo-และ-favicon">เพิ่ม Logo และ Favicon</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb31" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb31-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">home</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb31-2"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">title</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"YourPackageName"</span></span>
<span id="cb31-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">  description</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">: </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">|</span></span>
<span id="cb31-4">    คำอธิบายสั้นๆ ว่า Package นี้ทำอะไร</span>
<span id="cb31-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">strip_header</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">true</span></span>
<span id="cb31-6"></span>
<span id="cb31-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">template</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb31-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">logo</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> path/to/logo.png</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    # รูป logo (แนะนำ 200x200px)</span></span>
<span id="cb31-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">favicon</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> path/to/favicon.ico</span></span></code></pre></div></div>
</section>
<section id="ประโยชนเพมเตมของ-pkgdown" class="level3">
<h3 class="anchored" data-anchor-id="ประโยชนเพมเตมของ-pkgdown">ประโยชน์เพิ่มเติมของ pkgdown</h3>
<ul>
<li><strong>Auto-linking</strong>: เวลาคุณเขียน <code>daily_mean()</code> ใน Quarto/Vignette pkgdown จะ link ไปหน้าฟังก์ชันให้อัตโนมัติ</li>
<li><strong>Versioning</strong>: หากคุณมีหลาย version ของ Package บน CRAN, pkgdown สามารถแสดง docs ของแต่ละ version ได้</li>
<li><strong>Search Engine Optimization (SEO)</strong>: เว็บ pkgdown ได้รับการ optimize ให้ค้นหาได้ง่ายบน Google</li>
</ul>
<hr>
</section>
</section>
<section id="สรปคยลด-2026-quick-reference" class="level2">
<h2 class="anchored" data-anchor-id="สรปคยลด-2026-quick-reference">🚀 9. สรุปคีย์ลัด (2026 Quick Reference)</h2>
<p>เก็บตารางนี้ไว้เป็น Cheat Sheet ในการพัฒนา:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>งานที่ต้องทำ</th>
<th>Shortcut (Windows)</th>
<th>Shortcut (Mac)</th>
<th>คำสั่ง R</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>โหลดโค้ดใหม่</td>
<td><code>Ctrl + Shift + L</code></td>
<td><code>Cmd + Shift + L</code></td>
<td><code>devtools::load_all()</code></td>
</tr>
<tr class="even">
<td>อัปเดตคู่มือ</td>
<td><code>Ctrl + Shift + D</code></td>
<td><code>Cmd + Shift + D</code></td>
<td><code>devtools::document()</code></td>
</tr>
<tr class="odd">
<td>รัน Tests</td>
<td><code>Ctrl + Shift + T</code></td>
<td><code>Cmd + Shift + T</code></td>
<td><code>devtools::test()</code></td>
</tr>
<tr class="even">
<td>Check มาตรฐาน</td>
<td><code>Ctrl + Shift + E</code></td>
<td><code>Cmd + Shift + E</code></td>
<td><code>devtools::check()</code></td>
</tr>
<tr class="odd">
<td>Build &amp; Install</td>
<td><code>Ctrl + Shift + B</code></td>
<td><code>Cmd + Shift + B</code></td>
<td><code>devtools::install()</code></td>
</tr>
</tbody>
</table>
<hr>
</section>
<section id="สรปภาพรวม-workflow" class="level2">
<h2 class="anchored" data-anchor-id="สรปภาพรวม-workflow">🗺️ สรุปภาพรวม Workflow</h2>
<pre><code>usethis::create_package()       # 1. สร้าง Package
    ↓
usethis::use_git() + use_github() # 2. เชื่อม Git &amp; GitHub
    ↓
usethis::use_r("func_name")     # 3. สร้างไฟล์ฟังก์ชัน
    ↓
devtools::load_all()  ←──────── # 4. (วนซ้ำ) โหลด → แก้ไข → โหลด
    ↓
roxygen2 + devtools::document() # 5. เขียนและสร้างคู่มือ
    ↓
usethis::use_test() + devtools::test() # 6. เขียนและรัน Tests
    ↓
devtools::check()               # 7. Check ก่อน Release
    ↓
devtools::install() / pak::pkg_install() # 8. ติดตั้งใช้งานจริง
    ↓
pkgdown::build_site()           # 9. Build เว็บ documentation (เสร็จแล้ว Deploy อัตโนมัติ)</code></pre>
<hr>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-6-contents" aria-controls="callout-6" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>อ้างอิง
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-6" class="callout-6-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<ul>
<li><a href="https://www.youtube.com/@Riffomonas">Riffomonas Project</a> — วิดีโอสอนสร้าง R Package โดย Pat Schloss</li>
<li><a href="https://r-pkgs.org/">R Packages (2e)</a> — หนังสืออ้างอิงหลักโดย Hadley Wickham &amp; Jenny Bryan</li>
<li><a href="https://pak.r-lib.org/">pak documentation</a> — Package manager ยุคใหม่</li>
<li><a href="https://quarto.org/">Quarto Documentation</a> — ระบบเอกสาร Next-gen</li>
<li><a href="https://usethis.r-lib.org/">usethis documentation</a> — เครื่องมือ Workflow automation</li>
<li><a href="https://pkgdown.r-lib.org/">pkgdown documentation</a> — สร้างเว็บ documentation ให้ Package</li>
</ul>
</div>
</div>
</div>


</section>
</section>

 ]]></description>
  <category>R</category>
  <category>R Package</category>
  <guid>https://kanthanawit.in.th/writing/r-package-dev-2026/</guid>
  <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/r-package-dev-2026.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>ดึงข้อมูลสภาพอากาศ ไม่ต้องง้อ API Key</title>
  <link>https://kanthanawit.in.th/writing/get-weather-data/</link>
  <description><![CDATA[ 




<section id="การใชขอมลสภาพอากาศ-weather-data-ปญหาคลาสสกทหลายคนเจอคอ-ตองสมคร-api-key-หรอ-โดนจำกดโควตาการดงขอมล-แต-เราสามารถดงขอมลอณหภมและความชนรายชวโมงได-ฟร-และไมตองใช-api-key-แถมยงครอบคลมทกพนทในประเทศไทย-ไมวาจะเปนยอดดอย-สนามบน-หรอกลางทงนา-วนนผมรวม-4-แหลงขอมลเดดๆ-พรอม-r-code" class="level2">
<h2 class="anchored" data-anchor-id="การใชขอมลสภาพอากาศ-weather-data-ปญหาคลาสสกทหลายคนเจอคอ-ตองสมคร-api-key-หรอ-โดนจำกดโควตาการดงขอมล-แต-เราสามารถดงขอมลอณหภมและความชนรายชวโมงได-ฟร-และไมตองใช-api-key-แถมยงครอบคลมทกพนทในประเทศไทย-ไมวาจะเปนยอดดอย-สนามบน-หรอกลางทงนา-วนนผมรวม-4-แหลงขอมลเดดๆ-พรอม-r-code">การใช้ข้อมูลสภาพอากาศ (Weather Data) ปัญหาคลาสสิกที่หลายคนเจอคือ “ต้องสมัคร API Key” หรือ “โดนจำกัดโควต้าการดึงข้อมูล” แต่ เราสามารถดึงข้อมูลอุณหภูมิและความชื้นรายชั่วโมงได้ <strong>ฟรี และไม่ต้องใช้ API Key</strong> แถมยังครอบคลุมทุกพื้นที่ในประเทศไทย ไม่ว่าจะเป็นยอดดอย สนามบิน หรือกลางทุ่งนา! วันนี้ผมรวม 4 แหล่งข้อมูลเด็ดๆ พร้อม R Code</h2>
</section>
<section id="open-meteo-งายทสด-ยดหยนทสด" class="level2">
<h2 class="anchored" data-anchor-id="open-meteo-งายทสด-ยดหยนทสด">1. Open-Meteo (ง่ายที่สุด ยืดหยุ่นที่สุด)</h2>
<p>Open-Meteo เป็น API ที่เปิดให้ใช้ฟรี แค่ระบุพิกัด Latitude/Longitude ก็ดึงข้อมูลสภาพอากาศทั้งอดีตและพยากรณ์ล่วงหน้าได้เลย ข้อดีคือใช้แค่แพ็กเกจ <code>jsonlite</code> ตัวเดียว</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแพ็กเกจ: install.packages("jsonlite")</span></span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(jsonlite)</span>
<span id="cb1-3"></span>
<span id="cb1-4">get_hourly_weather <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(lat, lon, start_date, end_date) {</span>
<span id="cb1-5">  base_url <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://api.open-meteo.com/v1/forecast"</span></span>
<span id="cb1-6">  params <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(</span>
<span id="cb1-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?latitude="</span>, lat, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;longitude="</span>, lon,</span>
<span id="cb1-8">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;start_date="</span>, start_date, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;end_date="</span>, end_date,</span>
<span id="cb1-9">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;hourly=temperature_2m,relative_humidity_2m&amp;timezone=auto"</span></span>
<span id="cb1-10">  )</span>
<span id="cb1-11">  </span>
<span id="cb1-12">  weather_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fromJSON</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(base_url, params))</span>
<span id="cb1-13">  </span>
<span id="cb1-14">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb1-15">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">datetime =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.POSIXct</span>(weather_data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>time, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">format=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y-%m-%dT%H:%M"</span>),</span>
<span id="cb1-16">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">temperature_c =</span> weather_data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>temperature_2m,</span>
<span id="cb1-17">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">humidity_percent =</span> weather_data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>relative_humidity_2m</span>
<span id="cb1-18">  )</span>
<span id="cb1-19">}</span>
<span id="cb1-20"></span>
<span id="cb1-21"><span class="do" style="color: #5E5E5E;
background-color: null;
font-style: italic;">## ตัวอย่างการดึงข้อมูลพิกัดกรุงเทพฯ</span></span>
<span id="cb1-22">bkk_weather <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">get_hourly_weather</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">13.7563</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">100.5018</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-03-01"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-03-07"</span>)</span>
<span id="cb1-23"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(bkk_weather)</span></code></pre></div></div>
</section>
<section id="nasa-power-ขอมลดาวเทยมระดบโลก" class="level2">
<h2 class="anchored" data-anchor-id="nasa-power-ขอมลดาวเทยมระดบโลก">2. NASA POWER (ข้อมูลดาวเทียมระดับโลก)</h2>
<p>ฐานข้อมูลจาก NASA ที่เกิดมาเพื่องานด้านการเกษตรและพลังงาน ให้ข้อมูลครอบคลุมทั่วโลกผ่านแพ็กเกจ nasapower โดยตรง</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแพ็กเกจ: install.packages("nasapower")</span></span>
<span id="cb2-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(nasapower)</span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ดึงข้อมูลอุณหภูมิ (T2M) และความชื้น (RH2M)</span></span>
<span id="cb2-5">nasa_weather <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">get_power</span>(</span>
<span id="cb2-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">community =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ag"</span>,</span>
<span id="cb2-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lonlat =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">100.5018</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">13.7563</span>), <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Longitude, Latitude</span></span>
<span id="cb2-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pars =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"T2M"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"RH2M"</span>),       </span>
<span id="cb2-9">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dates =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-03-01"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-03-07"</span>),</span>
<span id="cb2-10">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">temporal_api =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"hourly"</span></span>
<span id="cb2-11">)</span>
<span id="cb2-12"></span>
<span id="cb2-13"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(nasa_weather)</span></code></pre></div></div>
</section>
<section id="ขอมลสถานจรงจากสนามบน-iem-riem" class="level2">
<h2 class="anchored" data-anchor-id="ขอมลสถานจรงจากสนามบน-iem-riem">3. ข้อมูลสถานีจริงจากสนามบิน (IEM / riem)</h2>
<p>ถ้าไม่ชอบข้อมูลจากการประมาณค่าด้วยดาวเทียม และอยากได้ “ข้อมูลที่วัดจากเซ็นเซอร์จริง” เราสามารถดึงข้อมูลจากสถานีตรวจอากาศของสนามบินในไทยได้ผ่านแพ็กเกจ <code>riem</code></p>
<ul>
<li>VTBS = สุวรรณภูมิ</li>
<li>VTBD = ดอนเมือง</li>
<li>VTCC = เชียงใหม่</li>
</ul>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแพ็กเกจ: install.packages("riem")</span></span>
<span id="cb3-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(riem)</span>
<span id="cb3-3"></span>
<span id="cb3-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ดึงข้อมูลของสนามบินดอนเมือง (รหัส VTBD)</span></span>
<span id="cb3-5">airport_weather <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">riem_measures</span>(</span>
<span id="cb3-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">station =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"VTBD"</span>,</span>
<span id="cb3-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">date_start =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-03-01"</span>,</span>
<span id="cb3-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">date_end =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-03-07"</span></span>
<span id="cb3-9">)</span>
<span id="cb3-10"></span>
<span id="cb3-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ข้อมูลจะมีคอลัมน์ tmpf (อุณหภูมิฟาเรนไฮต์) และ relh (ความชื้น)</span></span>
<span id="cb3-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(airport_weather)</span></code></pre></div></div>
</section>
<section id="met-norway-สถาบนอตนยมวทยานอรเวย" class="level2">
<h2 class="anchored" data-anchor-id="met-norway-สถาบนอตนยมวทยานอรเวย">4. MET Norway (สถาบันอุตุนิยมวิทยานอร์เวย์)</h2>
<p>แหล่งข้อมูลเบื้องหลังแอปพยากรณ์อากาศชื่อดังอย่าง Yr.no แม่นยำมาก แต่มีกฎเหล็กคือ ต้องใส่ User-Agent เพื่อระบุตัวตนเสมอ</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแพ็กเกจ: install.packages(c("httr", "jsonlite"))</span></span>
<span id="cb4-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(httr)</span>
<span id="cb4-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(jsonlite)</span>
<span id="cb4-4"></span>
<span id="cb4-5">url <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=13.75&amp;lon=100.50"</span></span>
<span id="cb4-6"></span>
<span id="cb4-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เปลี่ยน User-Agent เป็นอีเมลของคุณ</span></span>
<span id="cb4-8">response <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">GET</span>(url, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">user_agent</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MyWeatherScript/1.0 (your_email@example.com)"</span>))</span>
<span id="cb4-9"></span>
<span id="cb4-10"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">status_code</span>(response) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>) {</span>
<span id="cb4-11">  weather_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">content</span>(response, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"text"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">encoding =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UTF-8"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fromJSON</span>()</span>
<span id="cb4-12">  times <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> weather_data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>properties<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>timeseries<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>time</span>
<span id="cb4-13">  details <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> weather_data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>properties<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>timeseries<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>data<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>instant<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>details</span>
<span id="cb4-14">  </span>
<span id="cb4-15">  met_df <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb4-16">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">datetime =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.POSIXct</span>(times, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">format=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%Y-%m-%dT%H:%M:%SZ"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">tz=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UTC"</span>),</span>
<span id="cb4-17">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">temperature_c =</span> details<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>air_temperature,</span>
<span id="cb4-18">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">humidity_percent =</span> details<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>relative_humidity</span>
<span id="cb4-19">  )</span>
<span id="cb4-20">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(met_df)</span>
<span id="cb4-21">}</span></code></pre></div></div>


</section>

 ]]></description>
  <category>R</category>
  <category>Data Science</category>
  <category>Weather Data</category>
  <category>API</category>
  <guid>https://kanthanawit.in.th/writing/get-weather-data/</guid>
  <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/weather_api_r_cover_cartoon.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>หาความชื้นดินผ่าน API ด้วย R</title>
  <link>https://kanthanawit.in.th/writing/get_soil_moisture/</link>
  <description><![CDATA[ 




<section id="เชคความชนดนผาน-api-ฟรดวย-r-smart-farming-ฉบบมน" class="level1">
<h1>เช็คความชื้นดินผ่าน API ฟรีด้วย R (Smart Farming ฉบับมินิ)</h1>
<p>สำหรับใครที่ทำโปรเจกต์ด้านการเกษตร หรือกำลังสนใจทำระบบรดน้ำอัตโนมัติ (Smart Farming) ข้อมูลที่สำคัญมากๆ อย่างหนึ่งก็คือ <strong>“ความชื้นในดิน” (Soil Moisture)</strong> ครับ</p>
<p>ถ้าเรายังไม่มีเซ็นเซอร์วัดความชื้นปักลงไปในดินจริงๆ เราสามารถใช้ตัวย่อด้วยการดึง <strong>ข้อมูลประมาณการความชื้นในดินจากดาวเทียมและโมเดลสภาพอากาศ</strong> มาใช้ก่อนได้ ซึ่งโมเดลที่เราจะใช้วันนี้คือข้อมูลระดับความลึก 3-9 เซนติเมตร จาก <strong>Open-Meteo API</strong> ครับ (ฟรีเหมือนเดิม!)</p>
<hr>
<section id="สรางฟงกชนดงคาความชนในดนดวย-r" class="level2">
<h2 class="anchored" data-anchor-id="สรางฟงกชนดงคาความชนในดนดวย-r">1. สร้างฟังก์ชันดึงค่าความชื้นในดินด้วย R</h2>
<p>เรามาเริ่มด้วยการเขียนฟังก์ชันสั้นๆ ใน R ที่รับค่าละติจูด (Latitude) และลองจิจูด (Longitude) แล้ววิ่งไปดึงข้อมูลจาก API กลับมา:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแพ็กเกจ: install.packages(c("jsonlite", "dplyr", "purrr"))</span></span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(jsonlite)</span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tidyverse)</span>
<span id="cb1-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(purrr)</span>
<span id="cb1-5"></span>
<span id="cb1-6">get_current_soil_moisture <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(lat, lon) {</span>
<span id="cb1-7">  </span>
<span id="cb1-8">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ระบุพิกัดและโมเดลความชื้น 3-9 cm</span></span>
<span id="cb1-9">  url <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://api.open-meteo.com/v1/forecast?latitude="</span>, lat, </span>
<span id="cb1-10">                <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;longitude="</span>, lon, </span>
<span id="cb1-11">                <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;hourly=soil_moisture_3_to_9cm&amp;forecast_days=1"</span>)</span>
<span id="cb1-12">  </span>
<span id="cb1-13">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ดึงข้อมูลจาก API</span></span>
<span id="cb1-14">  res <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tryCatch</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fromJSON</span>(url), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">error =</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(e) <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NULL</span>)</span>
<span id="cb1-15">  </span>
<span id="cb1-16">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># หน่วงเวลาเล็กน้อยป้องกันการรัว Request จนโดนบล็อก (Polite Scraping)</span></span>
<span id="cb1-17">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Sys.sleep</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>)</span>
<span id="cb1-18">  </span>
<span id="cb1-19">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เช็คว่า API ส่งข้อมูล soil_moisture_3_to_9cm กลับมาไหม ถ้าเกิดพังให้คืนค่า NA</span></span>
<span id="cb1-20">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.null</span>(res) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.null</span>(res<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>soil_moisture_3_to_9cm)) {</span>
<span id="cb1-21">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">return</span>(<span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA_real_</span>) </span>
<span id="cb1-22">  }</span>
<span id="cb1-23">  </span>
<span id="cb1-24">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># หยิบค่าความชื้นชั่วโมงปัจจุบันใบแรกมาใช้</span></span>
<span id="cb1-25">  val <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> res<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>soil_moisture_3_to_9cm[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb1-26">  </span>
<span id="cb1-27">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.null</span>(val) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">||</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(val)) {</span>
<span id="cb1-28">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">return</span>(<span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA_real_</span>)</span>
<span id="cb1-29">  }</span>
<span id="cb1-30">  </span>
<span id="cb1-31">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ส่งค่าความชื้นที่มีหน่วยเป็น m³/m³ กลับไป</span></span>
<span id="cb1-32">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">return</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.numeric</span>(val))</span>
<span id="cb1-33">}</span></code></pre></div></div>
<p>ฟังก์ชันนี้จะส่งคืนเป็นตัวเลข (ความชื้นดินในหน่วยลูกบาศก์เมตรต่อน้ำ 1 ลูกบาศก์เมตร หรือ <img src="https://latex.codecogs.com/png.latex?m3/m3">) กลับมา ถ้าเกิดโหลดจาก API ไม่ได้ก็จะส่งกลับเป็น <code>NA</code> ครับ</p>
<hr>
</section>
<section id="ประยกตใชกบตำแหนงหลายๆ-ฟารมพรอมกน" class="level2">
<h2 class="anchored" data-anchor-id="ประยกตใชกบตำแหนงหลายๆ-ฟารมพรอมกน">2. ประยุกต์ใช้กับตำแหน่งหลายๆ ฟาร์มพร้อมกัน</h2>
<p>ทีนี้ ถ้าเรามีข้อมูลแปลงผักหรือฟาร์มหลายกระจายอยู่ทั่วประเทศ เราจะมานั่งลูป <code>for</code> ก็อาจจะดูยืดยาดไป ลองใช้พลังของ <code>purrr::map2_dbl()</code> จาก <code>tidyverse</code> จัดการกันเลยครับ</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สมมติรายชื่อและพิกัดของฟาร์ม 3 แห่ง</span></span>
<span id="cb2-2">my_farms <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb2-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">farm_name =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ฟาร์มรังสิต (ปทุมธานี)"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ฟาร์มดอยอินทนนท์ (เชียงใหม่)"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ฟาร์มปากช่อง (โคราช)"</span>),</span>
<span id="cb2-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lat =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">14.02</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">18.58</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">14.70</span>),</span>
<span id="cb2-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lon =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">100.62</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">98.48</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">101.41</span>)</span>
<span id="cb2-6">)</span>
<span id="cb2-7"></span>
<span id="cb2-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ใช้ mutate และ map2_dbl โยนละติจูด, ลองจิจูด แต่ละแถวเข้าไปในฟังก์ชัน</span></span>
<span id="cb2-9">my_farms_updated <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> my_farms <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb2-10">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb2-11">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">current_moisture_m3_m3 =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">map2_dbl</span>(lat, lon, get_current_soil_moisture)</span>
<span id="cb2-12">  )</span>
<span id="cb2-13"></span>
<span id="cb2-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ดูผลลัพธ์ว่าฟาร์มไหนความชื้นเป็นยังไงบ้าง</span></span>
<span id="cb2-15"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">print</span>(my_farms_updated)</span></code></pre></div></div>
<p><strong>ผลลัพธ์ที่ได้จะเป็นตารางแบบนี้:</strong></p>
<pre class="text"><code>                     farm_name   lat    lon current_moisture_m3_m3
1        ฟาร์มรังสิต (ปทุมธานี) 14.02 100.62                  0.342
2 ฟาร์มดอยอินทนนท์ (เชียงใหม่) 18.58  98.48                  0.415
3         ฟาร์มปากช่อง (โคราช) 14.70 101.41                  0.198</code></pre>
<p>แค่นี้เราก็สามารถรู้ความชื้นดินเบื้องต้นของพื้นที่แปลงเกษตรของเรา แล้วเอาไปตั้งเงื่อนไขต่อได้ว่า ถ้าน้อยกว่า 0.2 ให้แจ้งเตือนเข้า LINE หรือให้ส่งสัญญาณเปิดปั๊มน้ำอัตโนมัติก็ทำได้แล้วครับ! สนุกกับการปลูกผักอัจฉริยะนะครับ 🌱</p>


</section>
</section>

 ]]></description>
  <category>R</category>
  <category>Data Science</category>
  <category>Agriculture</category>
  <category>API</category>
  <guid>https://kanthanawit.in.th/writing/get_soil_moisture/</guid>
  <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/soil_moisture_r_cover_cartoon.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>ประเมินระยะเปียกใบ (Leaf Wetness Duration) ด้วย R</title>
  <link>https://kanthanawit.in.th/writing/leaf_wetness_4cast/</link>
  <description><![CDATA[ 




<section id="ประเมนระยะเปยกใบ-leaf-wetness-duration-ดวย-r" class="level1">
<h1>ประเมินระยะเปียกใบ (Leaf Wetness Duration) ด้วย R</h1>
<p>การหาระยะเปียกใบ (Leaf Wetness Duration - LWD) ย้อนหลังจากพิกัด (Latitude/Longitude) เป็นไอเดียที่ดีมากครับ โดยเฉพาะในงานด้านการเกษตรและการพยากรณ์โรคพืช</p>
<p>แต่ต้องขออธิบายตามความเป็นจริงก่อนว่า โดยทั่วไปแล้ว ข้อมูลระยะเปียกใบมักจะไม่มีการตรวจวัดโดยตรงในสถานีตรวจอากาศสาธารณะ แต่ในทางอุตุนิยมวิทยาเกษตร เราสามารถ <strong>“ประเมิน” (Estimate)</strong> ระยะเปียกใบได้จากข้อมูลสภาพอากาศพื้นฐาน เช่น ปริมาณน้ำฝน (Precipitation) และ ความชื้นสัมพัทธ์ (Relative Humidity - RH) ครับ</p>
<p><strong>หลักการประเมิน (Empirical Model):</strong></p>
<p>ใบพืชจะถือว่า “เปียก” ในชั่วโมงนั้นๆ ก็ต่อเมื่อ: - มีฝนตก (Precipitation &gt; 0 mm) <strong>หรือ</strong> - ความชื้นสัมพัทธ์สูงจนเกิดน้ำค้าง (ปกติจะใช้เกณฑ์ RH ≥ 90%)</p>
<p>ดังนั้น ผมจึงออกแบบ R function โดยดึงข้อมูลรายชั่วโมงจาก API ฟรีของ Open-Meteo (ซึ่งเก็บข้อมูลสภาพอากาศย้อนหลังทั่วโลกได้ดีมาก) แล้วนำมาคำนวณหาระยะเปียกใบรวมในแต่ละวันให้ครับ</p>
<hr>
<section id="r-function-สำหรบประเมนระยะเปยกใบเบองตน" class="level2">
<h2 class="anchored" data-anchor-id="r-function-สำหรบประเมนระยะเปยกใบเบองตน">💻 R Function สำหรับประเมินระยะเปียกใบเบื้องต้น</h2>
<p>ก่อนใช้งาน ต้องติดตั้ง package ที่จำเป็นก่อนนะครับ โดยรันคำสั่ง:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"httr"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"jsonlite"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dplyr"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"lubridate"</span>))</span></code></pre></div></div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># โหลด Libraries ที่จำเป็น</span></span>
<span id="cb2-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(httr)</span>
<span id="cb2-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(jsonlite)</span>
<span id="cb2-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dplyr)</span>
<span id="cb2-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(lubridate)</span>
<span id="cb2-6"></span>
<span id="cb2-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' ฟังก์ชันดึงและคำนวณข้อมูลระยะเปียกใบ (Leaf Wetness Duration) รายวัน</span></span>
<span id="cb2-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' </span></span>
<span id="cb2-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param lat ละติจูด (เช่น 14.0205)</span></span>
<span id="cb2-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param lon ลองจิจูด (เช่น 100.7299)</span></span>
<span id="cb2-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param start_date วันที่เริ่มต้น รูปแบบ "YYYY-MM-DD"</span></span>
<span id="cb2-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param end_date วันที่สิ้นสุด รูปแบบ "YYYY-MM-DD"</span></span>
<span id="cb2-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @param rh_threshold เกณฑ์ความชื้นสัมพัทธ์ที่ทำให้เกิดน้ำค้าง (ค่าเริ่มต้น 90%)</span></span>
<span id="cb2-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @return Dataframe สรุประยะเวลาเปียกใบ (ชั่วโมง/วัน)</span></span>
<span id="cb2-15">get_leaf_wetness <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(lat, lon, start_date, end_date, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">rh_threshold =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">90</span>) {</span>
<span id="cb2-16">  </span>
<span id="cb2-17">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. สร้าง URL เพื่อดึงข้อมูล API ของ Open-Meteo Historical Data</span></span>
<span id="cb2-18">  url <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(</span>
<span id="cb2-19">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://archive-api.open-meteo.com/v1/archive?"</span>,</span>
<span id="cb2-20">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"latitude="</span>, lat,</span>
<span id="cb2-21">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;longitude="</span>, lon,</span>
<span id="cb2-22">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;start_date="</span>, start_date,</span>
<span id="cb2-23">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;end_date="</span>, end_date,</span>
<span id="cb2-24">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;hourly=precipitation,relative_humidity_2m"</span>,</span>
<span id="cb2-25">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;timezone=auto"</span></span>
<span id="cb2-26">  )</span>
<span id="cb2-27">  </span>
<span id="cb2-28">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. ดึงข้อมูลผ่าน API</span></span>
<span id="cb2-29">  response <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">GET</span>(url)</span>
<span id="cb2-30">  </span>
<span id="cb2-31">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">status_code</span>(response) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>) {</span>
<span id="cb2-32">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">stop</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"เกิดข้อผิดพลาดในการดึงข้อมูล กรุณาตรวจสอบพิกัด อินเทอร์เน็ต หรือวันที่"</span>)</span>
<span id="cb2-33">  }</span>
<span id="cb2-34">  </span>
<span id="cb2-35">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># แปลง JSON เป็น Data Frame</span></span>
<span id="cb2-36">  data_json <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fromJSON</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">content</span>(response, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"text"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">encoding =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UTF-8"</span>))</span>
<span id="cb2-37">  </span>
<span id="cb2-38">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. จัดการข้อมูลรายชั่วโมง</span></span>
<span id="cb2-39">  hourly_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb2-40">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Open-Meteo ส่งเวลามาในรูปแบบ "2024-01-01T00:00"</span></span>
<span id="cb2-41">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">time =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ymd_hm</span>(data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>time),</span>
<span id="cb2-42">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">precipitation =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>precipitation,</span>
<span id="cb2-43">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">relative_humidity =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>relative_humidity_2m</span>
<span id="cb2-44">  )</span>
<span id="cb2-45">  </span>
<span id="cb2-46">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. ประเมินระยะเปียกใบ (Leaf Wetness) ในแต่ละชั่วโมง</span></span>
<span id="cb2-47">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ให้ชั่วโมงนั้นมีค่า = 1 หากมีฝนตก หรือ ความชื้นสัมพัทธ์สูงกว่าเกณฑ์</span></span>
<span id="cb2-48">  hourly_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> hourly_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-49">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb2-50">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">is_wet =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(</span>
<span id="cb2-51">        (<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(precipitation) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> precipitation <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|</span> </span>
<span id="cb2-52">        (<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(relative_humidity) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> relative_humidity <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> rh_threshold),</span>
<span id="cb2-53">        <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1 คือเปียก, 0 คือแห้ง</span></span>
<span id="cb2-54">      ),</span>
<span id="cb2-55">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">date =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.Date</span>(time) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สกัดเฉพาะวันที่เพื่อใช้ออกรายงาน</span></span>
<span id="cb2-56">    )</span>
<span id="cb2-57">  </span>
<span id="cb2-58">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. สรุปผลเป็นรายวัน (ชั่วโมงเปียกใบรวมใน 1 วัน)</span></span>
<span id="cb2-59">  daily_lwd <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> hourly_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-60">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">group_by</span>(date) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-61">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summarise</span>(</span>
<span id="cb2-62">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">leaf_wetness_hours =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(is_wet, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>),</span>
<span id="cb2-63">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">avg_humidity_percent =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mean</span>(relative_humidity, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>),</span>
<span id="cb2-64">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">total_precip_mm =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(precipitation, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span>
<span id="cb2-65">    )</span>
<span id="cb2-66">  </span>
<span id="cb2-67">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">return</span>(daily_lwd)</span>
<span id="cb2-68">}</span>
<span id="cb2-69"></span>
<span id="cb2-70"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ==========================================</span></span>
<span id="cb2-71"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 📌 ตัวอย่างการใช้งาน (Example Usage)</span></span>
<span id="cb2-72"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ==========================================</span></span>
<span id="cb2-73"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สมมติใช้พิกัดรังสิต ปทุมธานี ช่วงวันที่ 1 - 7 มีนาคม 2026</span></span>
<span id="cb2-74"></span>
<span id="cb2-75"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># lat_example &lt;- 14.0205</span></span>
<span id="cb2-76"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># lon_example &lt;- 100.7299</span></span>
<span id="cb2-77"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># result &lt;- get_leaf_wetness(</span></span>
<span id="cb2-78"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#   lat = lat_example, </span></span>
<span id="cb2-79"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#   lon = lon_example, </span></span>
<span id="cb2-80"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#   start_date = "2026-03-01", </span></span>
<span id="cb2-81"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#   end_date = "2026-03-07"</span></span>
<span id="cb2-82"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># )</span></span>
<span id="cb2-83"></span>
<span id="cb2-84"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(result)</span></span></code></pre></div></div>
<p>📊 <strong>สิ่งที่คุณจะได้จาก Function นี้</strong></p>
<p>Dataframe ที่ Return กลับมาจะมีข้อมูลตามนี้ครับ: - <code>date</code>: วันที่ - <code>leaf_wetness_hours</code>: เป้าหมายหลัก คือจำนวนชั่วโมงที่ใบเปียกใน 1 วัน (เต็มที่คือ 24 ชั่วโมง) - <code>avg_humidity_percent</code>: ความชื้นสัมพัทธ์เฉลี่ยของวันนั้น - <code>total_precip_mm</code>: ปริมาณน้ำฝนรวมในวันนั้น</p>
<p><strong>ข้อควรระวัง:</strong> ฟังก์ชันนี้ประเมินระยะเปียกใบจาก “สภาพอากาศระดับมหภาค (Macroclimate)” แต่ในแปลงปลูกจริง (Microclimate) ระยะเวลาที่ใบแห้งหรือเปียกอาจแตกต่างกันตามความหนาแน่นของทรงพุ่มหรือทิศทางลม หากคุณต้องการความแม่นยำสูงระดับร้อยเปอร์เซ็นต์ อาจต้องปรับตัวแปร <code>rh_threshold</code> ให้เหมาะสมกับชนิดพืชของคุณดูครับ (บางงานวิจัยใช้ที่ 85% หรือ 92%)</p>
<hr>
</section>
<section id="การทำ-advanced-leaf-wetness-duration-สำหรบนาขาว" class="level2">
<h2 class="anchored" data-anchor-id="การทำ-advanced-leaf-wetness-duration-สำหรบนาขาว">การทำ Advanced Leaf Wetness Duration สำหรับนาข้าว</h2>
<p>การประเมินระยะเปียกใบใหัแม่นยำระดับนำไปใช้งานจริงกับ “นาข้าว” นั้น มีความท้าทายเฉพาะตัวครับ เนื่องจากข้าวเป็นพืชที่มีทรงพุ่มหนาแน่นและปลูกในสภาพน้ำขัง (Paddy field) การใช้แค่เกณฑ์ความชื้นสัมพัทธ์ (RH) แบบพื้นฐานอาจคลาดเคลื่อนได้ง่าย นี่คือข้อมูลเจาะลึกและแนวทางยกระดับความแม่นยำครับ</p>
<section id="ทำไม-ขาว-ถงประเมนระยะเปยกใบไดยากกวาพชอน" class="level3">
<h3 class="anchored" data-anchor-id="ทำไม-ขาว-ถงประเมนระยะเปยกใบไดยากกวาพชอน">🌾 ทำไม “ข้าว” ถึงประเมินระยะเปียกใบได้ยากกว่าพืชอื่น?</h3>
<ul>
<li><strong>ปรากฏการณ์ Guttation (การคายน้ำเป็นหยด):</strong> ข้าวและพืชตระกูลหญ้ามักจะขับน้ำส่วนเกินออกมาทางปลายใบในเวลากลางคืนหรือเช้าตรู่ที่อากาศมีความชื้นสูง แม้จะไม่มีฝนหรือน้ำค้างตกลงมา แต่ใบข้าวก็ “เปียก” ได้จากน้ำของตัวมันเอง</li>
<li><strong>Microclimate จากน้ำในนา:</strong> อุณหภูมิของน้ำที่ขังอยู่ในนาจะระเหยและสร้างความชื้นสะสมในระดับทรงพุ่มส่วนล่าง ทำให้ความชื้นสัมพัทธ์ในกอข้าวสูงกว่าอากาศเหนือแปลงที่สถานีตรวจอากาศวัดได้</li>
</ul>
</section>
<section id="แนวทางในการสราง-model-ใหแมนยำขน-จากงายไปยาก" class="level3">
<h3 class="anchored" data-anchor-id="แนวทางในการสราง-model-ใหแมนยำขน-จากงายไปยาก">🛠️ 3 แนวทางในการสร้าง Model ให้แม่นยำขึ้น (จากง่ายไปยาก)</h3>
<p>งานวิจัยระดับสากลแนะนำแนวทางในการประเมิน LWD ไว้ 3 ระดับ ดังนี้ครับ:</p>
<section id="การปรบปรงสมการเชงประจกษ-improved-empirical-model" class="level4">
<h4 class="anchored" data-anchor-id="การปรบปรงสมการเชงประจกษ-improved-empirical-model">1. การปรับปรุงสมการเชิงประจักษ์ (Improved Empirical Model)</h4>
<p>เป็นวิธีที่นำไปเขียนใน R Function ได้ง่ายที่สุดและให้ผลลัพธ์ดีขึ้นอย่างก้าวกระโดด งานวิจัยระบุว่าการใช้แค่ฝนและ RH &gt; 90% ยังไม่พอ ต้องเพิ่มตัวแปร “ลม” และ “แสงแดด” ที่เป็นตัวการทำให้น้ำระเหย (Drying factors) เข้าไปเป็นเงื่อนไขด้วย - <strong>Wind Speed (ความเร็วลม):</strong> หากมีลมพัดแรง (เช่น &gt; 2-3 m/s) ใบข้าวจะแห้งเร็วมากแม้ความชื้นในอากาศจะสูงก็ตาม - <strong>Solar Radiation (รังสีคลื่นสั้น/แสงแดด):</strong> หยดน้ำค้างมักจะระเหยหมดไปภายใน 1-2 ชั่วโมงหลังดวงอาทิตย์ขึ้น การเพิ่มเงื่อนไขรังสีดวงอาทิตย์จะช่วยตัด Error ในช่วงสายของวันได้ - <strong>Dew Point Depression:</strong> แทนที่จะดูแค่ %RH ให้คำนวณส่วนต่างระหว่างอุณหภูมิอากาศกับจุดน้ำค้าง (T_air - T_dew) หากส่วนต่างนี้น้อยกว่า 2°C ร่วมกับลมสงบ โอกาสเกิดน้ำค้างจะสูงมาก</p>
</section>
<section id="แบบจำลองสมดลพลงงาน-physical-model-penman-monteith" class="level4">
<h4 class="anchored" data-anchor-id="แบบจำลองสมดลพลงงาน-physical-model-penman-monteith">2. แบบจำลองสมดุลพลังงาน (Physical Model / Penman-Monteith)</h4>
<p>นี่คือมาตรฐานขั้นสูง (Gold Standard) ทางอุตุนิยมวิทยาฟิสิกส์ แทนที่จะใช้การตั้งเงื่อนไข (If-Else) วิธีนี้จะคำนวณ Latent Heat Flux (LE) หรือพลังงานที่ใช้ในการควบแน่นและระเหยของน้ำบนผิวใบโดยตรงผ่านสมการ:</p>
<p><code>LE = [-\Delta R_n + 1200(e_s - e_a) / (r_a + r_b)] / (\Delta + \gamma)</code></p>
<p>แบบจำลองนี้แม่นยำมากเพราะอิงตามหลักฟิสิกส์ของการเกิดน้ำค้าง แต่ข้อเสียคือ “ต้องการข้อมูลสภาพอากาศที่ละเอียดมาก” เช่น ค่าความต้านทานอากาศของทรงพุ่มข้าว (r_a, r_b) และรังสีสุทธิ (R_n)</p>
</section>
<section id="การใช-machine-learning-data-driven-model" class="level4">
<h4 class="anchored" data-anchor-id="การใช-machine-learning-data-driven-model">3. การใช้ Machine Learning (Data-Driven Model)</h4>
<p>เปเปอร์วิจัยในช่วง 5-6 ปีที่ผ่านมา (เช่น งานวิจัย LWD ในเกาหลีใต้) หันมาใช้ AI อย่าง Random Forest หรือ Deep Neural Networks กันหมดแล้วครับ - <strong>วิธีการ:</strong> พวกเขาจะนำเซ็นเซอร์วัดความเปียกใบ (Leaf Wetness Sensor) ไปติดในดงข้าวจริงๆ เป็นเวลา 1 ฤดูกาล เพื่อเก็บข้อมูล (Ground Truth) แล้วนำมาสอน AI คู่กับข้อมูลสภาพอากาศทั่วไป (อุณหภูมิ, ความชื้น, ลม, แดด) - <strong>ผลลัพธ์ที่ได้พบว่าโมเดล Random Forest สามารถทำนาย LWD ของพื้นที่นั้นๆ ได้แม่นยำที่สุดและมีความคลาดเคลื่อนต่ำมาก</strong></p>
<hr>
</section>
</section>
<section id="logic-ทแมนยำขนสำหรบ-improved-empirical-model" class="level3">
<h3 class="anchored" data-anchor-id="logic-ทแมนยำขนสำหรบ-improved-empirical-model">Logic ที่แม่นยำขึ้นสำหรับ Improved Empirical Model</h3>
<p>ใบจะเปียก ก็ต่อเมื่อ (มีฝนตก) หรือ (ความชื้นสูง + อุณหภูมิใกล้จุดน้ำค้าง + ลมสงบ + ไม่มีแดดจัด)</p>
<p>ใบข้าวจะถูกประเมินว่า “เปียก (Wet = 1)” ในชั่วโมงนั้นๆ ก็ต่อเมื่อเข้าเงื่อนไขใดเงื่อนไขหนึ่งต่อไปนี้: - <strong>เกิดจากฝน (Rain-induced):</strong> มีปริมาณฝนตก &gt; 0 mm - <strong>เกิดจากน้ำค้าง (Dew-induced):</strong> ต้องเข้าเงื่อนไข <strong>ทั้งหมด</strong> ดังนี้: - ความชื้นสัมพัทธ์สูง (RH ≥ 85%) - อุณหภูมิอากาศใกล้เคียงจุดน้ำค้าง (T_air - T_dew ≤ 2°C) - ลมสงบหรือพัดอ่อน (Wind Speed &lt; 3 m/s) เพราะถ้าลมแรง น้ำจะระเหยหมด - ไม่มีแดดจัด (Solar Radiation &lt; 50 W/m²) ตัดปัญหาความคลาดเคลื่อนในช่วงกลางวัน</p>
<hr>
</section>
</section>
<section id="r-function-advanced-leaf-wetness-duration" class="level2">
<h2 class="anchored" data-anchor-id="r-function-advanced-leaf-wetness-duration">💻 R Function: Advanced Leaf Wetness Duration</h2>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># โหลด Libraries ที่จำเป็น</span></span>
<span id="cb3-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(httr)</span>
<span id="cb3-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(jsonlite)</span>
<span id="cb3-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(dplyr)</span>
<span id="cb3-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(lubridate)</span>
<span id="cb3-6"></span>
<span id="cb3-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' ฟังก์ชันประเมินระยะเปียกใบขั้นสูง (Advanced LWD) สำหรับนาข้าว</span></span>
<span id="cb3-8"></span>
<span id="cb3-9">get_advanced_lwd <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(lat, lon, start_date, end_date) {</span>
<span id="cb3-10">  </span>
<span id="cb3-11">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. กำหนด URL ดึงข้อมูล 6 ตัวแปร (ฝน, ความชื้น, อุณหภูมิ, จุดน้ำค้าง, ลม, รังสีดวงอาทิตย์)</span></span>
<span id="cb3-12">  url <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(</span>
<span id="cb3-13">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://archive-api.open-meteo.com/v1/archive?"</span>,</span>
<span id="cb3-14">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"latitude="</span>, lat,</span>
<span id="cb3-15">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;longitude="</span>, lon,</span>
<span id="cb3-16">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;start_date="</span>, start_date,</span>
<span id="cb3-17">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;end_date="</span>, end_date,</span>
<span id="cb3-18">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;hourly=precipitation,relative_humidity_2m,temperature_2m,dew_point_2m,wind_speed_10m,shortwave_radiation"</span>,</span>
<span id="cb3-19">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"&amp;timezone=auto"</span></span>
<span id="cb3-20">  )</span>
<span id="cb3-21">  </span>
<span id="cb3-22">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. ดึงข้อมูล API</span></span>
<span id="cb3-23">  response <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">GET</span>(url)</span>
<span id="cb3-24">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">status_code</span>(response) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>) {</span>
<span id="cb3-25">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">stop</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"เกิดข้อผิดพลาดในการเชื่อมต่อ API กรุณาตรวจสอบข้อมูลนำเข้า"</span>)</span>
<span id="cb3-26">  }</span>
<span id="cb3-27">  </span>
<span id="cb3-28">  data_json <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fromJSON</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">content</span>(response, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"text"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">encoding =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UTF-8"</span>))</span>
<span id="cb3-29">  </span>
<span id="cb3-30">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. จัดรูป Dataframe</span></span>
<span id="cb3-31">  hourly_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb3-32">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">time =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ymd_hm</span>(data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>time),</span>
<span id="cb3-33">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">precip =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>precipitation,</span>
<span id="cb3-34">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">rh =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>relative_humidity_2m,</span>
<span id="cb3-35">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">temp =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>temperature_2m,</span>
<span id="cb3-36">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dew =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>dew_point_2m,</span>
<span id="cb3-37">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">wind =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>wind_speed_10m,</span>
<span id="cb3-38">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">solar =</span> data_json<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>hourly<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>shortwave_radiation</span>
<span id="cb3-39">  )</span>
<span id="cb3-40">  </span>
<span id="cb3-41">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. ประเมิน LWD ตามตรรกะ Improved Empirical Model</span></span>
<span id="cb3-42">  hourly_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> hourly_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb3-43">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb3-44">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dew_depression =</span> temp <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> dew, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># คำนวณส่วนต่างอุณหภูมิและจุดน้ำค้าง</span></span>
<span id="cb3-45">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">is_wet =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">case_when</span>(</span>
<span id="cb3-46">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เงื่อนไขที่ 1: ฝนตก</span></span>
<span id="cb3-47">        <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(precip) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> precip <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb3-48">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เงื่อนไขที่ 2: น้ำค้าง (ชื้นสูง + อุณหภูมิใกล้จุดน้ำค้าง + ลมสงบ + ไม่มีแดด)</span></span>
<span id="cb3-49">        (<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(rh) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> rh <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">85</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> </span>
<span id="cb3-50">        (<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(dew_depression) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> dew_depression <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> </span>
<span id="cb3-51">        (<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(wind) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> wind <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.0</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> </span>
<span id="cb3-52">        (<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(solar) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> solar <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb3-53">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># นอกนั้นถือว่าแห้ง</span></span>
<span id="cb3-54">        <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> </span>
<span id="cb3-55">      ),</span>
<span id="cb3-56">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">date =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.Date</span>(time)</span>
<span id="cb3-57">    )</span>
<span id="cb3-58">  </span>
<span id="cb3-59">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. สรุปผลเป็นรายวัน</span></span>
<span id="cb3-60">  daily_summary <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> hourly_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb3-61">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">group_by</span>(date) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb3-62">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summarise</span>(</span>
<span id="cb3-63">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lwd_hours =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(is_wet, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>),</span>
<span id="cb3-64">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">total_precip_mm =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(precip, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>),</span>
<span id="cb3-65">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">avg_temp_c =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mean</span>(temp, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>),</span>
<span id="cb3-66">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">avg_rh_percent =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mean</span>(rh, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">na.rm =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-67">    )</span>
<span id="cb3-68">  </span>
<span id="cb3-69">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">return</span>(daily_summary)</span>
<span id="cb3-70">}</span>
<span id="cb3-71"></span>
<span id="cb3-72"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ==========================================</span></span>
<span id="cb3-73"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 📌 ตัวอย่างการใช้งาน</span></span>
<span id="cb3-74"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ==========================================</span></span>
<span id="cb3-75"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># พิกัด รังสิต ปทุมธานี</span></span>
<span id="cb3-76"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># df_result &lt;- get_advanced_lwd(14.0205, 100.7299, "2026-03-01", "2026-03-10")</span></span>
<span id="cb3-77"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(df_result)</span></span></code></pre></div></div>
<p><strong>ข้อดีของโมเดลนี้:</strong> - <strong>ลดความคลาดเคลื่อนในช่วงกลางวัน:</strong> โมเดลเก่าที่ใช้แค่ความชื้น บางครั้งฟ้าหลัวความชื้นสูงตอนบ่าย โมเดลอาจนับว่าเปียก แต่โมเดลใหม่มีค่ารังสีดวงอาทิตย์ (solar &lt; 50) มาคอยบังคับไว้ว่าถ้ามีแดด ใบข้าวจะแห้งแน่นอน - <strong>สมจริงกับสภาพภูมิอากาศมากขึ้น:</strong> การนำลม (wind &lt; 3.0) มาคิด ช่วยให้สะท้อนความเป็นจริงที่ว่า คืนไหนลมแรง น้ำค้างจะไม่ค่อยเกาะใบ</p>
<p>ตัวเลขเกณฑ์ต่างๆ (เช่น ลม &lt; 3, ความชื้น ≥ 85) เป็นค่ากลางจากเปเปอร์วิจัยที่ใช้ได้ดีในเขตร้อนชื้นครับ แต่ถ้าคุณมีข้อมูลสภาพแวดล้อมเฉพาะเจาะจงในแปลง ก็สามารถเข้าไปแก้ตัวเลขใน <code>case_when</code> ได้เลย ลองเอาไปปรับใช้กับฟาร์มของคุณดูนะครับ 🌱</p>
</section>
<section id="เอกสารอางอง" class="level2">
<h2 class="anchored" data-anchor-id="เอกสารอางอง">เอกสารอ้างอิง</h2>
<ul>
<li>Gleason, M. L., et al.&nbsp;(1994). “A nonparametric empirical model for estimating leaf wetness duration.” Phytopathology.</li>
<li>Kim, J., et al.&nbsp;(2019). “Leaf Wetness Duration Models Using Advanced Machine Learning Algorithms: Application to Farms in Gyeonggi Province, South Korea.” Water (MDPI).</li>
<li>Sentelhas, P. C., et al.&nbsp;(2006). “Evaluation of a Penman-Monteith approach to provide ‘reference’ and crop canopy leaf wetness duration estimates.” Agricultural and Forest Meteorology.</li>
<li>Magarey, R. D., et al.&nbsp;(2005). “What Is Leaf Wetness?” Plant Disease (APS Journals).</li>
</ul>


</section>
</section>

 ]]></description>
  <category>R</category>
  <category>Data Science</category>
  <category>Agriculture</category>
  <category>API</category>
  <guid>https://kanthanawit.in.th/writing/leaf_wetness_4cast/</guid>
  <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/leaf_wetness_r_cover_cartoon.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>Claude Skills สำหรับ R users</title>
  <link>https://kanthanawit.in.th/writing/claude-skills-for-rusers/</link>
  <description><![CDATA[ 




<p>ช่วงนี้เครื่องมือ AI สำหรับช่วยเขียนโค้ดเพิ่มขึ้นมาเยอะมากจนบางทีรู้สึกท่วมหัว แต่มีอยู่อย่างหนึ่งที่อยากแนะนำให้รู้จัก เพราะมันเงียบ ๆ แต่มีประโยชน์จริง — นั่นคือ <strong>Claude Skills</strong> ใน <a href="https://docs.anthropic.com/en/docs/claude-code/overview">Claude Code</a></p>
<hr>
<section id="claude-skills-คออะไร-และตางจาก-claude.md-ยงไง" class="level2">
<h2 class="anchored" data-anchor-id="claude-skills-คออะไร-และตางจาก-claude.md-ยงไง">Claude Skills คืออะไร และต่างจาก CLAUDE.md ยังไง?</h2>
<p>ก่อนอื่นต้องทำความเข้าใจก่อนว่า Claude Code มีวิธีให้ “บอก” ให้ Claude รู้บริบทของงานอยู่สองแบบ</p>
<p><strong>CLAUDE.md</strong> คือไฟล์ที่ใช้เมื่ออยากให้ Claude รู้ข้อมูลบางอย่างตลอดเวลาในทุกงานของ project นั้น เช่น รูปแบบการเขียนโค้ด, naming convention, หรือโครงสร้าง project</p>
<p><strong>Claude Skills</strong> ต่างออกไปตรงที่มันถูกออกแบบมาให้ทำงาน <em>เฉพาะเมื่อต้องการ</em> ข้อดีคือไม่เปลืองพื้นที่ใน context window โดยไม่จำเป็น เปรียบได้กับ SOP ที่ดึงออกมาใช้เฉพาะตอนทำงานนั้น ๆ แทนที่จะต้องวางทิ้งไว้บนโต๊ะตลอดเวลา</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th></th>
<th>CLAUDE.md</th>
<th>Claude Skills</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>โหลดเมื่อไหร่</td>
<td>ทุกครั้งที่เปิด session</td>
<td>เฉพาะเมื่องานเกี่ยวข้อง</td>
</tr>
<tr class="even">
<td>ใช้ context window</td>
<td>ทุก session</td>
<td>เฉพาะเมื่อ activate</td>
</tr>
<tr class="odd">
<td>เหมาะกับ</td>
<td>project conventions, rules ทั่วไป</td>
<td>งานเฉพาะทาง เช่น Quarto, Shiny</td>
</tr>
</tbody>
</table>
<p>โดยทางเทคนิค Skill คือ Markdown ไฟล์ที่วางไว้ในโฟลเดอร์ <code>.claude/skills/</code> ในระดับ project หรือ <code>~/.claude/skills/</code> ในระดับ personal และ Claude Code จะ “หยิบ” มันขึ้นมาใช้เองโดยอัตโนมัติเมื่อเนื้องานเกี่ยวข้อง</p>
<hr>
</section>
<section id="skills-ทนาสนใจสำหรบนกวจยทใช-r" class="level2">
<h2 class="anchored" data-anchor-id="skills-ทนาสนใจสำหรบนกวจยทใช-r">Skills ที่น่าสนใจสำหรับนักวิจัยที่ใช้ R</h2>
<section id="modern-r-development-guide-sarah-johnson" class="level3">
<h3 class="anchored" data-anchor-id="modern-r-development-guide-sarah-johnson">1. Modern R Development Guide — Sarah Johnson</h3>
<blockquote class="blockquote">
<p>🔗 <a href="https://gist.github.com/sj-io/3828d64d0969f2a0f05297e59e6c15ad">Gist: sj-io/3828d64d0969f2a0f05297e59e6c15ad</a></p>
</blockquote>
<p>ปัญหาคลาสสิกของคนที่ขอโค้ด R จาก AI คือได้ฟังก์ชันเก่าที่ deprecated กลับมา เช่น <code>spread()</code> หรือ <code>cast()</code> ซึ่งหมดอายุการใช้งานไปนานแล้ว</p>
<p>Skill นี้แก้ปัญหาตรงนั้นโดยตรง มันฝึกให้ Claude ตอบสนองแบบ “R user ยุคปัจจุบัน” คือ:</p>
<ul>
<li>ใช้ tidyverse style</li>
<li>ใช้ <code>dplyr</code> เวอร์ชัน 1.1.0+ ขึ้นไป</li>
<li>หลีกเลี่ยง pattern เก่าที่ไม่ควรใช้แล้ว</li>
<li>ใช้ native pipe <code>|&gt;</code> แทน <code>%&gt;%</code></li>
</ul>
<p>สำหรับคนที่ทำงาน data science หรือวิเคราะห์ข้อมูลงานวิจัยอยู่เป็นประจำ อันนี้คือ <strong>must-have</strong></p>
<p><strong>ข้อแนะนำเพิ่มเติม:</strong> <a href="https://github.com/jeremy-allen/claude-skills">Jeremy Allen</a> แนะนำว่าถ้าไม่ได้ต้องการ guidance ทั้งหมดในทีเดียว สามารถแตก Skill นี้ออกเป็นหลาย Skill ย่อย ๆ จะยืดหยุ่นกว่า และ Jeremy ยังทำ Skill ที่ดึง update ล่าสุดจาก Posit มาให้ด้วย</p>
<hr>
</section>
<section id="claude-code-r-skills-alistair-bailey" class="level3">
<h3 class="anchored" data-anchor-id="claude-code-r-skills-alistair-bailey">2. Claude Code R Skills — Alistair Bailey</h3>
<blockquote class="blockquote">
<p>🔗 <a href="https://github.com/ab604/claude-code-r-skills">GitHub: ab604/claude-code-r-skills</a></p>
</blockquote>
<p>ต่อยอดจาก Skill ของ Sarah อีกชั้น มีทั้ง:</p>
<ul>
<li><strong>Skills แบบ modular:</strong> tidyverse, rlang, performance, OOP, testing</li>
<li><strong>Enforcement rules:</strong> security, testing, git workflow</li>
<li><strong>Workflow commands:</strong> <code>/plan</code>, <code>/code-review</code>, <code>/tdd</code></li>
</ul>
<p>จุดที่น่าสนใจเป็นพิเศษคือมีการกำหนด <strong>recommended workflow</strong> ให้ Claude ทำตามเมื่อเขียนโค้ด ซึ่งสำคัญมากในงานวิเคราะห์ที่มีหลายขั้นตอน เพราะมันช่วยให้โค้ดที่ได้กลับมามีโครงสร้างที่ reproducible</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งผ่าน Claude Code</span></span>
<span id="cb1-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> marketplace add ab604/claude-code-r-skills</span>
<span id="cb1-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install r-skills@r-skills</span></code></pre></div></div>
<hr>
</section>
<section id="posit-claude-skills" class="level3">
<h3 class="anchored" data-anchor-id="posit-claude-skills">3. Posit Claude Skills</h3>
<blockquote class="blockquote">
<p>🔗 <a href="https://github.com/posit-dev/skills">GitHub: posit-dev/skills</a></p>
</blockquote>
<p>ชุด Skills อย่างเป็นทางการจาก Posit ครอบคลุมหลาย category:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Category</th>
<th>Skills ที่มี</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>quarto</code></td>
<td>quarto-authoring, brand-yml</td>
</tr>
<tr class="even">
<td><code>shiny</code></td>
<td>shiny-bslib, shiny-bslib-theming, brand-yml</td>
</tr>
<tr class="odd">
<td><code>r-lib</code></td>
<td>lifecycle, cran-extrachecks, cli, open-source-r-pkg-release</td>
</tr>
<tr class="even">
<td><code>open-source</code></td>
<td>general developer tools</td>
</tr>
</tbody>
</table>
<section id="quarto-authoring-skill" class="level4">
<h4 class="anchored" data-anchor-id="quarto-authoring-skill">Quarto Authoring Skill</h4>
<blockquote class="blockquote">
<p>🔗 <a href="https://github.com/posit-dev/skills/tree/main/quarto">posit-dev/skills/quarto</a></p>
</blockquote>
<p>มีประโยชน์มากถ้ากำลัง migrate project จาก R Markdown ไปเป็น Quarto รองรับทุก format: HTML, dashboards, RevealJS, Typst PDFs, websites</p>
</section>
<section id="modern-shiny-apps-with-bslib-skill" class="level4">
<h4 class="anchored" data-anchor-id="modern-shiny-apps-with-bslib-skill">Modern Shiny Apps with bslib Skill</h4>
<blockquote class="blockquote">
<p>🔗 <a href="https://github.com/posit-dev/skills/tree/main/shiny">posit-dev/skills/shiny</a></p>
</blockquote>
<p>สำหรับใครที่อยากทำ dashboard หรือ interactive app เพื่อนำเสนอผลวิจัย Skill นี้ช่วยให้ Claude สร้าง Shiny app ด้วย pattern ใหม่แบบ Bootstrap 5 มี reference files ย่อยถึง 14 ไฟล์ครอบคลุมทั้ง layout, cards, value boxes, theming และ migration guide จาก legacy Shiny</p>
</section>
<section id="r-package-release-checklist-skill" class="level4">
<h4 class="anchored" data-anchor-id="r-package-release-checklist-skill">R Package Release Checklist Skill</h4>
<blockquote class="blockquote">
<p>🔗 <a href="https://github.com/posit-dev/skills/tree/main/r-lib">posit-dev/skills/r-lib</a></p>
</blockquote>
<p>สำหรับคนที่พัฒนา R package อยู่ มันช่วย generate checklist และ GitHub issue สำหรับการ release ได้อัตโนมัติ พร้อม automatic version calculation</p>
<p><strong>วิธีติดตั้ง Posit Skills:</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เพิ่ม marketplace</span></span>
<span id="cb2-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> marketplace add posit-dev/skills</span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งตาม category ที่ต้องการ</span></span>
<span id="cb2-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install r-lib@posit-dev-skills</span>
<span id="cb2-6"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install quarto@posit-dev-skills</span>
<span id="cb2-7"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install shiny@posit-dev-skills</span>
<span id="cb2-8"></span>
<span id="cb2-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># หรือใช้ npx</span></span>
<span id="cb2-10"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--list</span>               <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ดูก่อน</span></span>
<span id="cb2-11"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--skill</span> quarto        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้ง quarto</span></span>
<span id="cb2-12"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--agent</span> claude-code <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--global</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้ง global</span></span></code></pre></div></div>
<hr>
</section>
</section>
<section id="brand.yml-skills" class="level3">
<h3 class="anchored" data-anchor-id="brand.yml-skills">4. <em>brand.yml</em> Skills</h3>
<p><a href="https://posit-dev.github.io/brand-yml/">brand.yml</a> คือไฟล์ YAML ที่รวม brand guidelines ขององค์กร เช่น สี, font, และ logo ไว้ในที่เดียว แล้วใช้ได้กับทั้ง Quarto และ Shiny โดยอัตโนมัติ</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ตัวอย่าง _brand.yml เบื้องต้น</span></span>
<span id="cb3-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">color</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb3-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">palette</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb3-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">primary-blue</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#1B4F8A"</span></span>
<span id="cb3-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">primary</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> primary-blue</span></span>
<span id="cb3-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">typography</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb3-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fonts</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb3-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">family</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Sarabun</span></span>
<span id="cb3-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> google</span></span>
<span id="cb3-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">base</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Sarabun</span></span></code></pre></div></div>
<p>มี Skill ให้เลือกสองแหล่ง:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>แหล่ง</th>
<th>ลิงค์</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Posit (official)</td>
<td><a href="https://github.com/posit-dev/skills/tree/main/brand-yml">posit-dev/skills/brand-yml</a></td>
</tr>
<tr class="even">
<td>Stephen Turner</td>
<td><a href="https://github.com/stephenturner/skill-brand-yml">stephenturner/skill-brand-yml</a> + <a href="https://blog.stephenturner.us/p/brand-yml-claude-skill-uva-sds-quarto">blog post</a></td>
</tr>
</tbody>
</table>
<p>Stephen ได้เขียนอธิบาย process การพัฒนา Skill นี้ไว้ใน blog อ่านง่ายและเห็นภาพชัดมาก</p>
<hr>
</section>
<section id="learning-opportunities-cat-hicks" class="level3">
<h3 class="anchored" data-anchor-id="learning-opportunities-cat-hicks">5. Learning Opportunities — Cat Hicks</h3>
<blockquote class="blockquote">
<p>🔗 <a href="https://bsky.app/profile/grimalkina.bsky.social">Bluesky: <span class="citation" data-cites="grimalkina.bsky.social">@grimalkina.bsky.social</span></a></p>
</blockquote>
<p>ถ้ากังวลว่าการพึ่ง AI จะทำให้ทักษะ R เสื่อมลง — Skill นี้ออกแบบมาตอบโจทย์นั้นโดยตรง Cat Hicks ใช้แนวทาง <strong>“dynamic textbook”</strong> เพื่อให้ Claude ช่วยฝึกทักษะการเขียนโค้ดไปพร้อมกัน แทนที่จะทำให้เราเป็น passive user</p>
<blockquote class="blockquote">
<p>“Can you learn AND offload? Yes. We do it all the time across our days. You just cannot do every single thing at once, and have to think about the structural support for different goals.” — Cat Hicks</p>
</blockquote>
<hr>
</section>
</section>
<section id="วธตดตงและเรมใชงาน" class="level2">
<h2 class="anchored" data-anchor-id="วธตดตงและเรมใชงาน">วิธีติดตั้งและเริ่มใช้งาน</h2>
<section id="ตวเลอกท-1-ตดตงจาก-github-แนะนำ" class="level3">
<h3 class="anchored" data-anchor-id="ตวเลอกท-1-ตดตงจาก-github-แนะนำ">ตัวเลือกที่ 1 — ติดตั้งจาก GitHub (แนะนำ)</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb4-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เพิ่ม marketplace ก่อน</span></span>
<span id="cb4-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> marketplace add posit-dev/skills</span>
<span id="cb4-3"></span>
<span id="cb4-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้ง Skills ที่ต้องการ</span></span>
<span id="cb4-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install quarto@posit-dev-skills</span>
<span id="cb4-6"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install r-lib@posit-dev-skills</span>
<span id="cb4-7"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install shiny@posit-dev-skills</span></code></pre></div></div>
</section>
<section id="ตวเลอกท-2-ตดตงจากโฟลเดอร-local" class="level3">
<h3 class="anchored" data-anchor-id="ตวเลอกท-2-ตดตงจากโฟลเดอร-local">ตัวเลือกที่ 2 — ติดตั้งจากโฟลเดอร์ local</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb5-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> add /path/to/skill-directory</span></code></pre></div></div>
</section>
<section id="ตวเลอกท-3-ตดตงดวยตนเอง" class="level3">
<h3 class="anchored" data-anchor-id="ตวเลอกท-3-ตดตงดวยตนเอง">ตัวเลือกที่ 3 — ติดตั้งด้วยตนเอง</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb6-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Personal (ใช้ได้ทุก project)</span></span>
<span id="cb6-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">~/.claude/skills/ชื่อ-skill/</span></span>
<span id="cb6-3"></span>
<span id="cb6-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Project-level (ใช้เฉพาะ project นี้)</span></span>
<span id="cb6-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">.claude/skills/ชื่อ-skill/</span></span></code></pre></div></div>
<p>หลังจากวางไฟล์แล้ว Claude Code จะตรวจพบและใช้งาน Skill ได้ทันที <strong>ไม่ต้องทำอะไรเพิ่ม</strong></p>
</section>
<section id="ตดตงผาน-npx-cli" class="level3">
<h3 class="anchored" data-anchor-id="ตดตงผาน-npx-cli">ติดตั้งผ่าน npx CLI</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb7-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ดู Skills ทั้งหมดที่มีก่อน</span></span>
<span id="cb7-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--list</span></span>
<span id="cb7-3"></span>
<span id="cb7-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแบบ interactive menu</span></span>
<span id="cb7-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--all</span></span>
<span id="cb7-6"></span>
<span id="cb7-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้งแบบเจาะจง</span></span>
<span id="cb7-8"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--skill</span> cli <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--skill</span> lifecycle</span>
<span id="cb7-9"></span>
<span id="cb7-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ติดตั้ง global สำหรับ Claude Code</span></span>
<span id="cb7-11"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npx</span> skills add posit-dev/skills <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--agent</span> claude-code <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--global</span></span></code></pre></div></div>
<hr>
</section>
</section>
<section id="เชอมเขากบ-workflow-ไดยงไง" class="level2">
<h2 class="anchored" data-anchor-id="เชอมเขากบ-workflow-ไดยงไง">เชื่อมเข้ากับ workflow ได้ยังไง?</h2>
<p>สำหรับนักวิจัยหรือนักวิชาการที่ใช้ R เป็นหลัก Skills ช่วยได้จริงในสามจุด</p>
<section id="จดท-1-ความสมำเสมอของโคด" class="level3">
<h3 class="anchored" data-anchor-id="จดท-1-ความสมำเสมอของโคด">จุดที่ 1: ความสม่ำเสมอของโค้ด</h3>
<p>โดยเฉพาะในงานที่ต้องเขียนซ้ำในหลาย project เช่น data cleaning, spatial analysis, หรือ time series Skill แบบ Modern R ช่วยให้โค้ดที่ Claude ช่วยเขียนออกมาในทิศทางเดียวกันตลอด ไม่ต้องคอยแก้ style ซ้ำทุกครั้ง</p>
</section>
<section id="จดท-2-การนำเสนอผลงาน" class="level3">
<h3 class="anchored" data-anchor-id="จดท-2-การนำเสนอผลงาน">จุดที่ 2: การนำเสนอผลงาน</h3>
<p>Quarto Skill ช่วยให้ขั้นตอนจาก analysis ไปถึง report/manuscript สะดวกขึ้น และถ้าอยากทำ interactive dashboard เผยแพร่ให้ผู้ใช้เข้าถึงได้ bslib Skill ก็ช่วยลดเวลาในส่วน UI ได้มาก</p>
</section>
<section id="จดท-3-เรยนรไปพรอมกน" class="level3">
<h3 class="anchored" data-anchor-id="จดท-3-เรยนรไปพรอมกน">จุดที่ 3: เรียนรู้ไปพร้อมกัน</h3>
<p><strong>Learning Opportunities Skill</strong> ของ Cat Hicks ช่วยให้ Claude ทำหน้าที่เป็น “textbook แบบ dynamic” ที่ดึงให้เราคิดเองก่อน แล้วค่อยช่วยเติม แทนที่จะพึ่ง AI แบบ passive — เหมาะมากสำหรับคนที่กำลังเรียนรู้ทักษะใหม่ ๆ ไปด้วยระหว่างทำงาน</p>
<hr>
</section>
</section>
<section id="ทำ-skill-เองไดไหม" class="level2">
<h2 class="anchored" data-anchor-id="ทำ-skill-เองไดไหม">ทำ Skill เองได้ไหม?</h2>
<p>ได้เลย และไม่ยากอย่างที่คิด</p>
<blockquote class="blockquote">
<p>🔗 <a href="https://docs.anthropic.com/en/docs/claude-code/skills-overview">Anthropic: How to create custom Skills</a><br>
🔗 <a href="https://github.com/anthropics/skills">anthropics/skills — repository ตัวอย่าง</a></p>
</blockquote>
<p>โครงสร้างพื้นฐานของ Skill แค่นี้เอง:</p>
<pre><code>my-skill/
└── SKILL.md        # ไฟล์หลัก มี YAML frontmatter + instructions</code></pre>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode markdown code-with-copy"><code class="sourceCode markdown"><span id="cb9-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb9-2"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">name:</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> my-r-epidemiology-skill</span></span>
<span id="cb9-3"><span class="an" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">description:</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> &gt;</span></span>
<span id="cb9-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">  Guides Claude to use modern R patterns for plant disease</span></span>
<span id="cb9-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">  epidemiology analysis including spatial stats and time series.</span></span>
<span id="cb9-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">  Use when working with disease incidence, severity, or GPS data.</span></span>
<span id="cb9-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb9-8"></span>
<span id="cb9-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;"># Plant Disease Epidemiology Skill</span></span>
<span id="cb9-10"></span>
<span id="cb9-11"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## Guidelines</span></span>
<span id="cb9-12"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Use sf and terra for spatial data</span>
<span id="cb9-13"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Use tidyverse patterns throughout</span>
<span id="cb9-14"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Prefer native pipe |&gt;</span>
<span id="cb9-15">...</span></code></pre></div></div>
<p>วิธีที่ง่ายที่สุดคือดูตัวอย่าง Skill ที่คนอื่นทำแล้วปรับให้เข้ากับงานของตัวเอง หรือจะลองให้ Claude Code ช่วย generate Skill ใหม่จากตัวอย่างและคำอธิบายที่เราให้ก็ได้เช่นกัน</p>
<hr>
</section>
<section id="สรป-quick-reference" class="level2">
<h2 class="anchored" data-anchor-id="สรป-quick-reference">สรุป Quick Reference</h2>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Skill</th>
<th>ผู้สร้าง</th>
<th>เหมาะกับ</th>
<th>ลิงค์</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Modern R Guide</td>
<td>Sarah Johnson</td>
<td>tidyverse, dplyr modern</td>
<td><a href="https://gist.github.com/sj-io/3828d64d0969f2a0f05297e59e6c15ad">Gist</a></td>
</tr>
<tr class="even">
<td>Claude Code R Skills</td>
<td>Alistair Bailey</td>
<td>workflow แบบครบ + modular</td>
<td><a href="https://github.com/ab604/claude-code-r-skills">GitHub</a></td>
</tr>
<tr class="odd">
<td>Posit Skills (quarto)</td>
<td>Posit</td>
<td>R Markdown → Quarto migration</td>
<td><a href="https://github.com/posit-dev/skills/tree/main/quarto">GitHub</a></td>
</tr>
<tr class="even">
<td>Posit Skills (shiny)</td>
<td>Posit</td>
<td>Shiny modern bslib dashboard</td>
<td><a href="https://github.com/posit-dev/skills/tree/main/shiny">GitHub</a></td>
</tr>
<tr class="odd">
<td>Posit Skills (r-lib)</td>
<td>Posit</td>
<td>R package release checklist</td>
<td><a href="https://github.com/posit-dev/skills/tree/main/r-lib">GitHub</a></td>
</tr>
<tr class="even">
<td>brand.yml Skill (Posit)</td>
<td>Posit</td>
<td>branded Quarto/Shiny</td>
<td><a href="https://github.com/posit-dev/skills/tree/main/brand-yml">GitHub</a></td>
</tr>
<tr class="odd">
<td>brand.yml Skill</td>
<td>Stephen Turner</td>
<td>brand.yml สำหรับองค์กร</td>
<td><a href="https://github.com/stephenturner/skill-brand-yml">GitHub</a></td>
</tr>
<tr class="even">
<td>Learning Opportunities</td>
<td>Cat Hicks</td>
<td>เรียนรู้ขณะใช้ AI</td>
<td><a href="https://bsky.app/profile/grimalkina.bsky.social">Bluesky</a></td>
</tr>
<tr class="odd">
<td>Jeremy Allen Skills</td>
<td>Jeremy Allen</td>
<td>tidyverse + Posit updates</td>
<td><a href="https://github.com/jeremy-allen/claude-skills">GitHub</a></td>
</tr>
</tbody>
</table>
<hr>
</section>
<section id="อางอง" class="level2">
<h2 class="anchored" data-anchor-id="อางอง">อ้างอิง</h2>
<ul>
<li>Isabella Velásquez (2026). <a href="https://rworks.dev/posts/claude-skills-for-r-users/">A Few Claude Skills for R Users</a>. <em>R Works / R-bloggers</em>.</li>
<li><a href="https://docs.anthropic.com/en/docs/claude-code/skills-overview">Anthropic Claude Skills Documentation</a></li>
<li><a href="https://github.com/posit-dev/skills">Posit Claude Skills Repository</a></li>
<li><a href="https://github.com/anthropics/skills">anthropics/skills Repository</a></li>
</ul>


</section>

 ]]></description>
  <category>R</category>
  <category>Claude</category>
  <guid>https://kanthanawit.in.th/writing/claude-skills-for-rusers/</guid>
  <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/claude_r_skills.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>การเรียนรู้ไปพร้อมกับ AI</title>
  <link>https://kanthanawit.in.th/writing/learning_while_ai/</link>
  <description><![CDATA[ 




<p>ถ้าเคยรู้สึกว่า “เขียนโค้ดได้เร็วขึ้นมากตั้งแต่ใช้ AI แต่ทำไมรู้สึกว่าตัวเองไม่ได้เก่งขึ้นเลย” — ความรู้สึกนั้นไม่ได้เป็นแค่ความรู้สึก มันมีงานวิจัยรองรับ</p>
<p>Dr.&nbsp;Cat Hicks นักจิตวิทยาที่ศึกษาทีมซอฟต์แวร์มาหลายปี ได้สร้าง <strong>Learning Opportunities Skill</strong> ขึ้นมาเพื่อแก้ปัญหานี้โดยตรง ไม่ใช่แค่ “ฟีเจอร์เสริม” แต่เป็น Skill ที่มีรากฐานจากจิตวิทยาการเรียนรู้อย่างจริงจัง</p>
<blockquote class="blockquote">
<p>🔗 <a href="https://github.com/DrCatHicks/learning-opportunities">DrCatHicks/learning-opportunities</a><br>
🔗 <a href="https://github.com/DrCatHicks/learning-goal">DrCatHicks/learning-goal</a> <em>(Skill คู่หูที่ควรใช้ด้วยกัน)</em></p>
</blockquote>
<blockquote class="bluesky-embed blockquote" data-bluesky-uri="at://did:plc:yjvayj5thzisljwor7yykhlx/app.bsky.feed.post/3mevvbm3a6s26" data-bluesky-cid="bafyreigsjkiynnec4bfmouz7gfo34v7qyv67yn2px3rouxswkz7xezb7fa" data-bluesky-embed-color-mode="system">
<p lang="en">
Can you learn AND offload? Yes. We do it all the time across our days. You just cannot do every single thing at once, and have to think about the structural support for different (sometimes competing) goals. Self-regulation isn't new, but it is a vital skill for developers now.
</p>
— Cat Hicks (<a href="https://bsky.app/profile/did:plc:yjvayj5thzisljwor7yykhlx?ref_src=embed"><span class="citation" data-cites="grimalkina.bsky.social">@grimalkina.bsky.social</span></a>) <a href="https://bsky.app/profile/did:plc:yjvayj5thzisljwor7yykhlx/post/3mevvbm3a6s26?ref_src=embed">15 กุมภาพันธ์ 2569 เวลา 22:51</a>
</blockquote>
<script async="" src="https://embed.bsky.app/static/embed.js" charset="utf-8"></script>
<hr>
<section id="ทำไม-ai-ถงทำใหเราเรยนรไดนอยลง" class="level2">
<h2 class="anchored" data-anchor-id="ทำไม-ai-ถงทำใหเราเรยนรไดนอยลง">ทำไม AI ถึงทำให้เราเรียนรู้ได้น้อยลง?</h2>
<p>ก่อนพูดถึงวิธีแก้ ต้องเข้าใจปัญหาก่อน Cat Hicks อธิบายไว้ผ่าน <strong>5 กลไกทางจิตวิทยา</strong> ที่ AI coding tools ทำให้เกิดขึ้นโดยไม่รู้ตัว</p>
<section id="generation-effect-ถกทำลาย" class="level3">
<h3 class="anchored" data-anchor-id="generation-effect-ถกทำลาย">1. Generation Effect ถูกทำลาย</h3>
<p>งานวิจัยด้านการเรียนรู้พบว่า การ <em>สร้าง</em> ข้อมูลขึ้นมาเองจากความจำหรือความเข้าใจ ให้ผลการจดจำที่ดีกว่าการ <em>รับ</em> ข้อมูลที่คนอื่นเตรียมมาให้อย่างมาก เรียกว่า <strong>generation effect</strong></p>
<p>เมื่อเราขอโค้ดจาก AI แล้วกด Accept — กระบวนการ “คิดสร้าง” ถูกข้ามไปทั้งหมด โค้ดที่ได้อาจถูกต้อง แต่ไม่ได้สร้างความเข้าใจในหัวเรา</p>
</section>
<section id="fluency-illusion-โคดสวยทำใหเขาใจผดวาตวเองเขาใจ" class="level3">
<h3 class="anchored" data-anchor-id="fluency-illusion-โคดสวยทำใหเขาใจผดวาตวเองเขาใจ">2. Fluency Illusion — โค้ดสวยทำให้เข้าใจผิดว่าตัวเองเข้าใจ</h3>
<p>โค้ดที่ AI เขียนออกมาโดยทั่วไปสะอาด มีโครงสร้างชัด อ่านเข้าใจง่าย สิ่งนี้สร้าง <strong>ภาพลวงตาของความเข้าใจ</strong> เราอ่านผ่านแล้วรู้สึกว่า “โอเค เข้าใจแล้ว” ทั้งที่จริง ๆ ยังไม่ได้ <em>เข้าใจ</em> แต่แค่ <em>อ่านผ่าน</em></p>
<p>ผลก็คือเมื่อต้องเขียนอะไรคล้ายกันในอีกสองอาทิตย์ต่อมา เราก็ไม่รู้จะเริ่มยังไง</p>
</section>
<section id="spacing-effect-ถกทำลาย" class="level3">
<h3 class="anchored" data-anchor-id="spacing-effect-ถกทำลาย">3. Spacing Effect ถูกทำลาย</h3>
<p>การเรียนรู้ที่ยั่งยืนต้องการ <strong>การหยุดพัก</strong> ระหว่างช่วงการเรียน งานวิจัยพิสูจน์ว่า spaced repetition ให้ผลดีกว่า cramming อย่างมีนัยสำคัญ</p>
<p>แต่ AI ผลักดัน velocity — เราทำงานต่อเนื่องยาวนานโดยไม่มีจังหวะหยุดคิด จังหวะที่สมองต้องการเพื่อ consolidate การเรียนรู้ถูกยกเลิกไปโดยปริยาย</p>
</section>
<section id="metacognition-ถกบดบง" class="level3">
<h3 class="anchored" data-anchor-id="metacognition-ถกบดบง">4. Metacognition ถูกบดบัง</h3>
<p><strong>Metacognition</strong> คือความสามารถในการ “คิดเกี่ยวกับการคิดของตัวเอง” รู้ว่าตัวเองเข้าใจอะไร และยังขาดตรงไหน</p>
<p>Workflow ที่เร็วเกินไปไม่เปิดพื้นที่ให้สมองทำงานส่วนนี้ เราจึงสร้าง mental model ที่ผิดหรือไม่ครบ โดยไม่รู้ว่ามันผิด</p>
</section>
<section id="testing-effect-ถกยกเลก" class="level3">
<h3 class="anchored" data-anchor-id="testing-effect-ถกยกเลก">5. Testing Effect ถูกยกเลิก</h3>
<p>การ “ดึงความรู้ออกมาจากหัว” ผ่านการทดสอบตัวเองหรือการอธิบาย เป็นวิธีที่ทำให้ความรู้ฝังแน่นที่สุด วิทยาศาสตร์เรียกว่า <strong>retrieval practice</strong></p>
<p>AI มักให้คำตอบเต็มโดยอัตโนมัติ เราไม่เคยต้องดิ้นรนดึงความรู้ออกมา และนั่นคือสิ่งที่ทำให้ความรู้ไม่ถูก “บันทึก” อย่างแน่นหนา</p>
<hr>
</section>
</section>
<section id="แนวคดหลก-dynamic-textbook" class="level2">
<h2 class="anchored" data-anchor-id="แนวคดหลก-dynamic-textbook">แนวคิดหลัก: Dynamic Textbook</h2>
<p>Cat Hicks เรียก Skill ของเขาว่า <strong>“dynamic textbook”</strong> แนวคิดคือแทนที่จะให้ Claude ทำทุกอย่างแทนเรา Skill นี้ทำให้ Claude เปลี่ยนบทบาทเป็น <strong>โค้ชการเรียนรู้</strong> ที่:</p>
<ul>
<li>รอให้เราทำงานสำคัญเสร็จก่อน</li>
<li>แล้วเสนอ exercise สั้น ๆ 10–15 นาที</li>
<li><strong>หยุดรอคำตอบจากเรา</strong> แทนที่จะตอบแทน</li>
<li>ให้ feedback ที่เชื่อมความคิดของเรากับสิ่งที่เกิดขึ้นจริง</li>
</ul>
<blockquote class="blockquote">
<p><strong>กฎเหล็กของ Skill นี้:</strong> Claude ถามคำถามแล้วหยุด ไม่ hint ไม่ให้ตัวอย่าง ไม่บอกคำตอบ รอให้เราตอบก่อนเท่านั้น</p>
</blockquote>
<hr>
</section>
<section id="เมอไหร-skill-จะ-activate" class="level2">
<h2 class="anchored" data-anchor-id="เมอไหร-skill-จะ-activate">เมื่อไหร่ Skill จะ Activate</h2>
<p>Claude จะเสนอ exercise หลังจากเราทำงานต่อไปนี้เสร็จ:</p>
<ul>
<li>สร้างไฟล์หรือ module ใหม่</li>
<li>เปลี่ยน database schema</li>
<li>ตัดสินใจด้าน architecture หรือทำ refactor</li>
<li>implement pattern ที่ไม่คุ้นเคย</li>
<li>ช่วงที่เราถามคำถาม “ทำไม” ระหว่าง session</li>
</ul>
<p>Claude จะถามว่า:</p>
<blockquote class="blockquote">
<p><em>“Would you like to do a quick learning exercise on [หัวข้อนั้น]? About 10–15 minutes.”</em></p>
</blockquote>
<p>เราสามารถปฏิเสธได้ตลอด และ Claude จะไม่เสนออีกในเซสชั่นนั้น (หรือถ้าทำ exercise ไปแล้ว 2 ครั้งในเซสชั่นเดียวกัน)</p>
<hr>
</section>
<section id="exercise-ทง-6-แบบ-พรอมตวอยาง" class="level2">
<h2 class="anchored" data-anchor-id="exercise-ทง-6-แบบ-พรอมตวอยาง">Exercise ทั้ง 6 แบบ พร้อมตัวอย่าง</h2>
<section id="แบบท-1-prediction-observation-reflection" class="level3">
<h3 class="anchored" data-anchor-id="แบบท-1-prediction-observation-reflection">แบบที่ 1: Prediction → Observation → Reflection</h3>
<p>เหมาะสุดสำหรับการเรียนรู้ behavior ของโค้ด</p>
<p><strong>ขั้นตอน:</strong> 1. Claude ถาม: <em>“What do you predict will happen when [scenario]?”</em> แล้วหยุด 2. เราตอบ (ถูกหรือผิดก็ได้ — ผิดยิ่งดีสำหรับการเรียนรู้) 3. เดินผ่าน behavior จริงด้วยกัน 4. Claude ถามอีก: <em>“What surprised you? What matched your expectations?”</em></p>
<p><strong>ตัวอย่างสำหรับคนใช้ R:</strong></p>
<pre><code>Claude: "You just created a function using group_by() and summarise().
What do you predict will happen if one of the grouping variables
has NA values? (Take your best guess — wrong predictions are useful data.)"

[รอคำตอบเรา]

[หลังเราตอบ]
Claude: เดินผ่าน behavior จริงของ dplyr กับ NA ใน group_by()
แล้วถาม: "What surprised you about how dplyr handles this?"</code></pre>
<hr>
</section>
<section id="แบบท-2-generation-comparison" class="level3">
<h3 class="anchored" data-anchor-id="แบบท-2-generation-comparison">แบบที่ 2: Generation → Comparison</h3>
<p>เหมาะสำหรับทำความเข้าใจว่าทำไมโค้ดถึงถูกเขียนแบบนั้น</p>
<p><strong>ขั้นตอน:</strong> 1. Claude ถาม: <em>“Before I show you how we handle [X], sketch out how you’d approach it”</em> แล้วหยุด 2. เราเขียน approach ของตัวเอง (แค่ rough idea ไม่ต้อง code สมบูรณ์) 3. Claude แสดง implementation จริง 4. Claude ถาม: <em>“What’s similar? What’s different, and why do you think we went this direction?”</em></p>
<p><strong>ตัวอย่างสำหรับคนใช้ R:</strong></p>
<pre><code>Claude: "Before I show you how we're reading the GPS coordinates CSV,
sketch out how you'd approach validating that latitude is between
-90 and 90, and longitude between -180 and 180."

[รอคำตอบเรา — เราเขียน approach คร่าว ๆ]

[หลังเราตอบ]
Claude: แสดง implementation จริงที่ใช้ dplyr::filter() กับ between()
แล้วถาม: "What's similar to your approach? What did we handle differently?"</code></pre>
<hr>
</section>
<section id="แบบท-3-trace-the-path" class="level3">
<h3 class="anchored" data-anchor-id="แบบท-3-trace-the-path">แบบที่ 3: Trace the Path</h3>
<p>เหมาะสำหรับทำความเข้าใจ flow ของข้อมูลหรือ execution</p>
<p><strong>ขั้นตอน:</strong> 1. Claude ตั้ง scenario พร้อม specific values 2. ถามว่าเกิดอะไรขึ้นที่จุดแรก แล้วหยุดรอ 3. เดินต่อทีละ step จนจบ</p>
<p><strong>ตัวอย่างสำหรับคนใช้ R:</strong></p>
<pre><code>Claude: "We have a data frame with 1,000 rice field observations.
Severity scores are 0–4. We run: df |&gt; filter(severity &gt; 2) |&gt;
group_by(province) |&gt; summarise(mean_sev = mean(severity))

The data enters filter(). What happens next?"

[รอคำตอบเรา]

[หลังตอบ]
Claude: "Now it enters group_by(). What does group_by() actually
do to the data frame at this point?"

[รอคำตอบเรา]
...และเดินต่อไปทีละขั้น</code></pre>
<hr>
</section>
<section id="แบบท-4-debug-this" class="level3">
<h3 class="anchored" data-anchor-id="แบบท-4-debug-this">แบบที่ 4: Debug This</h3>
<p>เหมาะสำหรับสร้างความเข้าใจเรื่อง edge cases และ failure modes</p>
<p><strong>ขั้นตอน:</strong> 1. Claude แสดง bug หรือ edge case ที่เป็นไปได้ 2. ถาม: <em>“What would go wrong here, and why?”</em> แล้วหยุด 3. หลังเราตอบ ถามว่า <em>“How would you fix it?”</em> 4. คุยเรื่อง approach ของเรา</p>
<p><strong>ตัวอย่างสำหรับคนใช้ R:</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Claude แสดงโค้ดนี้:</span></span>
<span id="cb4-2">calculate_disease_index <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(incidence, severity) {</span>
<span id="cb4-3">  (incidence <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> severity) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span></span>
<span id="cb4-4">}</span>
<span id="cb4-5"></span>
<span id="cb4-6">Claude<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What would go wrong here if someone passes</span></span>
<span id="cb4-7"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">incidence = 110 (which shouldn't be possible but might happen</span></span>
<span id="cb4-8"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">from data entry errors)? Why is that a problem?"</span></span>
<span id="cb4-9"></span>
<span id="cb4-10">[รอคำตอบเรา]</span>
<span id="cb4-11"></span>
<span id="cb4-12">Claude<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"How would you add input validation to prevent this?"</span></span></code></pre></div></div>
<hr>
</section>
<section id="แบบท-5-teach-it-back" class="level3">
<h3 class="anchored" data-anchor-id="แบบท-5-teach-it-back">แบบที่ 5: Teach It Back</h3>
<p>เหมาะที่สุดสำหรับ “ทดสอบ” ว่าเราเข้าใจจริงหรือแค่คิดว่าเข้าใจ</p>
<p><strong>ขั้นตอน:</strong> 1. Claude ถาม: <em>“Explain how [component] works as if I’m a new developer joining the project”</em> 2. หยุดรอคำอธิบายของเรา 3. ให้ feedback: อะไรที่เราอธิบายได้ดี และอะไรที่ควรเพิ่มเติม</p>
<p><strong>ทำไมแบบนี้ถึงได้ผล:</strong> ถ้าเราอธิบายให้คนอื่นฟังไม่ได้ แสดงว่าเราไม่ได้เข้าใจจริง การ “สอน” ผลักดันให้สมองจัดระเบียบความรู้ใหม่</p>
<p><strong>ตัวอย่าง:</strong></p>
<pre><code>Claude: "Explain how our spatial join between disease survey points
and province boundaries works — as if you're onboarding
a new research assistant who knows R but hasn't seen this code."

[รอคำอธิบายของเรา]

Claude: [ให้ feedback ว่าอธิบายได้ดีตรงไหน และขาดอะไร]</code></pre>
<hr>
</section>
<section id="แบบท-6-retrieval-check-in" class="level3">
<h3 class="anchored" data-anchor-id="แบบท-6-retrieval-check-in">แบบที่ 6: Retrieval Check-in</h3>
<p>เหมาะสำหรับต้น session เมื่อกลับมาทำงานต่อจากวันก่อน</p>
<p><strong>ขั้นตอน:</strong> 1. Claude ถาม: <em>“Quick check — what do you remember about how [component] handles [scenario]?”</em> 2. หยุดรอ 3. เติมช่องว่างหรือยืนยันสิ่งที่เราจำได้</p>
<p><strong>นี่คือ spaced repetition ในทางปฏิบัติ</strong> — การดึงความรู้ออกมาจากหัวด้วยตัวเองครั้งหนึ่ง ให้ผลการจดจำระยะยาวดีกว่าการอ่านทบทวนหลายครั้ง</p>
<hr>
</section>
</section>
<section id="skill-คห-learning-goal" class="level2">
<h2 class="anchored" data-anchor-id="skill-คห-learning-goal">Skill คู่หู: Learning Goal</h2>
<p><a href="https://github.com/DrCatHicks/learning-goal">Learning Goal Skill</a> ออกแบบมาทำงานคู่กับ Learning Opportunities โดยตรง ถ้า Learning Opportunities คือ “how to practice” ตัวนี้คือ “what to learn and why”</p>
<p>ใช้เทคนิคที่เรียกว่า <strong>MCII (Mental Contrasting with Implementation Intentions)</strong> ซึ่งเป็น intervention ที่ Cat Hicks ทดสอบกับคนหลายร้อยคนในที่ทำงานจริง และวัดผลได้ว่าเพิ่ม behavioral follow-through ได้จริง</p>
<section id="กระบวนการ-7-ขน-ใชเวลา-1015-นาท" class="level3">
<h3 class="anchored" data-anchor-id="กระบวนการ-7-ขน-ใชเวลา-1015-นาท">กระบวนการ 7 ขั้น (ใช้เวลา 10–15 นาที)</h3>
<p><strong>ขั้นที่ 1: ตั้งเป้าหมาย</strong> ระบุทักษะหรือสิ่งที่อยากเรียนรู้ให้ชัดเจน Claude จะช่วยขัดเกลาให้ specific ขึ้น แต่ไม่เขียนแทน</p>
<p>ตัวอย่าง: จาก <em>“อยากเก่ง Python”</em> → <em>“อยากเขียน spatial analysis ด้วย geopandas ให้ได้ภายใน 3 เดือน โดยไม่ต้องดู documentation ทุกบรรทัด”</em></p>
<p><strong>ขั้นที่ 2: Strengthen the Goal</strong> Claude ตรวจสอบเป้าหมายด้วย SMART framework เฉพาะมิติที่อ่อนแอที่สุด ถ้าเป้าหมายชัดแล้ว ขั้นนี้จะสั้นมาก</p>
<p><strong>ขั้นที่ 3: Visualize the Outcome</strong> อธิบายสั้น ๆ ว่าทำไมเป้าหมายนี้ถึงสำคัญ และชีวิตหรือการทำงานเปลี่ยนไปอย่างไรเมื่อทำได้ ขั้นนี้คือการสร้าง “desired future” ในหัว ซึ่งเป็นส่วนสำคัญของ mental contrasting</p>
<p><strong>ขั้นที่ 4: ระบุอุปสรรค</strong> Claude ขอให้เราระบุสถานการณ์จริงที่น่าจะทำให้เราไม่ไปถึงเป้า เช่น <em>“เวลาถึงวันศุกร์บ่าย งานด่วนจะดูดเวลาที่ตั้งใจไว้เรียน”</em> หรือ <em>“เวลาเจอ error ยาว ๆ จะถามคนอื่นแทนที่จะลองคิดเอง”</em></p>
<blockquote class="blockquote">
<p><strong>สำคัญมาก:</strong> Claude ไม่แนะนำอุปสรรคแทน เพราะงานวิจัยพบว่าอุปสรรคที่เราคิดเองสร้าง mental association ที่แข็งแกร่งกว่าอย่างมีนัยสำคัญ</p>
</blockquote>
<p><strong>ขั้นที่ 5: สร้าง If-Then Plans</strong> สำหรับแต่ละอุปสรรค ให้สร้าง if-then plan ที่ชัดเจน:</p>
<blockquote class="blockquote">
<p><em>“ถ้า [สถานการณ์อุปสรรค] → ฉันจะ [action ที่ชัดเจน]”</em></p>
</blockquote>
<p>ตัวอย่าง:<br>
&gt; <em>“ถ้าวันศุกร์บ่ายมีงานด่วนเข้ามา → ฉันจะย้าย learning session ไปเช้าวันจันทร์ก่อนเปิด email”</em></p>
<blockquote class="blockquote">
<p><em>“ถ้าติด error นานกว่า 20 นาที → ฉันจะเขียนสิ่งที่ลองไปแล้วก่อนที่จะขอความช่วยเหลือ”</em></p>
</blockquote>
<p><strong>ขั้นที่ 6: Reaffirm or Adjust</strong> หลังเผชิญกับอุปสรรคในใจแล้ว ทบทวนว่าเป้าหมายยังสมเหตุสมผลไหม ปรับถ้าจำเป็น ยืนยันถ้าใช่</p>
<p><strong>ขั้นที่ 7: ออก Learning Goal Card</strong> Claude สร้าง markdown file สรุปเป้าหมาย เหตุผล if-then plans และ first step ที่ชัดเจน ไว้ใน project ได้เลย</p>
<hr>
</section>
</section>
<section id="วธตดตง" class="level2">
<h2 class="anchored" data-anchor-id="วธตดตง">วิธีติดตั้ง</h2>
<section id="ตดตง-learning-opportunities" class="level3">
<h3 class="anchored" data-anchor-id="ตดตง-learning-opportunities">ติดตั้ง Learning Opportunities</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb6-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. เพิ่ม marketplace</span></span>
<span id="cb6-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> marketplace add https://github.com/DrCatHicks/learning-opportunities.git</span>
<span id="cb6-3"></span>
<span id="cb6-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. ติดตั้ง plugin</span></span>
<span id="cb6-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install learning-opportunities@learning-opportunities</span>
<span id="cb6-6"></span>
<span id="cb6-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. Restart Claude Code</span></span></code></pre></div></div>
<p><strong>Bonus: ตั้งให้ทำงานอัตโนมัติหลัง git commit (Linux/macOS)</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb7-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install learning-opportunities-auto@learning-opportunities</span></code></pre></div></div>
<p>เมื่อติดตั้งแล้ว Claude จะพิจารณาเสนอ exercise หลังแต่ละ <code>git commit</code> อัตโนมัติ</p>
</section>
<section id="ตดตง-learning-goal-คห" class="level3">
<h3 class="anchored" data-anchor-id="ตดตง-learning-goal-คห">ติดตั้ง Learning Goal (คู่หู)</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb8-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> marketplace add https://github.com/DrCatHicks/learning-goal.git</span>
<span id="cb8-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/plugin</span> install learning-goal@learning-goal</span></code></pre></div></div>
<hr>
</section>
</section>
<section id="วธปรบ-skill-ใหเขากบงานของตวเอง" class="level2">
<h2 class="anchored" data-anchor-id="วธปรบ-skill-ใหเขากบงานของตวเอง">วิธีปรับ Skill ให้เข้ากับงานของตัวเอง</h2>
<p>Cat Hicks เขียนไว้ชัดเจนใน README ว่า Skill นี้ออกแบบมาให้ปรับได้ มีแนวทางดังนี้:</p>
<p><strong>บอก Claude เรื่องระดับความรู้ของตัวเอง</strong> เพื่อให้ exercise เริ่มที่ระดับที่เหมาะสม เช่น เพิ่มใน CLAUDE.md ของ project:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode markdown code-with-copy"><code class="sourceCode markdown"><span id="cb9-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## Learning Context</span></span>
<span id="cb9-2"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>ภาษา R: เชี่ยวชาญ เน้น tidyverse และ spatial analysis</span>
<span id="cb9-3"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>ภาษา Python: กำลังเรียนรู้ ยังต้องการคำอธิบาย syntax</span>
<span id="cb9-4"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>เป้าหมาย: เขียน geopandas workflow ได้โดยไม่ดู documentation</span></code></pre></div></div>
<p><strong>ปรับ trigger conditions</strong> ถ้าอยากให้ Claude เสนอ exercise ต่างจาก default เช่น เฉพาะเมื่อสร้างไฟล์ใหม่ ไม่ใช่ทุก refactor</p>
<p><strong>เพิ่มจำนวน exercise สูงสุดต่อ session</strong> default คือ 2 ครั้ง ถ้าอยากเรียนมากกว่านั้นก็ได้</p>
<p><strong>ใส่ domain-specific retrieval questions</strong> เช่น ถ้าทำงานด้านระบาดวิทยาโรคพืช อาจบอก Claude ว่าให้ถาม check-in เรื่อง spatial stats หรือ disease incidence formula</p>
<hr>
</section>
<section id="ตวอยาง-session-จรง-สำหรบนกวจยทใช-r" class="level2">
<h2 class="anchored" data-anchor-id="ตวอยาง-session-จรง-สำหรบนกวจยทใช-r">ตัวอย่าง Session จริง: สำหรับนักวิจัยที่ใช้ R</h2>
<p>สมมติว่ากำลังสร้าง function วิเคราะห์ข้อมูลความรุนแรงของโรคในแปลงนา และเพิ่งเขียนเสร็จ</p>
<p><strong>Claude เสนอ:</strong> &gt; “You just implemented a disease severity calculator using weighted incidence. Would you like a quick learning exercise on how R handles the NA values in your severity scores? About 10–15 minutes.”</p>
<p><strong>เลือก Yes:</strong></p>
<blockquote class="blockquote">
<p><strong>Claude:</strong> “Before we test it — what do you predict will happen when severity_score contains NA and you run <code>mean(severity_score)</code>? (Take your best guess — wrong predictions are useful data.)”</p>
</blockquote>
<pre><code>[เราตอบ: "น่าจะคืน NA กลับมา"]</code></pre>
<blockquote class="blockquote">
<p><strong>Claude:</strong> “Correct. Now — what do you predict <code>mean(severity_score, na.rm = TRUE)</code> will return, and is that always the right choice for your disease index calculation?”</p>
</blockquote>
<pre><code>[เราตอบ]</code></pre>
<blockquote class="blockquote">
<p><strong>Claude:</strong> [อธิบาย implication ของ na.rm = TRUE ในบริบทของ disease index และถามต่อ]<br>
“What would you do differently if NA meant ‘field not surveyed’ vs ‘data entry error’?”</p>
</blockquote>
<p>นี่คือ exercise แบบ Prediction → Observation → Reflection ที่เชื่อม concept ทั่วไปกับบริบทงานจริงของเรา</p>
<hr>
</section>
<section id="ทำไม-skill-นถงพเศษกวา-skill-อน" class="level2">
<h2 class="anchored" data-anchor-id="ทำไม-skill-นถงพเศษกวา-skill-อน">ทำไม Skill นี้ถึงพิเศษกว่า Skill อื่น</h2>
<p>Skills ส่วนใหญ่ในโลกของ Claude Code ออกแบบมาเพื่อให้ Claude ทำงานได้ <em>ดีขึ้น</em> หรือ <em>ถูกต้องขึ้น</em></p>
<p>Learning Opportunities Skill ออกแบบมาเพื่อให้ <em>เรา</em> เรียนรู้ได้มากขึ้นระหว่างใช้ AI — นั่นคือเป้าหมายที่ต่างกันโดยพื้นฐาน</p>
<p>Cat Hicks เขียนไว้ใน README อย่างตรงไปตรงมาว่า Skill นี้จะ “รู้สึกต่างจาก highly fluent agentic coding” และนั่นคือตั้งใจ เพราะความ “ลื่น” คือสิ่งที่ทำให้เราไม่ได้เรียนรู้</p>
<p>สำหรับนักวิชาการหรือนักวิจัยที่อยากใช้ AI เป็นเครื่องมือแต่ยังอยากรักษาและพัฒนาทักษะที่แท้จริงไปด้วย — อันนี้คือคำตอบที่มีหลักวิทยาศาสตร์รองรับมากที่สุดที่พี่เจอมา</p>
<hr>
</section>
<section id="อางอง" class="level2">
<h2 class="anchored" data-anchor-id="อางอง">อ้างอิง</h2>
<ul>
<li><a href="https://github.com/DrCatHicks/learning-opportunities">DrCatHicks/learning-opportunities</a> — GitHub repo (CC-BY 4.0)</li>
<li><a href="https://github.com/DrCatHicks/learning-goal">DrCatHicks/learning-goal</a> — Learning Goal Skill (CC-BY 4.0)</li>
<li><a href="https://drcathicks.com">drcathicks.com</a> — เว็บไซต์ Cat Hicks</li>
<li><a href="https://www.fightforthehuman.com">Fight for the Human newsletter</a> — newsletter ของ Cat Hicks เรื่อง psychology of software teams</li>
<li>Hicks, C.M. et al.&nbsp;(2025). The New Developer: AI Skill Threat, Identity Change &amp; Developer Thriving. <a href="https://doi.org/10.31234/osf.io/2gej5_v2">doi:10.31234/osf.io/2gej5_v2</a></li>
<li>Soderstrom, N.C. &amp; Bjork, R.A. (2015). Learning versus performance: An integrative review. <em>Perspectives on Psychological Science</em>, 10(2), 176–199.</li>
<li>Dunlosky, J. et al.&nbsp;(2013). Improving students’ learning with effective learning techniques. <em>Psychological Science in the Public Interest</em>, 14(1), 4–58.</li>
</ul>


</section>

 ]]></description>
  <category>R</category>
  <category>Claude</category>
  <guid>https://kanthanawit.in.th/writing/learning_while_ai/</guid>
  <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>ANOVA type สำคัญ นะ ควรรู้ไว้</title>
  <link>https://kanthanawit.in.th/writing/anova_types/</link>
  <description><![CDATA[ 




<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>ANOVA type
</div>
</div>
<div class="callout-body-container callout-body">
<p>ได้นำคำอธิบายมาจาก <a href="https://schmidtpaul.github.io/dsfair_quarto/ch/summaryarticles/anovatypes.html">DSFAIR - Data Science for Agriculture in R</a></p>
</div>
</div>
<section id="anova-มประเภทดวยหรอ-แลวมกประเภท-แตกตางกนอยางไร" class="level2">
<h2 class="anchored" data-anchor-id="anova-มประเภทดวยหรอ-แลวมกประเภท-แตกตางกนอยางไร">ANOVA มีประเภทด้วยหรือ แล้วมีกี่ประเภท แตกต่างกันอย่างไร</h2>
<p>ในโลกของการวิเคราะห์สถิติ และถ้าไปเกี่ยวพันเข้ากับแบบจำลองเชิงเส้น การเข้าใจความแตกต่างของ ANOVA (Type I, II และ III) นั้นสำคัญมาก เพราะแต่ละประเภทจะแตกต่างกันที่ “วิธีการคำนวณค่า Sum of Squares (SS)” หรือการจัดสรรความแปรปรวนให้กับตัวแปรต่าง ๆ ในโมเดล โดยเฉพาะเมื่อบรบทของของข้อมูลที่ไม่สมดุล</p>
<ol type="1">
<li><strong>Type I ANOVA (Sequential Sum of Squares)</strong></li>
</ol>
<p>หลักการ: เป็นการวิเคราะห์แบบ “ลำดับก่อนหลัง” (Sequential)</p>
<p>การทำงาน: โปรแกรมจะคำนวณนัยสำคัญของตัวแปรตามลำดับที่คุณใส่ในโมเดล เช่น หากคุณใส่โมเดลเป็น Yield ~ A + B โปรแกรมจะทดสอบอิทธิพลของ A ก่อน จากนั้นจึงทดสอบ B โดยดูว่า B ช่วยอธิบายความแปรปรวนที่เหลือจาก A ได้มากน้อยแค่ไหน</p>
<p>ข้อควรระวัง: ลำดับการใส่ตัวแปรมีผลมาก หากสลับที่กัน ค่าสถิติ (F-test และ p-value) อาจเปลี่ยนไปทันทีในกรณีที่ข้อมูลไม่สมดุล</p>
<p>เหมาะสำหรับ: งานวิจัยที่มีลำดับความสำคัญชัดเจน เช่น ต้องคุมตัวแปรสภาพแวดล้อมก่อนดูผลของพันธุ์ข้าว</p>
<ol start="2" type="1">
<li><strong>Type II ANOVA (Hierarchical Sum of Squares)</strong> หลักการ: เป็นการวิเคราะห์แบบ “ลำดับชั้น” (Hierarchical) ที่ไม่ขึ้นกับลำดับการใส่ตัวแปร</li>
</ol>
<p><strong>การทำงาน</strong>: ทดสอบอิทธิพลหลัก (Main Effect) แต่ละตัวโดยคำนึงถึงอิทธิพลหลักตัวอื่น ๆ ในโมเดล แต่จะ ไม่พิจารณาปฏิสัมพันธ์ (Interaction)</p>
<p><strong>จุดเด่น</strong>: ให้ผลลัพธ์ที่คงที่ไม่ว่าจะสลับลำดับตัวแปรอย่างไร เหมาะมากสำหรับโมเดลที่มีเฉพาะอิทธิพลหลัก (Main effects only)</p>
<ol start="3" type="1">
<li><strong>Type III ANOVA (Marginal Sum of Squares)</strong></li>
</ol>
<p>หลักการ: เป็นการวิเคราะห์แบบ “ส่วนขอบ” (Marginal)</p>
<p><strong>การทำงาน</strong>: ทดสอบอิทธิพลหลักแต่ละตัวโดยคำนึงถึงตัวแปรอื่น ๆ ทั้งหมด ในโมเดล รวมถึงปฏิสัมพันธ์ (Interaction) ด้วย</p>
<p><strong>จุดเด่น</strong>: เป็นวิธีที่นิยมใช้ที่สุดเมื่อโมเดลมี Interaction (เช่น พันธุ์ x ปุ๋ย) และข้อมูลไม่สมดุล เพราะมีความทนทาน (Robust) ต่อลำดับของตัวแปรในโมเดล.</p>
</section>
<section id="ผล-anova-แตกตางกน-เมอ" class="level2">
<h2 class="anchored" data-anchor-id="ผล-anova-แตกตางกน-เมอ">ผล ANOVA แตกต่างกัน เมื่อ</h2>
<p>เพื่อให้คุณเห็นภาพชัดเจนว่าทำไมเราถึงต้องเลือกใช้ประเภทของ ANOVA ให้ถูกกาลเทศะครับ</p>
<p>ประเด็นสำคัญคือความแตกต่างของผลลัพธ์จะขึ้นอยู่กับ “ความสมดุลของข้อมูล” (Balance of Data) เป็นหลักครับ โดยสรุปได้ดังนี้:</p>
<ol type="1">
<li>ข้อมูลที่สมดุล (Balanced Datasets) สถานการณ์: คือการทดลองที่ทุกกลุ่ม (Treatment) มีจำนวนซ้ำเท่ากัน เช่น พันธุ์ข้าว A มี 4 ซ้ำ พันธุ์ B ก็มี 4 ซ้ำ</li>
</ol>
<p>ผลลัพธ์: ในกรณีนี้ ANOVA ทั้ง 3 Type มักจะให้ผลลัพธ์ “เหมือนกัน” ดังนั้นคุณจะใช้คำสั่งไหนก็ได้ ผลสรุปงานวิจัยจะไม่ต่างกันครับ</p>
<ol start="2" type="1">
<li>ข้อมูลที่ไม่สมดุล (Unbalanced Datasets)ความต่างจะปรากฏชัดเจนเมื่อข้อมูลไม่สมดุล (เช่น บางซ้ำในบางแปลงเสียหายไป หรือเก็บข้อมูลได้ไม่เท่ากัน)
<ul>
<li>เรื่องลำดับของตัวแปร (Order of terms)</li>
<li>Type I: ผลลัพธ์จะ “เปลี่ยนไปตามลำดับ” ของตัวแปรที่คุณใส่ในโมเดล เช่น ถ้าคุณใส่ พันธุ์ข้าว + ปุ๋ย ผลอาจต่างจาก ปุ๋ย + พันธุ์ข้าว</li>
<li>Type II และ III: จะให้ผลลัพธ์ที่ “คงเดิมเสมอ” ไม่ว่าคุณจะสลับลำดับตัวแปรอย่างไร</li>
</ul></li>
</ol>
<ul>
<li>เรื่องปฏิสัมพันธ์ (Interactions)
<ul>
<li>Type III: จะทำการ “ปรับค่าอิทธิพลหลัก” (Adjust main effects) โดยคำนึงถึงอิทธิพลของปฏิสัมพันธ์ (Interaction) เข้าไปด้วย ทำให้ผลลัพธ์ของอิทธิพลหลัก (Main effect) มักจะต่างจาก Type II เมื่อโมเดลนั้นมีตัวแปรปฏิสัมพันธ์ (เช่น <img src="https://latex.codecogs.com/png.latex?%E0%B8%9E%E0%B8%B1%E0%B8%99%E0%B8%98%E0%B8%B8%E0%B9%8C%E2%80%85%C3%97%E2%80%85%E0%B8%9B%E0%B8%B8%E0%B9%8B%E0%B8%A2">) อยู่ด้วย</li>
<li>Type II: จะทดสอบอิทธิพลหลักโดยไม่พิจารณาปฏิสัมพันธ์</li>
</ul></li>
</ul>
</section>
<section id="ตวอยาง" class="level2">
<h2 class="anchored" data-anchor-id="ตวอยาง">ตัวอย่าง</h2>
<p>In this example, our model includes an interaction term between two factors, ‘N’ and ‘G’. As said before, Type III adjusts main effects for interactions, leading to different outcomes than Type II.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1">mod1 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> gen <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> block, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span>
<span id="cb1-2">mod2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> block <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> gen, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span></code></pre></div></div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tidyverse)</span>
<span id="cb2-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(broom)</span>
<span id="cb2-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(car)</span>
<span id="cb2-4"></span>
<span id="cb2-5">dat <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb2-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">gen =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb2-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"st"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"14"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"26"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ci"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"17"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"22"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"13"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"st"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ci"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"04"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"15"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"30"</span>,</span>
<span id="cb2-8">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"03"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"24"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"st"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"18"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"27"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ci"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"25"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"28"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"05"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"st"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"09"</span>,</span>
<span id="cb2-9">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"06"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ci"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"20"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"11"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"23"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"st"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"02"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"21"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ci"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"10"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"08"</span>,</span>
<span id="cb2-10">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"16"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"st"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"29"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"07"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ci"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"01"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"19"</span></span>
<span id="cb2-11">  ),</span>
<span id="cb2-12">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">yield =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb2-13">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2972</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2405</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2855</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2592</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2572</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2608</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2705</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2391</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3122</span>L,</span>
<span id="cb2-14">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3023</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3018</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2477</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2955</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3055</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2477</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2783</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2260</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2603</span>L,</span>
<span id="cb2-15">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2857</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2918</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2825</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1903</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2065</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3107</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3348</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2268</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2148</span>L,</span>
<span id="cb2-16">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2940</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2850</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2670</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3380</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2770</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1315</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1055</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1688</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1625</span>L, </span>
<span id="cb2-17">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1398</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1293</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1253</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1495</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3538</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2915</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3265</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3483</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3013</span>L,</span>
<span id="cb2-18">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3400</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2385</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3643</span>L),</span>
<span id="cb2-19">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">block =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"I"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"II"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"III"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"IV"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"V"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"VI"</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">each =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>L),</span>
<span id="cb2-20">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">row =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb2-21">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>L,</span>
<span id="cb2-22">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>L,</span>
<span id="cb2-23">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>L,</span>
<span id="cb2-24">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>L, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16</span>L),</span>
<span id="cb2-25">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">each =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>L)</span>
<span id="cb2-26">)</span>
<span id="cb2-27"></span>
<span id="cb2-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Define models</span></span>
<span id="cb2-29">mod1 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> gen <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> block, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span>
<span id="cb2-30">mod2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> block <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> gen, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span>
<span id="cb2-31"></span>
<span id="cb2-32"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Your get_p_values function</span></span>
<span id="cb2-33">get_p_values <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(mymodel, myterm, mytype) {</span>
<span id="cb2-34">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (mytype <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"I"</span>) {</span>
<span id="cb2-35">    x <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> broom<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tidy</span>(stats<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">anova</span>(mymodel))</span>
<span id="cb2-36">  } <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> {</span>
<span id="cb2-37">    x <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> broom<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tidy</span>(car<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Anova</span>(mymodel, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> mytype))</span>
<span id="cb2-38">  }</span>
<span id="cb2-39">  x <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(term <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> myterm) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pull</span>(p.value)</span>
<span id="cb2-40">}</span>
<span id="cb2-41"></span>
<span id="cb2-42"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Define terms and types</span></span>
<span id="cb2-43">terms <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gen"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"block"</span>)</span>
<span id="cb2-44">types <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"I"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"II"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"III"</span>)</span>
<span id="cb2-45">models <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mod1 =</span> mod1, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mod2 =</span> mod2)</span>
<span id="cb2-46"></span>
<span id="cb2-47"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Creating the combined tibble</span></span>
<span id="cb2-48"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">crossing</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">model =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">names</span>(models), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">term =</span> terms, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> types) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-49">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rowwise</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-50">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb2-51">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">p =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">get_p_values</span>(models[[model]], term, type)</span>
<span id="cb2-52">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb2-53">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ungroup</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> </span>
<span id="cb2-54">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pivot_wider</span>(</span>
<span id="cb2-55">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">names_from =</span> term,</span>
<span id="cb2-56">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">values_from =</span> p</span>
<span id="cb2-57">  )</span></code></pre></div></div>
<p>ผล</p>
<pre><code># A tibble: 6 × 4
  model type       block     gen
  &lt;chr&gt; &lt;chr&gt;      &lt;dbl&gt;   &lt;dbl&gt;
1 mod1  I     0.000208   0.00911
2 mod1  II    0.000208   0.293  
3 mod1  III   0.000208   0.293  
4 mod2  I     0.00000576 0.293  
5 mod2  II    0.000208   0.293  
6 mod2  III   0.000208   0.293  </code></pre>
<p>a Type I ANOVA there is a difference between the following two models, while for Type II and Type III it does not make a difference.</p>
<p>ในเคสของ Interaction กัน In this example, our model includes an interaction term between two factors, ‘N’ and ‘G’. As said before, Type III adjusts main effects for interactions, leading to different outcomes than Type II.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1">mod <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> N <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> G <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> N<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span>G, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span></code></pre></div></div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tidyverse)</span>
<span id="cb5-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(broom)</span>
<span id="cb5-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(car)</span>
<span id="cb5-4"></span>
<span id="cb5-5">dat <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb5-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">N =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb5-7">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>,</span>
<span id="cb5-8">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>,</span>
<span id="cb5-9">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>,</span>
<span id="cb5-10">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>,</span>
<span id="cb5-11">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Toad"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>,</span>
<span id="cb5-12">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yoshi"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Koopa"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Peach"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Diddy"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Goomba"</span></span>
<span id="cb5-13">  ),</span>
<span id="cb5-14">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">G =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb5-15">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>,</span>
<span id="cb5-16">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>,</span>
<span id="cb5-17">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>,</span>
<span id="cb5-18">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>,</span>
<span id="cb5-19">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nala"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>,</span>
<span id="cb5-20">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Timon"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Simba"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pumba"</span></span>
<span id="cb5-21">  ),</span>
<span id="cb5-22">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">yield =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(</span>
<span id="cb5-23">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6162</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6318</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1690</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4948</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5736</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7072</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6192</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5598</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6666</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5044</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7146</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7578</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7642</span>,</span>
<span id="cb5-24">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2504</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6682</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2338</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6324</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5316</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4034</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4030</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6600</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5372</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4216</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3554</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5970</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5684</span>,</span>
<span id="cb5-25">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7862</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6732</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9012</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5924</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7302</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1560</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6094</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5904</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4694</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4520</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5126</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6860</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1594</span>,</span>
<span id="cb5-26">    <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6392</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5738</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7260</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5256</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8548</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5974</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6794</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5806</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4212</span></span>
<span id="cb5-27">  )</span>
<span id="cb5-28">)</span>
<span id="cb5-29"></span>
<span id="cb5-30">mod <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> N<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>G, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span>
<span id="cb5-31"></span>
<span id="cb5-32">anova_type_I <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> broom<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tidy</span>(stats<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">anova</span>(mod)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb5-33">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(term, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">typeI =</span> p.value)</span>
<span id="cb5-34"></span>
<span id="cb5-35">anova_type_II <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> broom<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tidy</span>(car<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Anova</span>(mod, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"II"</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> </span>
<span id="cb5-36">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(term, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">typeII =</span> p.value)</span>
<span id="cb5-37"></span>
<span id="cb5-38">anova_type_III <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> broom<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tidy</span>(car<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Anova</span>(mod, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"III"</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> </span>
<span id="cb5-39">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(term, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">typeIII =</span> p.value)</span>
<span id="cb5-40"></span>
<span id="cb5-41"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(anova_type_I, anova_type_II, anova_type_III) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> </span>
<span id="cb5-42">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">reduce</span>(full_join, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">by =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"term"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> </span>
<span id="cb5-43">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(term <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%in%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"N"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"G"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"N:G"</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> </span>
<span id="cb5-44">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">across</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">starts_with</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"type"</span>), <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>insight<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">format_p</span>(., <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">name =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NULL</span>)))</span></code></pre></div></div>
<p>ผล</p>
<pre><code># A tibble: 3 × 4
  term  typeI  typeII typeIII
  &lt;chr&gt; &lt;chr&gt;  &lt;chr&gt;  &lt;chr&gt;  
1 N     &lt; .001 0.001  0.019  
2 G     &lt; .001 &lt; .001 0.872  
3 N:G   &lt; .001 &lt; .001 &lt; .001 </code></pre>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-2-contents" aria-controls="callout-2" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Additional Resources
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-2" class="callout-2-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<ul>
<li><a href="https://schmidtpaul.github.io/dsfair_quarto/ch/summaryarticles/anovatypes.html">Anova – Type I/II/III SS explained</a></li>
<li>StackExchange Discussion on <a href="https://stats.stackexchange.com/questions/204484/how-to-interpret-type-i-type-ii-and-type-iii-anova-and-manova">How to interpret type I, type II, and type III ANOVA and MANOVA?</a></li>
</ul>
</div>
</div>
</div>


</section>

 ]]></description>
  <category>R</category>
  <category>Statistics</category>
  <guid>https://kanthanawit.in.th/writing/anova_types/</guid>
  <pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>การวิเคราะห์ข้อมูลที่มีการวางแแผนการทดลองแบบ CRD ด้วย R ดัพเดท ปี 2026</title>
  <link>https://kanthanawit.in.th/writing/crd/</link>
  <description><![CDATA[ 




<p>สำหรับการทดลงแบบ CRD ในยุคปัจจุบันนี้ สนับสนุนให้การรายงานควรที่จะแสดง “ค่าประมาณ + 95% CI” และ ขนาดเอฟเฟกต์ (η²/ω²) มากกว่าดูจากค่า <em>p</em>-value อย่างเดียว</p>
<p>พยายามรวบรวม วิธีการวิเคราะห์ข้อมูลสถิติกับการทดลองที่ออกแบบ แบบ CRD ด้วย R code โดยพยายามให้โค้ดมีความทันสมัยและอยู่ในรูปแบบการโค้ด package ที่เป็นปัจจุบัน มชมากที่สุด</p>
<p>เรามาเริ่มกันโค้ดเลย</p>
<section id="โหลด-package-ทจำเปน" class="level2">
<h2 class="anchored" data-anchor-id="โหลด-package-ทจำเปน">1. โหลด package ที่จำเป็น</h2>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># packages</span></span>
<span id="cb1-2">pacman<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">p_load</span>(</span>
<span id="cb1-3">  tidyverse, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># data import and handling</span></span>
<span id="cb1-4">  conflicted, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># handling function conflicts</span></span>
<span id="cb1-5">  emmeans,</span>
<span id="cb1-6">  multcomp,</span>
<span id="cb1-7">  multcompView, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># adjusted mean comparisons</span></span>
<span id="cb1-8">  ggplot2,</span>
<span id="cb1-9">  effectsize, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># effect size calculation</span></span>
<span id="cb1-10">  desplot, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># for plotting experimental designs</span></span>
<span id="cb1-11">  rstatix,</span>
<span id="cb1-12">  ggdist,</span>
<span id="cb1-13">  performance,</span>
<span id="cb1-14">  see</span>
<span id="cb1-15">) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># plots</span></span>
<span id="cb1-16"></span>
<span id="cb1-17"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># conflicts between functions with the same name</span></span>
<span id="cb1-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">conflict_prefer</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"filter"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dplyr"</span>)</span>
<span id="cb1-19"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">conflict_prefer</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"select"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dplyr"</span>)</span></code></pre></div></div>
<p><code>pacman::p_load</code> เป็น package ที่ช่วยให้เราโหลด package ได้ง่ายขึ้น โดยไม่ต้องโหลดทีละตัว</p>
<p><code>tidyverse</code> ช่วยจัดการข้อมูลได้ง่ายขึ้น <code>conflicted</code> ช่วยจัดการ function conflicts ซึ่ง เมื่อประกาศใช้ tidyverse แล้ว จะมี function ซ้ำกันหลายตัวกับ R base อยู่ เพื่อไม่ให้เกิดความขัดแย้งกันเองก็เลือกเลยว่าจะให้อะไรจาก package ไหน</p>
<p><code>emmeans</code> ช่วยให้เราจัดการ adjusted mean comparisons ได้ง่ายขึ้น <code>multcomp</code> ช่วยให้เราจัดการ adjusted mean comparisons ได้ง่ายขึ้น <code>multcompView</code> ช่วยให้เราจัดการ adjusted mean comparisons ได้ง่ายขึ้น <code>effectsize</code> ช่วยให้เราจัดการ effect size calculation ได้ง่ายขึ้น</p>
<p>เพื่อตรวจสอบสมมุติฐานของ ANOVA</p>
<p><code>desplot</code> ช่วยให้เราจัดการ for plotting experimental designs ได้ง่ายขึ้น</p>
<p><code>rstatix</code> ช่วยให้เราจัดการ rstatix ได้ง่ายขึ้น</p>
<p><code>ggdist</code> ช่วยให้เราจัดการ ggdist ได้ง่ายขึ้น</p>
<p><code>performance</code> ช่วยให้เราจัดการ performance ได้ง่ายขึ้น</p>
<p><code>see</code> ช่วยให้เราจัดการ see ได้ง่ายขึ้น</p>
</section>
<section id="การนำเขาขอมล" class="level2">
<h2 class="anchored" data-anchor-id="การนำเขาขอมล">2. การนำเข้าข้อมูล</h2>
<p>ตัวอย่างข้อมูลที่นำมาให้ใช้ เป็น ข้อมูลที่มาทำได้เป็นงานวิจัยทดสอบผลผลิตเมลอน ตีพิมพ์ Mead et al.&nbsp;(1993, p.52) โดยการทดลองมีพันธุ์เมลอน 4 พันธุ์ แต่ละพันธุ์ได้รับการทดสอบในแปลงทดลองจำนวน 6 แปลง ออกแบบการทดสอบแบบ สุ่มสมบูรณ์ (CRD) จาก “Example 4.3” หนังสือ “Quantitative Methods in Biosciences (3402-420)” by Prof.&nbsp;Dr.&nbsp;Hans-Peter Piepho</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#| label : "Import data"</span></span>
<span id="cb2-2">dataURL <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://raw.githubusercontent.com/SchmidtPaul/DSFAIR/master/data/Mead1993.csv"</span></span>
<span id="cb2-3">dat <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read_csv</span>(dataURL)</span>
<span id="cb2-4">dat <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>()</span></code></pre></div></div>
<p>ผลลัพธ์ที่ได้</p>
<pre><code>variety yield   row   col
   &lt;chr&gt;   &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
 1 v1       25.1     4     2
 2 v1       17.2     1     6
 3 v1       26.4     4     1
 4 v1       16.1     1     4</code></pre>
<p>และต่อไปเราเพื่อที่จะวิเคราะห์ ANOVA จะต้องแปลง <code>variety</code> ให้เป็น <code>factor</code> ก่อน</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1">dat <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> dat <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb4-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">variety =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.factor</span>(variety))</span></code></pre></div></div>
<p>ได้</p>
<pre><code># A tibble: 24 × 4
   variety yield   row   col
   &lt;fct&gt;   &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
 1 v1       25.1     4     2
 2 v1       17.2     1     6
 3 v1       26.4     4     1
 4 v1       16.1     1     4</code></pre>
<p>ขอดูกราฟก่อนว่า หน้าตาของข้อมูลเป็นอย่างไร</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ggplot</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> yield, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> variety)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb6-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_point</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># scatter plot</span></span>
<span id="cb6-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ylim</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># force y-axis to start at 0</span></span>
<span id="cb6-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme_classic</span>() <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># clearer plot format</span></span></code></pre></div></div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://kanthanawit.in.th/writing/crd/image.png" class="img-fluid figure-img"></p>
<figcaption>alt text</figcaption>
</figure>
</div>
<p>จากตรงนี้ก็พอจะเห็นอะไรบ้างว่าพันธุ์แต่ละพันธุ์นั้น มีแนวโน้มที่ให้ผลผลิตที่แตกต่างกัน</p>
</section>
<section id="วเคราะห-anova" class="level2">
<h2 class="anchored" data-anchor-id="วเคราะห-anova">3. วิเคราะห์ ANOVA</h2>
<p>อันนี้แหละ ที่เป้นประเด็น ในการเรื่องการวิเคราะห์ ANOVA Modern ANOVA = <code>car::Anova(type = 3)</code></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb7-1">fit <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> variety, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span>
<span id="cb7-2">car<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Anova</span>(fit, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span></code></pre></div></div>
<p>ถ้าเป็น code แบบ classic ก็ใช้ <code>aov(yield ~ variety, data = dat)</code> ซึ่ง ถ้าเป็น ปัจจุบันตอนนี้ เราจะนิยมและปลอดภัยสุด หรือ ANOVA type จาก <a href="https://schmidtpaul.github.io/dsfair_quarto/ch/summaryarticles/anovatypes.html">Data Science for Agriculture in R</a></p>
<blockquote class="blockquote">
<p>In most cases it’s probably best to conduct a <code>Type III</code> ANOVA, e.g.&nbsp;via <code>car::Anova(model, type = "III")</code>.</p>
</blockquote>
</section>
<section id="classic-anova" class="level2">
<h2 class="anchored" data-anchor-id="classic-anova">classic ANOVA</h2>
<p>แบบ ANOVA จาก R base ก็ใช้ได้เช่นกัน นะ</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb8-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#| eval : false</span></span>
<span id="cb8-2">aov.model <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aov</span>(yield <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> variety, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat)</span>
<span id="cb8-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summary</span>(aov.model)</span></code></pre></div></div>
<p>ถ้า ไม่ sig เราก็ จะรายงาน เท่านี้ แต่ถ้าไม่ ส่วนใหญ่ เราก็จะไปทดสอบต่อ อย่างที่เรา เรียกกัน postpoc</p>
<section id="ตรวจ-asusumption" class="level3">
<h3 class="anchored" data-anchor-id="ตรวจ-asusumption">ตรวจ Asusumption</h3>
<p>ใช้ <code>performance</code> library หรือ <code>easystat</code> library เพื่อ check สมมุติฐาน และคุณภาพของข้อมูล ที่นำไปวิเคราะห์ ANOVA</p>
<ol type="1">
<li>Homogeneity check</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb9-1">performance<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_homogeneity</span>(fit)</span>
<span id="cb9-2">performance<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_homogeneity</span>(fit) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>()</span></code></pre></div></div>
<ol start="2" type="1">
<li>heteroscedasticit check</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1">performance<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_heteroscedasticity</span>(fit)</span>
<span id="cb10-2">performance<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_heteroscedasticity</span>(fit) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>()</span></code></pre></div></div>
<p>บอกว่าต้องเชคอันนี้ก่อน เพราะว่ามันจะมีผลต่อ การวิเคราะห์ ANOVA เพราะว่า ถ้าไม่ ก็ ควรใช้ Welch ANOVA แทน</p>
<ol start="3" type="1">
<li>Normality check</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb11-1">performance<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_normality</span>(fit)</span>
<span id="cb11-2">performance<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_normality</span>(fit) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>()</span></code></pre></div></div>
<p>หลายคนอยากดู outlier</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">check_outliers</span>(fit) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>()</span></code></pre></div></div>
</section>
<section id="ขนาดเอฟเฟกต" class="level3">
<h3 class="anchored" data-anchor-id="ขนาดเอฟเฟกต">ขนาดเอฟเฟกต์</h3>
<p>อยากจะชวนให้ ดู effect ต่อ สำคัญอย่างไร - <em>p</em>-value บอกแค่ว่า “มีหลักฐานต่างกันไหม” ซึ่งไวต่อ ขนาดตัวอย่าง มาก แต่ ไม่บอกว่าผลที่ได้นั้นต่างกันมากขนาดไหน - ขนาดเอฟเฟกต์บอก “ผลที่ได้ใหญ่พอจะมีความหมายเชิงปฏิบัติไหม” และทำให้ เปรียบเทียบงาน/การทดลองต่างกันได้ บนมาตรฐานเดียว</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb13-1">effectsize<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">eta_squared</span>(fit)</span>
<span id="cb13-2">effectsize<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">omega_squared</span>(fit)</span></code></pre></div></div>
<p>ค่า omega square (variance explained): “ทรีตเมนต์อธิบายความแปรปรวนได้ ~73% (ω²=0.73) ผลต่างเห็นได้ชัด (รู้สึกมั่นใจว่าผลการทดลองที่ได้สังเกตเห็นผลต่างได้ชัดเจน)”</p>
</section>
</section>
<section id="post-hoc-test" class="level2">
<h2 class="anchored" data-anchor-id="post-hoc-test">post-hoc test</h2>
<p>แม้ปัจจุบัน นักสถิติหลายคน ไม่ค่อย สนับสนุนให้ ทำ CLD(compact letter dusplay) เพราะว่า … แล้ว แต่ในสาขาเกษตรหรือชีววิทยา ก็ยังคงนิยมเพระาว่า ง่ายในการอธิบายผล ดังนั้น เราจะยังใช้</p>
<section id="ประมาณคาเฉลยเปรยบเทยบ-โดยการใชตวอกษร" class="level3">
<h3 class="anchored" data-anchor-id="ประมาณคาเฉลยเปรยบเทยบ-โดยการใชตวอกษร">ประมาณค่าเฉลี่ยเปรียบเทียบ โดยการใช้ตัวอักษร</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb14-1">emm <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">emmeans</span>(fit, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>variety)</span>
<span id="cb14-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">contrast</span>(emm, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pairwise"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">adjust =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tukey"</span>)</span></code></pre></div></div>
<p>ตารางข้างบ้นนี้ เปรียบเทียบทีละคู่ ๆ</p>
</section>
<section id="เปรยบเทยบโดยการใชตวอกษร-cld" class="level3">
<h3 class="anchored" data-anchor-id="เปรยบเทยบโดยการใชตวอกษร-cld">เปรียบเทียบโดยการใช้ตัวอักษร CLD</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb15-1">mean_comparisons <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> fit <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb15-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">emmeans</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">specs =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"variety"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb15-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cld</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">adjust =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tukey"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Letters =</span> letters)</span>
<span id="cb15-4"></span>
<span id="cb15-5">mean_comparisons</span></code></pre></div></div>
</section>
<section id="กราฟเปรยบเทยบตวแปร" class="level3">
<h3 class="anchored" data-anchor-id="กราฟเปรยบเทยบตวแปร">กราฟเปรียบเทียบตัวแปร</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb16-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ggplot</span>(mean_comparisons, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(variety, emmean)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb16-2">  ggdist<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_pointinterval</span>(</span>
<span id="cb16-3">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ymin =</span> lower.CL, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ymax =</span> upper.CL)</span>
<span id="cb16-4">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb16-5">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">labs</span>(</span>
<span id="cb16-6">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Treatment"</span>,</span>
<span id="cb16-7">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Estimated mean (95% CI)"</span>,</span>
<span id="cb16-8">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">title =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CRD: EMMs + 95% CI"</span></span>
<span id="cb16-9">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb16-10">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme_minimal</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">base_size =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>)</span></code></pre></div></div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb17-1">my_caption <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Black dots = raw data (jittered). Red dots/bars = adjusted means with 95% CIs per variety. Letters share = not different (Tukey)."</span></span>
<span id="cb17-2"></span>
<span id="cb17-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ggplot</span>() <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> variety) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-5"></span>
<span id="cb17-6">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># จุดดิบ: jitter ป้องกันทับกัน + alpha ให้โปร่ง</span></span>
<span id="cb17-7">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_point</span>(</span>
<span id="cb17-8">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat,</span>
<span id="cb17-9">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> yield),</span>
<span id="cb17-10">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">position_jitter</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">width =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.08</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">height =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>),</span>
<span id="cb17-11">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">alpha =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span>,</span>
<span id="cb17-12">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">size =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.9</span></span>
<span id="cb17-13">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-14"></span>
<span id="cb17-15">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ค่ากลางและช่วงเชื่อมั่น (ใช้ pointrange แทน point + errorbar แยก)</span></span>
<span id="cb17-16">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_pointrange</span>(</span>
<span id="cb17-17">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> mean_comparisons,</span>
<span id="cb17-18">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> emmean, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ymin =</span> lower.CL, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ymax =</span> upper.CL),</span>
<span id="cb17-19">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">color =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span>,</span>
<span id="cb17-20">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fatten =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.1</span>,</span>
<span id="cb17-21">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">size =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.6</span>,</span>
<span id="cb17-22">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">position_nudge</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.12</span>)</span>
<span id="cb17-23">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-24"></span>
<span id="cb17-25">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ตัวอักษร CLD: ขยับไปขวาอีกหน่อย และยกขึ้นเล็กน้อย</span></span>
<span id="cb17-26">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">geom_text</span>(</span>
<span id="cb17-27">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> mean_comparisons,</span>
<span id="cb17-28">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aes</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> emmean, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">label =</span> .group),</span>
<span id="cb17-29">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">color =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"red"</span>,</span>
<span id="cb17-30">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">position =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">position_nudge</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.24</span>),</span>
<span id="cb17-31">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">hjust =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb17-32">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">vjust =</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span>,</span>
<span id="cb17-33">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fontface =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bold"</span>,</span>
<span id="cb17-34">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">size =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.6</span></span>
<span id="cb17-35">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-36"></span>
<span id="cb17-37">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># แกนและสเกล</span></span>
<span id="cb17-38">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">scale_x_discrete</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">name =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Variety"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">expand =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expansion</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mult =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.02</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.22</span>))) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-39">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">scale_y_continuous</span>(</span>
<span id="cb17-40">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">name =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Yield"</span>,</span>
<span id="cb17-41">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">limits =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">NA</span>),</span>
<span id="cb17-42">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">expand =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expansion</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mult =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.08</span>))</span>
<span id="cb17-43">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-44"></span>
<span id="cb17-45">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ธีมสะอาด + ระยะขอบเผื่อข้อความ</span></span>
<span id="cb17-46">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme_classic</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">base_size =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">12</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-47">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">theme</span>(</span>
<span id="cb17-48">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">plot.margin =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">margin</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">t =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">r =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">24</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">b =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">l =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>),</span>
<span id="cb17-49">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">axis.text.x =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">element_text</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">angle =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">vjust =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">hjust =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>),</span>
<span id="cb17-50">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">plot.caption =</span> ggtext<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">element_textbox_simple</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">margin =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">margin</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">t =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>)),</span>
<span id="cb17-51">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">plot.caption.position =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"plot"</span></span>
<span id="cb17-52">  ) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-53">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">labs</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">caption =</span> my_caption) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span></span>
<span id="cb17-54">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">coord_cartesian</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">clip =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"off"</span>)</span></code></pre></div></div>
</section>
</section>
<section id="วธรายงานผล" class="level2">
<h2 class="anchored" data-anchor-id="วธรายงานผล">วิธีรายงานผล</h2>
<p>รายงาน ความต่างเฉลี่ยที่สนใจ พร้อมค่า 95% CI และวิธี post-hoc test (เช่น Tukey) ใส่ขนาดเอฟเฟกต์ (เช่น partial η² หรือ ω²) เพื่อสื่อสาร</p>


</section>

 ]]></description>
  <category>R</category>
  <category>Statistics</category>
  <guid>https://kanthanawit.in.th/writing/crd/</guid>
  <pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>ทำไง เมื่อจะวิเคราะห์ Two-way (Factorial) แต่ Non-parametric</title>
  <link>https://kanthanawit.in.th/writing/f2-nonnorm/</link>
  <description><![CDATA[ 




<section id="two-way-non-parametric-ทำไมถงเปนปญหา" class="level2">
<h2 class="anchored" data-anchor-id="two-way-non-parametric-ทำไมถงเปนปญหา">Two-way Non-parametric ทำไมถึงเป็นปัญหา</h2>
<p>การวิเคราะห์ปฏิสัมพันธ์ (Interaction) ระหว่างปัจจัย เช่น “พันธุ์พืช” (Host Resistance) และ “ระดับการใส่ปุ๋ย” (Nutrient Level) คือหัวใจสำคัญของการเข้าใจระบาดวิทยา แต่ในทางปฏิบัติ ข้อมูลร้อยละการเกิดโรค มักจะมีลักษณะเบ้ (Skewed) หรือมีความแปรปรวนไม่คงที่ (Heteroscedasticity)</p>
<p>เมื่อ ANOVA ใช้ไม่ได้ เรามักนึกถึง Scheirer-Ray-Hare test ซึ่งเป็นส่วนขยายของ Kruskal-Wallis สำหรับ Factorial Design แต่ปัญหาคือ - Interpretation Complexity: ผลลัพธ์ที่ได้มักจะตีความยาก โดยเฉพาะเมื่อเกิด Interaction ที่มีนัยสำคัญ เนื่องจากพื้นฐานมาจากการเปรียบเทียบ Rank-sum - Power &amp; Robustness: ในหลายกรณี มันให้ผลที่ไม่เสถียรเมื่อเทียบกับโมเดลสมัยใหม่อย่าง GLM (Generalized Linear Models)</p>
<section id="ทางออกเชงปฏบต-the-concatenation-strategy-treatment-combination" class="level3">
<h3 class="anchored" data-anchor-id="ทางออกเชงปฏบต-the-concatenation-strategy-treatment-combination">ทางออกเชิงปฏิบัติ: The “Concatenation” Strategy (Treatment Combination)</h3>
<p>หากคุณต้องการความเรียบง่าย ประสิทธิภาพ และการสื่อสารที่ตรงไปตรงมากับผู้ทบทวนบทความ (Reviewers) วิธีที่ได้รับความนิยมสูงในวงการระบาดวิทยาภาคสนามคือการยุบรวมปัจจัย (Factor levels) ให้กลายเป็น “Single Treatment Factor”</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Concatenation Strategy
</div>
</div>
<div class="callout-body-container callout-body">
<p>หลักการ: แทนที่จะมองเป็น <img src="https://latex.codecogs.com/png.latex?2%E2%80%85%C3%97%E2%80%852"> Factorial ให้เรามองเป็น 4 Treatments ในแผนการทดลองแบบ One-way (CRD หรือ RCBD) แล้วใช้ Kruskal-Wallis Test ตามด้วยการเปรียบเทียบเชิงซ้อน (Post-hoc)</p>
</div>
</div>
<p>วิธีนี้ช่วยให้เราหลีกเลี่ยงความยุ่งยากของ Non-parametric Interaction และมุ่งเน้นไปที่การเปรียบเทียบ “กลุ่มของปัจจัย” ที่ให้ผลดีที่สุดหรือแย่ที่สุดในทางระบาดวิทยาโดยตรง</p>
<p>ตัวอย่างการเขียน R Code สำหรับ Workflow นี้สมมติเราทดลองเรื่อง “ผลของสายพันธุ์พืช (A, B) และระดับความชื้น (High, Low) ต่อความรุนแรงของโรค”</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. โหลด Library ที่จำเป็น</span></span>
<span id="cb1-2"></span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(tidyverse)</span>
<span id="cb1-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(agricolae) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># สำหรับงานเกษตรโดยเฉพาะ</span></span>
<span id="cb1-5"></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. จำลองข้อมูล (Data Simulation)</span></span>
<span id="cb1-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">123</span>)</span>
<span id="cb1-8">df <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb1-9">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Variety =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"V1"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"V2"</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">each =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>),</span>
<span id="cb1-10">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Moisture =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"M1"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"M2"</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">times =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>),</span>
<span id="cb1-11">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Severity =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rbeta</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>), <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rbeta</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ข้อมูลเบ้ (Non-normal)</span></span>
<span id="cb1-12">)</span>
<span id="cb1-13"></span>
<span id="cb1-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 3. สร้าง Column ใหม่โดยการ Concatenate (หัวใจของวิธีนี้)</span></span>
<span id="cb1-15">df <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> df <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%&gt;%</span></span>
<span id="cb1-16">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Trt_Combo =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste</span>(Variety, Moisture, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sep =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"_"</span>))</span>
<span id="cb1-17"></span>
<span id="cb1-18"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 4. วิเคราะห์ด้วย Kruskal-Wallis (One-way approach)</span></span>
<span id="cb1-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># เหมือนเราทำ CRD ปกติ</span></span>
<span id="cb1-20">k_test <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kruskal</span>(df<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Severity, df<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Trt_Combo, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">alpha =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.05</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">p.adj =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bonferroni"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">group =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)</span>
<span id="cb1-21"></span>
<span id="cb1-22"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 5. ดูผลลัพธ์</span></span>
<span id="cb1-23"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">print</span>(k_test<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>statistics) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ค่าสถิติภาพรวม</span></span>
<span id="cb1-24"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">print</span>(k_test<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>groups)     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># การจัดกลุ่มตัวอักษร (abc)</span></span></code></pre></div></div>
<p>แม้ว่าวิธี Concatenation จะสะดวก แต่มีข้อแนะนำเพิ่มเติม 3 ประการ:</p>
<ul>
<li><p><strong>Lose of Main Effects</strong>: การรวมปัจจัยทำให้คุณเสียความสามารถในการแยกแยะ “Main Effect” ของแต่ละปัจจัยอย่างชัดเจน (เช่น จะบอกไม่ได้ว่าโดยภาพรวมแล้ว Variety A ดีกว่า B แค่ไหน ถ้าไม่ดู Moisture ประกอบ)</p></li>
<li><p><strong>When to use GLM</strong>: หากข้อมูลของคุณเป็นสัดส่วน (Proportion/Percentage) ปัจจุบันวงการระบาดวิทยาสมัยใหม่ (เช่น งานของ Garrett หรือ Sparks) นิยมใช้ Beta Regression หรือ GLM with Logit Link ซึ่งรองรับ Factorial และข้อมูล Non-normal ได้ดีกว่าการใช้ Non-parametric แบบดั้งเดิม</p></li>
<li><p><strong>Visualization is Key</strong>: การพล็อตข้อมูลจริง (Raw data) ซ้อนทับกับ Boxplot จะช่วยให้ Reviewer เห็นภาพการกระจายของโรคได้ชัดเจนกว่าค่า Rank เพียงอย่างเดียว</p></li>
</ul>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Note
</div>
</div>
<div class="callout-body-container callout-body">
<p>หากต้องรีบ หรือ ต้องการวิเคราะห์ two facterial แต่ assumptions ชี้ ไป ว่า ืเป็น Non-normal หรือ Heteroscedasticity และ ต้องการวิเคราะห์แบบเร็ว ๆ การใช้ Kruskal-Wallis บน Treatment Combination คือ “Practical Shortcut” ที่ power และลดข้อผิดพลาดในการตีความได้อย่างดี</p>
</div>
</div>


</section>
</section>

 ]]></description>
  <category>Statistics</category>
  <category>R</category>
  <guid>https://kanthanawit.in.th/writing/f2-nonnorm/</guid>
  <pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/two_way_nonparametric.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>เลิกใช้ DMRT เถอะ</title>
  <link>https://kanthanawit.in.th/writing/nodmrt/</link>
  <description><![CDATA[ 




<p>แม้ วงการสถิติได้พยายามลดการใช้ Duncan’s Multiple Range Test (DMRT) มานานหลายสิบปีแล้ว แต่ที่ในไทย (และหลายประเทศในเอเชีย) ยังเป็นที่นิยมอย่างมาก มีเหตุผลหลัก 2 ข้อ:</p>
<ul>
<li><strong>มันให้ trt ต่างกันง่าย (High Power):</strong> DMRT “ใจดี” มาก มันออกแบบมาให้จับความแตกต่างได้ง่ายกว่าวิธีอื่น ๆ ในกลุ่มเดียวกัน ทำให้เวลาผู้วิจัยใช้ DMRT มักจะได้ตัวอักษร a, b, c, d สวยงาม แบ่งกลุ่มได้เยอะ (ซึ่งนักวิจัยชอบ เพราะดูเหมือนงานวิจัยประสบความสำเร็จ ทรีตเมนต์ให้ผลต่างกันชัดเจน)</li>
<li><strong>ความคุ้นเคยและตำราเก่า:</strong> อาจารย์รุ่นก่อน ๆ เรียนและสอนกันมาแบบนี้ และวารสารวิชาการในไทยหลายแห่งก็ยังคุ้นเคยกับการอ่านผล DMRT อยู่ ซึ่งความเคยชินนี้ทำให้นักวิจัยยังคงใช้วิธีนี้ต่อไป</li>
</ul>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Warning</span>ข้อควรระวัง
</div>
</div>
<div class="callout-body-container callout-body">
<p>ความ “ใจดี” ทำให้ trt ต่างกันง่ายของมัน แลกมากับ Type I Error (ผลบวกปลอม - สรุปว่าต่าง ทั้งที่จริงไม่ได้ต่าง) ที่สูงมากเมื่อเทียบกับวิธีอื่น</p>
</div>
</div>
<section id="สถานการณทไมแนะนำใหใช-dmrt-อยางเดดขาด" class="level3">
<h3 class="anchored" data-anchor-id="สถานการณทไมแนะนำใหใช-dmrt-อยางเดดขาด">4 สถานการณ์ที่ไม่แนะนำให้ใช้ DMRT อย่างเด็ดขาด</h3>
<ol type="1">
<li><p><strong>การทดลองที่มี “จำนวนทรีตเมนต์ (Treatments) เยอะเกินไป”</strong></p>
<p>นี่คือจุดบอดที่ใหญ่ที่สุดของ DMRT ครับ DMRT ไม่สามารถควบคุม Experiment-wise Error Rate ได้ดีเท่าวิธีอื่น</p>
<ul>
<li><strong>ทำไมถึงห้าม:</strong> ยิ่งคุณมีทรีตเมนต์เยอะ (เช่น เทียบข้าว 10 สายพันธุ์) โอกาสที่ DMRT จะบอกว่า “พันธุ์ที่ 1 กับพันธุ์ที่ 10 ต่างกัน” ทั้งที่จริงๆ มันแค่บังเอิญ จะพุ่งสูงขึ้นทะลุหลัก 10-20% (ทั้งที่คุณตั้ง <img src="https://latex.codecogs.com/png.latex?%CE%B1"> ไว้ที่ 0.05)</li>
<li><strong>ทางออกที่ถูกต้อง:</strong> ถ้ามีทรีตเมนต์เยอะ (เกิน 5-6 กลุ่มขึ้นไป) Tukey’s HSD คือมาตรฐานทองคำ (Gold Standard) ที่นักสถิติทั่วโลกยอมรับครับ เพราะ Tukey ควบคุม Type I Error ได้ชะงัดนัก</li>
</ul></li>
<li><p><strong>ข้อมูลที่มี “จำนวนซ้ำไม่เท่ากัน” (Unbalanced Data)</strong></p>
<p>สมมติว่าคุณวางแผนไว้ 4 ซ้ำ (Replications) เท่ากันหมด แต่ตอนเก็บข้อมูลดันมีหนูกัดต้นข้าวตายไป 1 แปลง ทำให้บางทรีตเมนต์เหลือ 3 ซ้ำ</p>
<ul>
<li><strong>ทำไมถึงห้าม:</strong> สูตรดั้งเดิมของ DMRT ถูกสร้างมาบนสมมติฐานว่าตัวอย่างต้องเท่ากันเป๊ะ (Balanced design) แม้ซอฟต์แวร์บางตัวจะยอมคำนวณให้ (โดยใช้ Harmonic mean มาชดเชย) แต่ค่าความคลาดเคลื่อนจะสูงมาก และผลมักจะเพี้ยน</li>
<li><strong>ทางออกที่ถูกต้อง:</strong> ควรใช้ Least Square Means (LSMeans) หรือ Tukey-Kramer Test ซึ่งออกแบบมาเพื่อจัดการกับ Unbalanced data โดยเฉพาะ</li>
</ul></li>
<li><p><strong>เมื่อเปรียบเทียบทุกกลุ่มกับ “กลุ่มควบคุม (Control)” เท่านั้น</strong></p>
<p>ถ้าจุดประสงค์ของงานวิจัยคุณ ไม่ได้อยากรู้ว่า ปุ๋ยสูตร A ต่างกับ B ไหม แต่อยากรู้แค่ว่า ปุ๋ยสูตร A, B, C, D ต่างจาก “ไม่ใส่ปุ๋ย (Control)” ไหม</p>
<ul>
<li><strong>ทำไมถึงห้าม:</strong> การใช้ DMRT (หรือ Tukey) จะเป็นการเปรียบเทียบแบบ “จับคู่ทุกคู่” (All pairwise) ซึ่งเป็นการสูญเสีย Power ของสถิติไปโดยเปล่าประโยชน์ และทำให้ตรวจสอบความต่างกับ Control ได้ยากขึ้น</li>
<li><strong>ทางออกที่ถูกต้อง:</strong> ต้องใช้ Dunnett’s Test ครับ สถิติตัวนี้เกิดมาเพื่อเทียบ Treatment ทุกตัวกับ Control โดยเฉพาะ และให้ผลที่แม่นยำกว่ามาก</li>
</ul></li>
<li><p><strong>งานวิจัยสายการแพทย์ หรือที่ต้องการความเข้มงวดสูง (Strict Control)</strong></p>
<p>ถ้าคุณเอา DMRT ไปใช้ในการทดสอบยารักษาโรค หรือการทดสอบสารเคมีตกค้างที่มีผลต่อความปลอดภัยของมนุษย์ เปเปอร์ของคุณมีโอกาสถูกตีตกสูงมากครับ</p>
<ul>
<li><strong>ทำไมถึงห้าม:</strong> เพราะวงการนี้รับความเสี่ยงเรื่อง Type I Error ไม่ได้ การที่ DMRT บอกว่ายาสองตัวให้ผลต่างกัน ทั้งที่ความจริงไม่ต่าง อาจหมายถึงความเป็นความตายหรือต้นทุนมหาศาล</li>
<li><strong>ทางออกที่ถูกต้อง:</strong> ใช้ Bonferroni correction หรือ Tukey’s HSD ครับ</li>
</ul></li>
</ol>


</section>

 ]]></description>
  <category>Statistics</category>
  <guid>https://kanthanawit.in.th/writing/nodmrt/</guid>
  <pubDate>Fri, 09 Aug 2024 00:00:00 GMT</pubDate>
  <media:content url="https://kanthanawit.in.th/images/dmrt_stat_warning.png" medium="image" type="image/png" height="144" width="144"/>
</item>
</channel>
</rss>
