如何在jags中解释一些语法(n.adapt,update ..)?

时间:2016-08-01 14:13:41

标签: jags r2jags

我对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()和{{1} }。

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:4)

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

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

<强>减薄 出现了一个单独的问题,因为在除了最简单的模型之外的所有模型中,MCMC采样算法产生链,其中连续绘制基本上是自相关的。因此,基于MCMC链的所有迭代(后烧入)总结后验可能是不可取的,因为有效的后验样本大小可能比分析师实现的要小得多(注意STAN的哈密顿蒙特卡罗采样的实现大大减少)在某些情况下这个问题)。因此,对“细化”链进行推理是标准的,其中只有一小部分MCMC迭代用于推理(例如,仅根据自相关的严重程度,每五,十次或百次迭代)。

<强>适应 JAGS用于对后部进行采样的MCMC采样器由可调参数控制,这些参数会影响其精确行为。适当调整这些参数可以提高采样速度或去相关性。 JAGS包含自动调整这些参数的机器,并且在绘制后验样本时也这样做。此过程称为 adaptation ,但为非Markovian ;得到的样本不构成马尔可夫链。因此,必须在适应后单独执行 。将适应期替换为老化是不正确的。但是,有时在适应后只需要相对较短的老化。

<强>语法 让我们看一个非常具体的例子(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次迭代而不保存任何后验样本,在每个链上执行老化(如果要检查完整链并丢弃老化期,请跳过此步骤事后)。 coda.samples()(来自coda包)运行每个MCMC链,以获得n.iter指定的迭代次数,但不会保存每次迭代。相反,它只保存第n次迭代,其中n由thin给出。同样,如果要在事后确定细化间隔,则无需在此阶段进行细化。在这个阶段进行细化的一个优点是coda语法使得这样做变得简单;您不必了解coda.samples()返回的MCMC对象的结构并自行细化。如果n.iter非常大,则在这个阶段实现细化的更大优势。例如,如果自相关非常糟糕,那么您可能会运行200万次迭代并仅保存每千分之一(thin=1000)。如果你在这个阶段没有瘦,你(和你的RAM)将需要操纵一个对象,每个链有两百万个数字。但是通过逐渐细化,最终对象每个链中只有2千个数字。