この回答は、n.adapt 引数を取るパッケージ rjags に基づいています。最初に、適応、バーンイン、および間引きの意味について説明し、次に構文について説明します (バーンインと間引きの意味はよく知っていると思いますが、適応については理解していません。完全な説明が必要な場合があります)。この回答を将来の読者にとってより役立つものにしてください)。
バーンイン
MCMC サンプリングの紹介から理解できると思いますが、MCMC チェーンのいくつかの反復はバーンインとして破棄する必要があります。これは、モデルをフィッティングする前に、合理的な事後確率の領域である特性セット内で MCMC チェーンを初期化したかどうかがわからないためです。この領域の外で初期化されたチェーンは、領域を見つけて探索を開始するために、有限の (場合によっては多数の) 反復回数を必要とします。この調査期間の MCMC サンプルは、事後分布からランダムに抽出されたものではありません。したがって、各 MCMC チェーンの最初の部分を「バーンイン」として破棄するのが標準です。チェーンのどれだけを破棄する必要があるかを判断するための事後手法がいくつかあります。
間引き
最も単純なモデルを除くすべてのモデルで、MCMC サンプリング アルゴリズムが、連続する描画が実質的に自己相関するチェーンを生成するため、別の問題が発生します。したがって、MCMC チェーン (バーンイン後) のすべての反復に基づいて事後を要約することは、有効な事後サンプル サイズがアナリストが認識するよりもはるかに小さい可能性があるため、お勧めできません (ハミルトニアン モンテカルロ サンプリングの STAN の実装は劇的に減少することに注意してください)。この問題は状況によっては発生します)。したがって、MCMC 反復の一部のみが推論に使用される「間引き」チェーンで推論を行うのが標準です (たとえば、自己相関の重大度に応じて、5 回目、10 回目、または 100 回ごとの反復のみ)。
適応
JAGS が事後データをサンプリングするために使用する MCMC サンプラーは、正確な動作に影響を与える調整可能なパラメーターによって管理されます。これらのパラメータを適切に調整することで、サンプリングの速度または無相関化を向上させることができます。JAGS には、これらのパラメータを自動的に調整する機構が含まれており、事後サンプルを描画する際に調整を行います。このプロセスは適応と呼ばれますが、非マルコフ的です。結果のサンプルはマルコフ連鎖を構成しません。したがって、アダプテーション後に別途バーンインを実行する必要があります。順応期間をバーンインに置き換えるのは正しくありません。ただし、場合によっては、適応後に比較的短いバーンインのみが必要になることがあります。
構文
非常に具体的な例を見てみましょう (OP のコードは、実際にはパラメーターが好きな場所n.adapt
やthin
使用される場所を示していません)。各ステップが明確になるように、rjags にモデルを適合させるように依頼します。
n.chains = 3
n.adapt = 1000
n.burn = 10000
n.iter = 20000
thin = 50
my.model <- jags.model(mymodel.txt, data=X, inits=Y, n.adapt=n.adapt) # X is a list pointing JAGS to where the data are, Y is a vector or function giving initial values
update(my.model, n.burn)
my.samples <- coda.samples(my.model, params, n.iter=n.iter, thin=thin) # params is a list of parameters for which to set trace monitors (i.e. we want posterior inference on these parameters)
jags.model()
有向非巡回グラフを作成し、 で指定された反復回数だけ適応フェーズを実行しn.adapt
ます。
update()
事後サンプルを保存せずに MCMC をn.burn
繰り返し実行することにより、各チェーンでバーンインを実行します (完全なチェーンを調べて、事後的にバーンイン期間を破棄する場合は、この手順をスキップしてください)。
coda.samples()
(coda パッケージから) で指定された反復回数だけ各 MCMC チェーンを実行しますがn.iter
、すべての反復を保存するわけではありません。代わりに、n 番目の反復のみを保存します。ここで、n は次の式で与えられます。thin
. 繰り返しますが、事後的に間引き間隔を決定したい場合は、この段階で間引きする必要はありません。この段階で間引きを行う利点の 1 つは、coda 構文によって間引きが簡単になることです。coda.samples()
によって返される MCMC オブジェクトの構造を理解して自分で薄くする必要はありません。n.iter が非常に大きい場合、この段階で間引きすることのより大きな利点が実現されます。たとえば、自己相関が非常に悪い場合は、200 万回の反復を実行し、1,000 番目ごとにのみ保存します ( thin=1000
)。この段階で間引きを行わなかった場合、ユーザー (および RAM) は、それぞれ 200 万個の数字の 3 つのチェーンを持つオブジェクトを操作する必要があります。しかし、徐々に薄くしていくと、最終的なオブジェクトは各チェーンに 2,000 個の数字しかありません。