如何解释 jags 中的一些语法(n.adapt,更新..)?

How to interpret some syntax (n.adapt, update..) in jags?

我对jags中的以下语法感到很困惑,例如

n.iter=100,000
thin=100
n.adapt=100
update(model,1000,progress.bar = "none")

目前我认为

n.adapt=100 表示您将前 100 次抽奖设置为老化,

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

这个问题的解释我已经查了很多次了,但还是不确定我对n.itern.adapt的解释是否正确,以及如何理解update()thinning.

谁能给我解释一下?

这个答案基于包 rjags,它带有一个 n.adapt 参数。首先我将讨论适应、老化和细化的含义,然后我将讨论语法(我感觉你很清楚老化和细化的含义,但不了解适应;完整的解释可能让这个答案对未来的读者更有用)。

烙印 正如您可能从 MCMC 采样的介绍中了解到的那样,来自 MCMC 链的一些迭代必须作为老化而丢弃。这是因为在拟合模型之前,您不知道您是否已经在 特征集 内初始化了 MCMC 链,合理的 post 概率区域。在该区域之外初始化的链需要有限(有时是大量)的迭代来找到该区域并开始探索它。这段探索时期的 MCMC 样本不是从 posterior 分布中随机抽取的。因此,将每个 MCMC 链的第一部分丢弃为 "burn-in" 是标准的。有几种 post-hoc 技术可以确定必须丢弃多少链。

细化 一个单独的问题出现了,因为在除了最简单的模型之外的所有模型中,MCMC 采样算法产生链,其中连续抽取基本上是自相关的。因此,基于 MCMC 链的所有迭代(post 老化)总结 posterior 可能是不可取的,因为有效的 posterior 样本量可能比分析师小得多实现(请注意,在某些情况下,STAN 的哈密顿蒙特卡洛采样的实现极大地减少了这个问题)。因此,在 "thinned" 链上进行推理是标准的,其中仅一小部分 MCMC 迭代用于推理(例如,仅每五次、第十次或第一百次迭代,具体取决于自相关的严重性)。

适配 JAGS 用来对 posterior 进行采样的 MCMC 采样器由影响其精确行为的可调参数控制。适当调整这些参数可以提高采样的速度或去相关性。 JAGS 包含自动调整这些参数的机制,并在绘制 post 之前的样本时这样做。这个过程称为适应,但它是非马尔可夫;结果样本不构成马尔可夫链。因此,必须在适配后单独进行老化。用适应期代替老化是不正确的。但是,有时只需要相对较短的老化 post-适应。

语法 让我们看一个非常具体的示例(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)

jags.model() 构建有向无环图,然后针对 n.adapt 给定的迭代次数执行自适应阶段。 update() 通过 运行 使 MCMC 进行 n.burn 次迭代而不保存任何 post 之前的样本来对每个链执行老化(如果要检查,请跳过此步骤完整的链条并丢弃老化期 post-hoc)。 coda.samples()(来自 coda 包)运行s 每个 MCMC 链的迭代次数由 n.iter 指定,但它不会保存每次迭代.相反,它只保存第 n 次迭代,其中 n 由 thin 给出。同样,如果您想确定您的细化间隔 post-hoc,则无需在此阶段细化。在此阶段细化的一个优点是 coda 语法使这样做变得简单;您不必了解 coda.samples() 返回的 MCMC 对象的结构并自行细化。如果 n.iter 非常大,则在这个阶段实现细化的更大优势。例如,如果自相关真的很糟糕,您可能会 运行 200 万次迭代并仅保存千分之一 (thin=1000)。如果你在这个阶段不细化,你(和你的 RAM)将需要操纵一个对象,该对象具有三个链,每个链有 200 万个数字。但是通过边走边细化,最终对象在每个链中只有 2000 个数字。