2

我对 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.iterand的解释n.adapt是否正确以及如何理解update()and thinning

谁能给我解释一下?

4

1 回答 1

14

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

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

细化 一个单独的问题出现了,因为在除了最简单的模型之外的所有模型中,MCMC 采样算法都会产生连续抽取基本上是自相关的链。因此,基于 MCMC 链的所有迭代(老化后)总结后验可能是不可取的,因为有效的后验样本大小可能比分析师意识到的要小得多(请注意,STAN 的哈密顿蒙特卡洛采样实现显着减少在某些情况下会出现这个问题)。因此,在“细化”链上进行推理是标准的,其中只有一小部分 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)

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 个数字。

于 2016-08-10T14:01:56.917 回答