ทำ MCMC: ใช้ jags / stan หรือใช้ด้วยตนเอง


13

ฉันใหม่สำหรับการวิจัยสถิติแบบเบย์ ฉันได้ยินจากนักวิจัยว่านักวิจัยชาวเบย์นำเอา MCMC มาใช้ด้วยตัวเองแทนที่จะใช้เครื่องมืออย่าง JAGS / Stan ฉันขอถามว่าประโยชน์ของการใช้อัลกอริทึม MCMC ด้วยตัวเอง (ในภาษา "ไม่ค่อนข้างเร็ว" เช่น R) คืออะไรยกเว้นเพื่อการเรียนรู้?


เนื่องจากคุณสามารถเลือกการกระจายข้อเสนอของคุณเองได้ด้วยตัวคุณเองคุณจึงควรเลือกเช่นนั้น Markov Chain ที่เป็นผลมาจากการบรรจบกันจะมาบรรจบกันอย่างรวดเร็วที่สุด

ขอบคุณ! มันเป็นเหตุผลเดียวหรือไม่
— user112758

4
หากคุณเป็นนักวิจัยประยุกต์ที่ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Bayes โดยใช้สำหรับแอปพลิเคชันฉันขอแนะนำให้เริ่มต้นด้วย JAGS หรือ Stan แล้วย้ายไปเขียน MCMC ของคุณเองหากคุณต้องการ โปรดทราบว่า JAGS และ Stan มีจุดแข็งและข้อ จำกัด ต่างกันเล็กน้อย
— conjugateprior

ขอบคุณ! ใช่ฉันกำลังทำวิจัยประยุกต์ คุณช่วยบอกฉันเพิ่มเติมเกี่ยวกับข้อ จำกัด ของ JAGS และ Stan ได้ไหม ฉันลองสแตนครั้งแรก แต่ฉันเพิ่งพบว่ามันไม่มีคุณสมบัติ "การตรวจสอบออนไลน์" หรือ "ตัวอย่างจนกว่าจะมาบรรจบกัน" หรือส่วนเสริม --- นี่เป็นเรื่องที่น่ารำคาญฉันอาจลองใช้ JAGS ทันที
— user112758

คำตอบ:


26

โดยทั่วไปแล้วฉันขอแนะนำไม่ให้เข้ารหัส MCMC ของคุณสำหรับการวิเคราะห์แบบเบย์ที่ใช้จริง นี่เป็นทั้งการทำงานและเวลาและมีแนวโน้มที่จะแนะนำบั๊กในโค้ด ตัวอย่างของ Blackbox เช่น Stan ใช้ตัวอย่างที่ซับซ้อนมากแล้ว เชื่อฉันสิคุณจะไม่เขียนรหัสตัวอย่างนี้สำหรับการวิเคราะห์เพียงครั้งเดียว!

มีกรณีพิเศษที่จะไม่เพียงพอ ตัวอย่างเช่นหากคุณต้องการทำการวิเคราะห์แบบเรียลไทม์ (เช่นการตัดสินใจทางคอมพิวเตอร์โดยใช้ข้อมูลที่เข้ามา) โปรแกรมเหล่านี้จะไม่เป็นความคิดที่ดี เนื่องจาก Stan ต้องการคอมไพล์โค้ด C ++ ซึ่งอาจใช้เวลามากกว่าการใช้แซมเพลอร์ที่เตรียมไว้แล้วสำหรับรุ่นที่ค่อนข้างง่าย ในกรณีนั้นคุณอาจต้องการเขียนรหัสของคุณเอง นอกจากนี้ฉันเชื่อว่ามีกรณีพิเศษที่แพคเกจอย่างสแตนทำได้ไม่ดีมากเช่นโมเดลของรัฐที่ไม่ใช่แบบเกาส์ (การเปิดเผยอย่างเต็มรูปแบบ: ฉันเชื่อว่าสแตนไม่ดีในกรณีนี้ แต่ไม่รู้) ในกรณีดังกล่าวอาจคุ้มค่าที่จะใช้ MCMC แบบกำหนดเอง แต่นี่เป็นข้อยกเว้นไม่ใช่กฎ!

พูดตามตรงฉันคิดว่านักวิจัยส่วนใหญ่ที่เขียนตัวอย่างสำหรับการวิเคราะห์เพียงครั้งเดียว (และสิ่งนี้เกิดขึ้นฉันได้เห็นแล้ว) ทำเช่นนั้นเพราะพวกเขาชอบเขียนตัวอย่างของตัวเอง อย่างน้อยที่สุดฉันสามารถพูดได้ว่าฉันตกอยู่ภายใต้หมวดหมู่นั้น (เช่นฉันผิดหวังที่การเขียนตัวอย่างของตัวเองไม่ใช่วิธีที่ดีที่สุดในการทำสิ่งต่าง ๆ )

