如何解释 jags 中的某些语法(n.adapt、update..)?

Posted

技术标签:

【中文标题】如何解释 jags 中的某些语法(n.adapt、update..)?【英文标题】:How to interpret some syntax (n.adapt, update..) in jags? 【发布时间】:2016-12-06 16:00:18 【问题描述】:

我对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

谁能给我解释一下?

【问题讨论】:

@colin 嗨,有什么想法吗? 请不要贪图你的标签。这似乎与r 无关,与代码编辑器RStudio 无关。 @Gregor 它确实与 Rstudio 有关。它只是R中的一个包 将一般 R 问题标记为 RStudio 就像将英语语法问题标记为 Microsoft Word 只是因为您碰巧使用该程序进行写作。您也可以使用 Emacs 或 Vim 或 R Gui(或无数其他代码编辑器中的任何一种)来编写 R 代码,而您使用的编辑器与您编写的 R 代码的有效性没有任何关系。 您已使用r2jags 标记您的问题,但R2jags::jags 没有参数n.adapt。如果您使用的是R2jags,则在?R2jags::jags 上都有明确的说明。 【参考方案1】:

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

老化 正如您可能从对 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.adapt 给出的多次迭代执行适应阶段。 update() 通过在不保存任何后验样本的情况下运行 MCMC 进行 n.burn 迭代,在每条链上执行老化(如果您想检查完整的链并在事后丢弃老化期,请跳过此步骤) . coda.samples()(来自 coda 包)按照 n.iter 指定的迭代次数运行每个 MCMC 链,但它不会保存每个迭代。相反,它只保存第 n 次迭代,其中 n 由 thin 给出。同样,如果您想事后确定细化间隔,则在此阶段无需细化。在这个阶段进行细化的一个优点是尾句语法使得这样做很简单。你不必了解coda.samples()返回的MCMC对象的结构,自己细化。如果 n.iter 非常大,则可以在此阶段实现细化的更大优势。例如,如果自相关真的很糟糕,您可能会运行 200 万次迭代并且只保存每千分之一 (thin=1000)。如果您在这个阶段没有瘦身,您(和您的 RAM)将需要操作具有三个链的对象,每个链包含 200 万个数字。但是通过不断细化,最终的对象每条链中只有 2000 个数字。

【讨论】:

以上是关于如何解释 jags 中的某些语法(n.adapt、update..)?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 R2jags::jags 中的“节点与父母不一致”

Jags 中的贝叶斯滚动泊松回归(通过 R2jags)

jags.parallel - get(name, envir = envir) 中的错误:第一个参数无效

根据 WinBugs/JAGS 中的 if - else 条件选择不同的分布

奇怪的 jags.parallel 错误/避免函数调用中的惰性求值

Jags/Bugs 领先一步预测