ฉันสามารถทำการวินิจฉัยการบรรจบกันของ MCMC แบบกึ่งอัตโนมัติเพื่อตั้งค่าความยาวเบิร์นอินได้หรือไม่?


13

ฉันต้องการให้ตัวเลือกการเบิร์นอินสำหรับเครือข่าย MCMC โดยอัตโนมัติเช่นโดยการลบแถว n แรกตามการวิเคราะห์การลู่เข้า

ขั้นตอนนี้จะปลอดภัยโดยอัตโนมัติในระดับใด แม้ว่าฉันจะยังตรวจสอบ autocorrelation, การติดตาม mcmc และ PDF อีกครั้งมันก็ดีถ้ามีทางเลือกในการเบิร์นอินแบบอัตโนมัติ

คำถามของฉันเป็นเรื่องทั่วไป แต่มันจะดีถ้าคุณสามารถให้ข้อมูลเฉพาะสำหรับการจัดการกับ R mcmc.object; ฉันใช้แพ็คเกจ rjags และ coda ใน R


แม้ว่าจะไม่รวมอยู่ในคำถามเดิม แต่ก็มีประโยชน์ที่จะกำหนดช่วงเวลาการทำให้ผอมบางโดยอัตโนมัติตามที่เสนอในคำตอบของฉัน
David LeBauer

1
ฉันอยากจะพูดถึงว่าในฐานะคนที่มีความสนใจในการทำอัลกอริทึม MCMC ทั่วไปที่ใช้กับปัญหาได้อย่างง่ายดายฉันสนใจในหัวข้อนี้มาก
John Salvatier

คำตอบ:


6

นี่เป็นวิธีหนึ่งในระบบอัตโนมัติ ข้อเสนอแนะชื่นชมมาก นี่คือความพยายามที่จะแทนที่การตรวจสอบด้วยภาพครั้งแรกด้วยการคำนวณตามด้วยการตรวจสอบด้วยสายตาที่ตามมาเพื่อให้สอดคล้องกับมาตรฐานการปฏิบัติ

โซลูชันนี้รวมสองโซลูชันที่เป็นไปได้ก่อนอื่นคำนวณการเบิร์นอินเพื่อลบความยาวของโซ่ก่อนถึงขีด จำกัด บางส่วนจากนั้นใช้เมทริกซ์

  1. คำนวณเวกเตอร์ของค่ามัธยฐานสูงสุดของเจลแมน - รูบินคอนเวอร์เจนซ์การวินิจฉัยการย่อส่วน (grsf) สำหรับตัวแปรทั้งหมดใน
  2. ค้นหาจำนวนตัวอย่างขั้นต่ำที่ grsf ในทุกตัวแปรต่ำกว่าขีด จำกัด บางตัวอย่างเช่น 1.1 ในตัวอย่างอาจต่ำกว่าในทางปฏิบัติ
  3. ย่อยตัวอย่างเชนจากจุดนี้ไปยังจุดสิ้นสุดของเชน
  4. ทำให้โซ่บางโดยใช้ความสัมพันธ์อัตโนมัติของโซ่ที่สัมพันธ์กันมากที่สุด
  5. ยืนยันคอนเวอร์เจนซ์ด้วยการติดตาม, การหาค่าอัตโนมัติและแปลงความหนาแน่น

วัตถุ mcmc สามารถดาวน์โหลดได้ที่นี่: jags.out.Rdata

