如何在尖齿中解释某些语法(n.adapt,update ..)?

use*_*211 0 jags r2jags

例如,我对尖齿中的以下语法感到非常困惑,

n.iter=100,000
thin=100
n.adapt=100
update(model,1000,progress.bar = "none")
Run Code Online (Sandbox Code Playgroud)

目前我认为

n.adapt=100 表示您将前100个抽奖设置为预烧,

n.iter=100,000 表示MCMC链有100,000次迭代,其中包括老化,

我已经很多时间核对了这个问题的解释,但仍不知道我的解释是否n.itern.adapt正确,以及如何理解update()和理解thinning

有人可以向我解释吗?

Jac*_*lar 8

该答案基于rjags软件包,该软件包采用n.adapt参数。首先,我将讨论适应,老化和细化的含义,然后再讨论语法(我认为您很清楚老化和细化的含义,但不了解适应;可能会进行完整的解释使这个答案对将来的读者更有用)。

老化 正如您可能从对MCMC采样的介绍中了解到的那样,必须丢弃来自MCMC链的某些迭代作为老化。这是因为在拟合模型之前,您不知道是否已在特征集(合理的后验概率区域)内初始化了MCMC链。在该区域之外初始化的链需要进行有限(有时较大)的迭代次数才能找到该区域并开始对其进行探索。这个探索期的MCMC样本不是从后验分布中随机抽取的。因此,通常将每个MCMC链的第一部分丢弃为“老化”。有几种事后技术来确定必须丢弃多少链。

细化 出现一个单独的问题,因为在最简单的模型中,除了所有最简单的模型之外,MCMC采样算法都会生成链,在这些链中,连续抽签基本上是自相关的。因此,不建议根据MCMC链的所有迭代(后老化)来总结后验,因为有效的后验样本量可能比分析人员意识到的要小得多(请注意,STAN对Hamiltonian Monte-Carlo采样的实现大大减少了在某些情况下会出现此问题)。因此,标准是在“稀疏”链上进行推理,其中只有一小部分MCMC迭代用于推理(例如,仅每五,十或百次迭代,具体取决于自相关的严重性)。

适应 JAGS用于对后部进行采样的MCMC采样器受可调参数的控制,这些参数会影响其精确行为。适当调整这些参数可以提高采样速度或解相关。JAGS包含用于自动调整这些参数的设备,并且在提取后验样本时会这样做。这个过程称为适应,但不是非马尔可夫过程。结果样本不构成马尔可夫链。因此,老化必须进行单独适配之后。用适应期代替老化是不正确的。但是,有时在适应后仅需要较短的老化即可。

语法 让我们看一个非常具体的示例(OP中的代码实际上并未显示喜欢n.adaptthin使用参数的位置)。我们将要求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)
Run Code Online (Sandbox Code Playgroud)

jags.model()建立有向无环图,然后对给出的多次迭代执行自适应阶段n.adaptupdate()通过运行MCMC进行n.burn迭代来对每个链执行老化,而不保存任何后验样本(如果要检查完整链并在事后丢弃老化期,请跳过此步骤)。 coda.samples()(来自coda包)按所指定的迭代次数运行每个MCMC链n.iter但不会保存每个迭代。相反,它仅保存第n次迭代,其中n由thin。同样,如果您想事后确定间隔间隔,则在此阶段无需间隔。在此阶段进行细化的一个优点是,尾码语法使操作变得简单。您不必了解coda.samples()自己返回的MCMC对象的结构并对其进行精简。如果n.iter非常大,则会在此阶段实现减薄的更大优势。例如,如果自相关确实很差,则可能运行200万次迭代,并且仅节省千分之一(thin=1000)。如果您在这一阶段没有变瘦,则您(和您的RAM)将需要处理一个对象,该对象具有三个分别为200万个数字的链。但是通过细化,最终对象在每个链中只有2000个数字。