ทำ 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.