นอกจากนี้ในขณะที่มันไม่สมเหตุสมผลที่จะเขียนตัวอย่างของคุณเองสำหรับการวิเคราะห์เพียงครั้งเดียวแต่มันก็สมเหตุสมผลที่จะเขียนโค้ดของคุณเองสำหรับคลาสของการวิเคราะห์. เนื่องจาก JAG, Stan ฯลฯ เป็นตัวอย่างกล่องดำคุณสามารถทำให้สิ่งต่าง ๆ เร็วขึ้นโดยผู้เชี่ยวชาญสำหรับรุ่นที่กำหนดแม้ว่าจำนวนของการปรับปรุงจะขึ้นอยู่กับรุ่น แต่การเขียนตัวอย่างที่มีประสิทธิภาพสูงจากพื้นดินขึ้นมาอาจจะเป็น 10-1,000 ชั่วโมงของการทำงานขึ้นอยู่กับประสบการณ์ความซับซ้อนของแบบจำลอง ฯลฯ หากคุณกำลังทำวิจัยในวิธีการแบบเบย์หรือการเขียนซอฟต์แวร์เชิงสถิติ มันเป็นงานของคุณ แต่ถ้าเจ้านายของคุณพูดว่า "เฮ้คุณสามารถวิเคราะห์ชุดข้อมูลการวัดซ้ำนี้ได้ไหม?" และคุณใช้เวลา 250 ชั่วโมงในการเขียนตัวอย่างที่มีประสิทธิภาพเจ้านายของคุณมีแนวโน้มที่จะอารมณ์เสีย ในทางตรงกันข้ามคุณอาจจะเขียนแบบจำลองนี้ในสแตนอินพูด 2 ชั่วโมงและมีเวลาทำงาน 2 นาทีแทนที่จะใช้เวลา 1 นาทีโดยตัวอย่างที่มีประสิทธิภาพ


3
+1 นอกจากนี้สแตนไม่ได้จัดการกับปัญหาบางอย่างที่เกี่ยวข้องกับการแจกแจงแบบแยกดังนั้นคุณต้องรู้พอที่จะรวมเอาสิ่งเหล่านี้ซึ่งไม่ได้อยู่ในตัวของมันเองง่ายๆดังนั้นอาจเป็นกรณีที่การหมุนของคุณเองอาจช่วย ฉันเชื่อว่า JAGS จัดการกรณีดังกล่าวโดยตรงดังนั้นหากคุณสามารถรักษาปรัชญาที่แตกต่างกันของ BUGS / JAGS และ Stan แยกจากกันในใจของคุณมันจะเป็นการดีที่สุดที่จะสลับไปมาระหว่างพวกเขา
— Wayne

ยิ่งไปกว่านั้นสแตนอาจมีปัญหาในกรณีที่การปริภูมิแบบยุคลิดแบบทแยงมุมไม่เหมาะกับรูปทรงเรขาคณิตของหลัง นี่คือกรณีอนึ่งเมื่อมีเพียงพื้นที่แคบรูปทรงแปลก ๆ ของหลังซึ่งมีความน่าจะเป็นมาก ผลที่ได้คือการสุ่มตัวอย่างด้านหลังเหมือนพยายามขี่จักรยานไปตามขอบหน้าผา: คุณอาจ "ล้ม" ถ้าคุณเลี้ยวผิด!
— Sycorax พูดว่า Reinstate Monica

2
+1 คำแนะนำทั่วไปของฉันสำหรับนักเรียนคือการเขียนโค้ดใน JAGS หากวิธีนี้ใช้ไม่ได้ผลให้โค้ดใน Stan หากวิธีนี้ใช้ไม่ได้ผลให้เริ่มเขียนตัวอย่างของคุณเอง นอกจากนี้ยังมีบางรุ่นเช่นโมเดลอวกาศซึ่งคุณอาจต้องการใช้ BUGS และบางรุ่นเช่นโมเดลที่ไม่ใช่แบบเกาส์ที่คุณต้องการใช้ NIMBLE ค่าเสียโอกาสในการเริ่มต้นด้วยการเขียนตัวอย่างของคุณเองสูงเกินไป
— jaradniemi

ฉันไม่เข้าใจกรณี "เรียลไทม์" - ถ้าเป็นไปได้ที่จะมีตัวอย่างของตัวเอง "เตรียมไว้แล้ว" ทำไมมันไม่ง่ายเลยที่จะใช้โมเดลสแตนที่รวบรวมไว้แล้ว? ฉันยังสงสัยว่า MCMC ใด ๆ นั้นเร็วพอสำหรับการใช้งานแบบเรียลไทม์
— Juho Kokkala

