क्या मैं जला हुआ लंबाई निर्धारित करने के लिए MCMC अभिसरण निदान अर्ध स्वचालित कर सकता हूं?


13

मैं MCMC श्रृंखला के लिए बर्न-इन की पसंद को स्वचालित करना चाहता हूं, उदाहरण के लिए एक अभिसरण निदान के आधार पर पहली n पंक्तियों को हटाकर।

इस चरण को किस हद तक सुरक्षित रूप से स्वचालित किया जा सकता है? यहां तक ​​कि अगर मैं अभी भी ऑटोक्रॉलेशन, mcmc ट्रेस, और pdfs की दोहरी जांच करता हूं, तो बर्न-इन लंबाई का विकल्प स्वचालित रूप से रखना अच्छा होगा।

मेरा प्रश्न सामान्य है, लेकिन यह बहुत अच्छा होगा यदि आप R mcmc.object से निपटने के लिए विवरण प्रदान कर सकते हैं; मैं आरजैग और कोडा पैकेज का उपयोग आर में कर रहा हूं।


हालांकि मूल प्रश्न में शामिल नहीं है, यह मेरे जवाब में प्रस्तावित रूप से थिनिंग अंतराल को स्वचालित रूप से सेट करने के लिए भी उपयोगी होगा।
डेविड लेबॉयर

1
मैं केवल इस बात का उल्लेख करना चाहूंगा कि जेनेरिक MCMC एल्गोरिदम बनाने में दिलचस्पी रखने वाले, कई समस्याओं के लिए आसानी से लागू होने वाले, मैं इस विषय में बहुत रुचि रखता हूं।
जॉन साल्वेटियर

जवाबों:


6

यहाँ स्वचालन पर एक दृष्टिकोण है। प्रतिक्रिया बहुत सराहना की। यह गणना के साथ प्रारंभिक दृश्य निरीक्षण को बदलने का प्रयास है, इसके बाद मानक अभ्यास को ध्यान में रखते हुए बाद में दृश्य निरीक्षण किया जाता है।

यह समाधान वास्तव में दो संभावित समाधानों को शामिल करता है, पहले, थ्रेसहोल्ड तक पहुंचने से पहले चेन की लंबाई को दूर करने के लिए बर्न-इन की गणना करें, और फिर थिनिंग अंतराल की गणना करने के लिए ऑटोक्रॉलेशन मैट्रिक्स का उपयोग करें।

  1. में सभी चर के लिए अधिकतम मंझला गेलमैन-रुबिन अभिसरण नैदानिक ​​सिकुड़न कारक (जीएसएफ) के वेक्टर की गणना करें
  2. उन सभी नमूनों की न्यूनतम संख्या ज्ञात करें जिन पर सभी चर में grsf कुछ सीमा से नीचे जाता है, उदाहरण के लिए उदाहरण में 1.1, शायद व्यवहार में कम
  3. इस बिंदु से श्रृंखला के अंत तक उप नमूना
  4. सबसे autocorrelated श्रृंखला के autocorrelation का उपयोग करके श्रृंखला को पतला करता है
  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)

--अपडेट करें--

जैसा कि आर में कार्यान्वित किया गया है ऑटोकॉर्पशन मैट्रिक्स की गणना धीमी है (कुछ मामलों में> 15 मिनट), कुछ हद तक वांछनीय होगा, इसलिए जीआर हटना कारक की गणना है। कैसे stackoverflow पर चरण 4 में तेजी लाने के बारे में एक प्रश्न नहीं है यहां

- हिस्सा 2 -

अतिरिक्त जवाब:

  1. अभिसरण का निदान करना संभव नहीं है, केवल अभिसरण की कमी का निदान करने के लिए (ब्रूक्स, गिउडीसी और फिलिप, 2003)

  2. पैकेज रनजैग से फ़ंक्शन ऑटोरुन.जैग्स रन लंबाई और अभिसरण निदान की गणना को स्वचालित करता है। यह तब तक श्रृंखला की निगरानी शुरू नहीं करता है जब तक कि जेलमैन रुबिन डायग्नोस्टिक 1.05 से नीचे नहीं होता है; यह Raftery और लुईस नैदानिक ​​का उपयोग करके श्रृंखला की लंबाई की गणना करता है।

  3. गेलमैन एट अल (गेलमैन 2004 बेयसियन डेटा एनालिसिस, पृष्ठ 295, जेलमैन और शर्ली, 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
दो सिद्धांत लागू होते हैं: आप कभी नहीं जान सकते कि आपकी श्रृंखला इसके स्थिर वितरण में परिवर्तित हो गई है या नहीं। और अभिसरण के लिए कोई भी परीक्षण जो आप मैन्युअल रूप से कर सकते हैं, आप स्वचालित कर सकते हैं। तो आपका दृष्टिकोण पर्याप्त लगता है।
ट्रिस्टन

रनजैग डॉक्यूमेंटेशन में मैं देखता हूं कि ऑटोरन.जैग्स कहते हैं कि मॉडल का मूल्यांकन स्वचालित रूप से अभिसरण और पर्याप्त नमूना आकार में होने से पहले किया जाता है। क्या आप मुझे इंगित कर सकते हैं कि आपने कहां पाया कि ऑटोरन.जैग चेन की निगरानी तब तक शुरू नहीं करते हैं जब तक कि गेलमैन रूबिन डायग्नोस्टिक 1.05 से कम नहीं हो जाता है? धन्यवाद
user1068430

@ user1068430 में autorun.jags, ...पैरामीटर को फंक्शन में जाने की अनुमति देता add.summaryहै। add.summaryसमारोह एक तर्क है psrf.target1.05 डिफ़ॉल्ट मान के साथ
डेविड LeBauer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.