# jags.out is the mcmc.object with m variables
library(coda)    
load('jags.out.Rdata')
# 1. calculate max.gd.vec, 
# max.gd.vec is a vector of the maximum shrink factor
max.gd.vec     <- apply(gelman.plot(jags.out)$shrink[, ,'median'], 1, max)
# 2. will use window() to subsample the jags.out mcmc.object
# 3. start window at min(where max.gd.vec < 1.1, 100) 
window.start   <- max(100, min(as.numeric(names(which(max.gd.vec - 1.1 < 0)))))
jags.out.trunc <- window(jags.out, start = window.start)
# 4. calculate thinning interval
# thin.int is the chain thin interval
# step is very slow 
# 4.1 find n most autocorrelated variables
n = min(3, ncol(acm))
acm             <- autocorr.diag(jags.out.trunc)
acm.subset      <- colnames(acm)[rank(-colSums(acm))][1:n]
jags.out.subset <- jags.out.trunc[,acm.subset]
# 4.2 calculate the thinning interval
# ac.int is the time step interval for autocorrelation matrix
ac.int          <- 500 #set high to reduce computation time
thin.int        <- max(apply(acm2 < 0, 2, function(x) match(T,x)) * ac.int, 50)
# 4.3 thin the chain 
jags.out.thin   <- window(jags.out.trunc, thin = thin.int)
# 5. plots for visual diagnostics
plot(jags.out.thin)
autocorr.plot(jags.win.out.thin)

--update--

เมื่อนำมาใช้ใน R การคำนวณของเมทริกซ์ autocorrelation ช้ากว่าที่ต้องการ (> 15 นาทีในบางกรณี) ในระดับที่น้อยกว่าดังนั้นการคำนวณของ GR shrink factor มีคำถามเกี่ยวกับวิธีเพิ่มความเร็วขั้นตอนที่ 4 ใน stackoverflow ที่นี่

- ปรับปรุงส่วนที่ 2--

คำตอบเพิ่มเติม:

  1. มันเป็นไปไม่ได้ที่จะวินิจฉัยการบรรจบกันเพียงเพื่อวินิจฉัยการขาดการบรรจบกัน(Brooks, Giudici และ Philippe, 2003)

  2. ฟังก์ชั่น autorun.jags จากแพ็คเกจrunjags ทำการคำนวณระยะเวลาในการรันและการวินิจฉัยการลู่เข้าแบบอัตโนมัติ มันไม่ได้เริ่มตรวจสอบห่วงโซ่จนกว่าการวินิจฉัย Rubman ของ Gelman จะต่ำกว่า 1.05; มันคำนวณความยาวโซ่โดยใช้การวินิจฉัยของ Raftery และ Lewis

  3. Gelman และคณะ (การวิเคราะห์ข้อมูล Bayesian 2004, 295, Gelman และ Shirley, 2010 ) ระบุว่าพวกเขาใช้วิธีอนุรักษ์นิยมในการทิ้งช่วงครึ่งแรกของห่วงโซ่ แม้ว่าจะเป็นวิธีแก้ปัญหาที่ค่อนข้างง่าย แต่ในทางปฏิบัติมันก็เพียงพอที่จะแก้ปัญหาสำหรับชุดรูปแบบและข้อมูลเฉพาะของฉัน


#code for answer 3
chain.length <- summary(jags.out)$end
jags.out.trunc <- window(jags.out, start = chain.length / 2)
# thin based on autocorrelation if < 50, otherwise ignore
acm <- autocorr.diag(jags.out.trunc, lags = c(1, 5, 10, 15, 25))
# require visual inspection, check acceptance rate
if (acm == 50) stop('check acceptance rate, inspect diagnostic figures') 
thin.int <- min(apply(acm2 < 0, 2, function(x) match(TRUE, x)), 50)
jags.out.thin <- window(jags.out.trunc, thin = thin.int)

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

ในเอกสารประกอบ runjags ฉันเห็นว่า autorun.jags พูดว่าแบบจำลองนั้นได้รับการประเมินโดยอัตโนมัติสำหรับการลู่เข้าและขนาดตัวอย่างที่เพียงพอก่อนที่จะถูกส่งคืน คุณช่วยชี้ให้ฉันไปยังที่ที่คุณพบว่า autorun.jags ไม่เริ่มตรวจสอบห่วงโซ่จนกว่าการวินิจฉัย rubman ของ Gelman จะต่ำกว่า 1.05 ขอบคุณ
user1068430

@ user1068430 ในautorun.jagsการ...ช่วยให้พารามิเตอร์ที่จะส่งผ่านไปยังadd.summaryฟังก์ชั่น add.summaryฟังก์ชั่นที่มีการโต้แย้งpsrf.targetมีค่าเริ่มต้น 1.05
เดวิด LeBauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.