1
และฉันก็ไม่คุ้นเคยกับสแตนที่จะรู้ว่าสิ่งที่ต้องรวบรวมรุ่นใหม่ แต่ก็ไม่ยากเกินกว่าจะจินตนาการได้ว่าสิ่งที่ จำกัด คือมีโมเดลแบบไดนามิกเช่นเมื่อมีข้อมูลใหม่เข้ามาโมเดลจะมีความซับซ้อนมากขึ้น และการคอมไพล์ซ้ำจึงจำเป็น ฉันคิดว่าวิธีที่ไม่ใช่พารามิเตอร์ (ซึ่งพื้นที่พารามิเตอร์เติบโตขึ้นกับขนาดตัวอย่าง) จะพอดีกับเกณฑ์นั้นหรือไม่ แต่อาจมีวิธีที่ชาญฉลาดในการหลีกเลี่ยงสิ่งนั้น
— หน้าผา AB

6

คำถามนี้ใช้ความคิดเห็นเป็นหลัก แต่ฉันคิดว่ามีคำตอบที่เพียงพอที่นี่ อาจมีหลายเหตุผลในการเขียนโค้ดตัวอย่างของตัวเองสำหรับปัญหาการวิจัย นี่คือบางส่วนของพวกเขา

  1. ข้อเสนอ:ตามคำแนะนำของ fcop ในความคิดเห็นของพวกเขาหากตัวอย่างคือ MH การเข้ารหัสตัวอย่างของคุณเองช่วยให้คุณสามารถเล่นกับการแจกแจงข้อเสนอเพื่อรับตัวอย่างการผสมที่ดีที่สุด

  2. ความยืดหยุ่น:ในโปรแกรมที่สร้างขึ้นอาจไม่ให้ความยืดหยุ่นตามที่คุณต้องการ คุณอาจต้องการเริ่มต้นด้วยค่าสุ่มที่เฉพาะเจาะจงหรือใช้โครงสร้างเมล็ดพันธุ์ที่เฉพาะเจาะจง

  3. ความเข้าใจ: การเขียนโค้ดตัวอย่างของคุณเองจะช่วยให้คุณเข้าใจพฤติกรรมของตัวอย่างได้โดยให้ข้อมูลเชิงลึกเกี่ยวกับกระบวนการลูกโซ่มาร์คอฟ สิ่งนี้มีประโยชน์สำหรับนักวิจัยที่ทำงานเกี่ยวกับปัญหา

  4. Onus:ถ้าข้อมูลที่ฉันใช้ในการอนุมานแบบเบย์ทั้งหมดนั้นมาจากโปรแกรมที่ฉันไม่ได้เขียนโค้ดดังนั้นความรับผิดชอบในการอนุมานจะไม่อยู่กับฉันอีกต่อไป ในฐานะนักวิจัยฉันต้องการรับผิดชอบวิธีการ / ผลลัพธ์ที่ฉันนำเสนออย่างเต็มที่ การใช้วิธีการที่สร้างขึ้นไม่อนุญาตให้คุณทำเช่นนั้น

อาจมีเหตุผลมากกว่านี้ แต่สิ่งเหล่านี้คือสิ่งที่ทำให้ฉันเขียนโค้ดตัวอย่างของฉันเอง


6
ฉันบอกว่าเหตุผล "ความไว้วางใจ" นั้นเป็นที่ถกเถียงกัน: สแตนเป็นโอเพนซอร์ซและมีผู้มีส่วนร่วมมากมายดังนั้นหลายคนจึงมองว่ามันเป็นซอร์สโค้ดดังนั้นจึงไม่น่าเป็นไปได้ว่ามันจะมีข้อบกพร่องร้ายแรง บนมืออื่นถ้าคุณทำมันด้วยตัวเองคุณก็สามารถมองเห็นข้อผิดพลาดที่คุณทำ - และทุกคนที่ทำให้ข้อบกพร่องมันเป็นเพียงเรื่องของจำนวนบรรทัดของรหัสที่คุณเขียน ...
— ทิม

@Tim ฉันเห็นด้วย ฉันเปลี่ยนจุดนั้นเพื่อสะท้อนสิ่งที่ฉันพยายามจะพูด ขอบคุณ
— Greenparker

5
+1 สำหรับอาร์กิวเมนต์การทำความเข้าใจ อย่างไรก็ตามอาร์กิวเมนต์ของ Onus นั้นดูเหมือนว่าคุยเกินจริงไปเล็กน้อย เกือบทุกอย่างที่คุณเขียนขึ้นเองนั้นขึ้นอยู่กับภาษาสถิติของคนอื่นห้องสมุดพีชคณิตเชิงเส้นตัวสร้างตัวเลขสุ่ม ฯลฯ ดังนั้น 'การรับผิดชอบ' จึงเป็นเรื่องของปริญญา
— conjugateprior

