MCMCチェーンのバーンインの選択を自動化したいと思います。たとえば、収束診断に基づいて最初のn行を削除します。
このステップはどの程度安全に自動化できますか?それでも自己相関、mcmcトレース、pdfをダブルチェックしても、バーンインの長さを自動で選択できると便利です。
私の質問は一般的ですが、R mcmc.objectを処理するための詳細を提供できれば素晴らしいと思います。Rでrjagsおよびcodaパッケージを使用しています。
MCMCチェーンのバーンインの選択を自動化したいと思います。たとえば、収束診断に基づいて最初のn行を削除します。
このステップはどの程度安全に自動化できますか?それでも自己相関、mcmcトレース、pdfをダブルチェックしても、バーンインの長さを自動で選択できると便利です。
私の質問は一般的ですが、R mcmc.objectを処理するための詳細を提供できれば素晴らしいと思います。Rでrjagsおよびcodaパッケージを使用しています。
回答:
自動化のアプローチの1つを次に示します。フィードバックは大歓迎です。これは、標準的な慣行に従って、最初の目視検査を計算に置き換え、その後に続く目視検査を行う試みです。
このソリューションには、実際には2つの潜在的なソリューションが組み込まれています。まず、バーンインを計算して、あるしきい値に達する前にチェーンの長さを削除し、次に自己相関行列を使用して間引き間隔を計算します。
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)
- 更新 -
Rで実装されているように、自己相関行列の計算は望ましい程度(場合によっては15分以上)より遅くなりますが、GR収縮係数の計算もより遅くなります。ここでstackoverflowのステップ4を高速化する方法について質問があります
-パート2の更新-
追加の回答:
収束を診断することはできませんが、収束の欠如を診断するだけです(Brooks、Giudici、and Philippe、2003)
パッケージrunjagsの関数autorun.jagsは、ランレングスと収束診断の計算を自動化します。Gelmanルービン診断が1.05未満になるまで、チェーンの監視を開始しません。RafteryおよびLewis診断を使用してチェーンの長さを計算します。
Gelman et al's(Gelman 2004 Bayesian Data Analysis、p。295、Gelman and 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)
autorun.jags
では、...
パラメータをadd.summary
関数に渡すことができます。add.summary
関数は、引数があるpsrf.target
1.05のデフォルト値を持つ