MCMC収束診断を半自動化してバーンインの長さを設定できますか?


13

MCMCチェーンのバーンインの選択を自動化したいと思います。たとえば、収束診断に基づいて最初のn行を削除します。

このステップはどの程度安全に自動化できますか?それでも自己相関、mcmcトレース、pdfをダブルチェックしても、バーンインの長さを自動で選択できると便利です。

私の質問は一般的ですが、R mcmc.objectを処理するための詳細を提供できれば素晴らしいと思います。Rでrjagsおよびcodaパッケージを使用しています。


元の質問には含まれていませんが、私の回答で提案されているように間引き間隔を自動的に設定することも役立ちます。
デビッドルバウアー

1
多くの問題に簡単に適用できる一般的なMCMCアルゴリズムの作成に興味がある人として、私はこのトピックに非常に興味を持っています。
ジョンサルバティエ

回答:


6

自動化のアプローチの1つを次に示します。フィードバックは大歓迎です。これは、標準的な慣行に従って、最初の目視検査を計算に置き換え、その後に続く目視検査を行う試みです。

このソリューションには、実際には2つの潜在的なソリューションが組み込まれています。まず、バーンインを計算して、あるしきい値に達する前にチェーンの長さを削除し、次に自己相関行列を使用して間引き間隔を計算します。

  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)

- 更新 -

Rで実装されているように、自己相関行列の計算は望ましい程度(場合によっては15分以上)より遅くなりますが、GR収縮係数の計算もより遅くなります。ここでstackoverflowのステップ4を高速化する方法について質問があります

-パート2の更新-

追加の回答:

  1. 収束を診断することはできませんが、収束の欠如を診断するだけです(Brooks、Giudici、and Philippe、2003)

  2. パッケージrunjagsの関数autorun.jagsは、ランレングスと収束診断の計算を自動化します。Gelmanルービン診断が1.05未満になるまで、チェーンの監視を開始しません。RafteryおよびLewis診断を使用してチェーンの長さを計算します。

  3. 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)

2
2つの原則が適用されます。チェーンが定常分布に収束したかどうかを知ることはできません。また、手動で実行できる収束のテストであれば、自動化できます。あなたのアプローチは十分に聞こえるようです。
トリスタン

runjagsのドキュメントで、autorun.jagsには、返される前にモデルの収束と適切なサンプルサイズが自動的に評価されると書かれています。ゲルマンルービン診断が1.05を下回るまで、autorun.jagsがチェーンの監視を開始しないことがわかった場所を教えてください。ありがとう
-user1068430

@ user1068430 in autorun.jagsでは、...パラメータをadd.summary関数に渡すことができます。add.summary関数は、引数があるpsrf.target1.05のデフォルト値を持つ
デビッドLeBauer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.