@conjugateprior เห็นด้วยอย่างแน่นอน นี่คือเหตุผลที่คำตอบของฉันคือในคนแรก นี่เป็นความคิดของฉันอย่างหมดจด
— Greenparker

4

ฉันตอบ +1 ของ Cliff AB หากต้องการเพิ่มชิ้นอาหารอันโอชะเล็ก ๆ น้อย ๆ ถ้าคุณต้องการทำงานในระดับที่ต่ำกว่า แต่ไม่ลงไปที่ระดับรหัสทุกอย่างด้วยตัวคุณเองคุณควรจะไปรอบ ๆ สำหรับแพคเกจLapacesDemon ผู้เขียนต้นฉบับยอดเยี่ยม แต่ดูเหมือนว่าจะหลุดออกจากตารางและมีคนอื่นมายึดครองบรรจุภัณฑ์ (เชื่อใน Github ฉันเชื่อ)

มันใช้อัลกอริธึมที่น่าประทับใจจำนวนมากที่ใช้ใน MCMC และ Vignettes ที่รวมมานั้นมีค่าควรอ่านแม้ว่าคุณจะไม่ได้ใช้แพ็คเกจ ค่อนข้างตัวอย่างชนิดใด ๆ ที่คุณอ่านมันมี โค้ดของคุณแตกต่างจาก BUGS / JAGS หรือ Stan และทั้งหมดอยู่ใน R แต่บ่อยครั้งที่มันมีประสิทธิภาพมากจนสามารถแข่งขันได้


1
ปลั๊กไร้ยางอาย: คุณสามารถใช้ [nimble] (r-nimble.org) ที่อนุญาตให้คุณปรับแต่ง MCMC ของคุณ (เช่นใช้ชิ้นตัวอย่างสำหรับโหนดนี้บล็อกตัวอัปเดตสำหรับกลุ่มโหนด ฯลฯ ) โดยไม่จำเป็นต้องเขียนซ้ำ ตัวอย่างนี้ทุกครั้ง และคุณยังสามารถเขียนตัวอย่างของคุณเองเพื่อนำไปใช้โดยตรง! การเปิดเผย: ฉันเคยทำงานในโครงการนี้
— หน้าผา AB

@CliffAB: ฟังดูคล้ายกับLaplacesDemonถ้าคุณคุ้นเคยกับมัน ดีใจที่ได้ยินnimbleเช่นกัน อย่างน้อยฉันจะดาวน์โหลด (ถึงแม้ว่าบทความ Lap LapDDemon หลายรายการอาจจะคุ้มค่ากับการดาวน์โหลดแม้ว่าคุณจะใช้ว่องไวก็ตาม) ... Ohhh เพียงไปที่หน้า ถ้า SMC ใช้งานง่ายฉันจะกลายเป็นแฟนตัวยง แพ็คเกจ R เดียวที่ฉันเห็นว่า SMC มีความซับซ้อนอย่างน่ากลัว
— Wayne

@CliffAB: ว้าวหลังจากอ่านnimbleเว็บไซต์แล้วมันค่อนข้างน่าประทับใจ ทำไมฉันไม่เคยได้ยินเรื่องนี้บ้าง? ดูเหมือนว่าเป็นตัวเลือกที่ยอดเยี่ยมสำหรับคนที่เคยชินภาษาแบบจำลอง BUGS / JAGS แน่นอนพวกเขาจะทำการเปรียบเทียบที่ดีที่สุดบนเว็บไซต์ แต่ฉันก็ยังชอบมันอยู่ (ยกเว้นว่าด้วยrstanarmและbrmsซึ่งใช้สแตนภายใต้ฝากระโปรงแชมป์ที่ใช้งานง่ายในอาร์จะเป็นสแตน)
— Wayne

มันยังใหม่อยู่มาก: v0.1 เปิดตัวฉันคิดว่าเมื่อ 2 ปีก่อน? และ SMC ก็เป็นแรงบันดาลใจอย่างมากสำหรับโครงการ: PI ได้ทำการเผยแพร่จำนวนมากบนตัวกรองอนุภาคและรู้สึกรำคาญที่ได้เขียนมันขึ้นมาตั้งแต่ต้นทุกครั้ง แต่ฉันก็ยังคงทำงานอยู่เล็กน้อยเพื่อให้ทันกับสถานะปัจจุบันของตัวอย่างของ SMC เมื่อฉันจากไป (เกือบสองปีที่แล้ว) เราเพิ่งจะรวบรวมสิ่งดั้งเดิมไว้ด้วยกัน
— หน้าผา AB

1
แค่พูดบทความarXivนี้คุณอาจสนใจ
— Cliff AB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.