是否可以半自动化MCMC收敛诊断程序来设置老化时间?


13

我想自动选择MCMC链的老化选项,例如通过基于收敛性诊断删除前n行。

此步骤可以安全地自动化到什么程度?即使我仍然仔细检查自相关,mcmc跟踪和pdf,也可以自动选择老化长度。

我的问题很笼统,但是如果您可以提供处理R mcmc.object的细节,那就太好了;我在R中使用rjags和coda软件包。


尽管不包含在原始问题中,但按照我的答案中的建议自动设置间隔时间间隔也很有用。
David LeBauer,2010年

1
我只想提及一下,作为一个对制作通用MCMC算法感兴趣的人,可以很容易地将其应用于许多问题,我对此主题非常感兴趣。
约翰·萨尔瓦捷

Answers:


6

这是自动化的一种方法。反馈非常感谢。这是按照标准惯例,用计算代替最初的外观检查,然后进行后续外观检查的尝试。

该解决方案实际上包含了两个可能的解决方案,首先,计算老化以在达到某个阈值之前除去链长,然后使用自相关矩阵计算稀疏间隔。

  1. 计算向量中最大变量的最大中值Gelman-Rubin收敛诊断收缩因子(grsf)的向量
  2. 查找所有变量的grsf低于某个阈值的最小样本数,例如示例中的1.1,实际上可能更低
  3. 从此点到链的末端对链进行子采样
  4. 使用最自相关链的自相关使链变薄
  5. 通过迹线图,自相关图和密度图直观地确认收敛

mcmc对象可以在这里下载:jags.out.Rdata

# jags.out is the mcmc.object with m variables
library(coda)    
load('jags.out.Rdata')
# 1. calculate max.gd.vec, 
# max.gd.vec is a vector of the maximum shrink factor
max.gd.vec     <- apply(gelman.plot(jags.out)$shrink[, ,'median'], 1, max)
# 2. will use window() to subsample the jags.out mcmc.object
# 3. start window at min(where max.gd.vec < 1.1, 100) 
window.start   <- max(100, min(as.numeric(names(which(max.gd.vec - 1.1 < 0)))))
jags.out.trunc <- window(jags.out, start = window.start)
# 4. calculate thinning interval
# thin.int is the chain thin interval
# step is very slow 
# 4.1 find n most autocorrelated variables
n = min(3, ncol(acm))
acm             <- autocorr.diag(jags.out.trunc)
acm.subset      <- colnames(acm)[rank(-colSums(acm))][1:n]
jags.out.subset <- jags.out.trunc[,acm.subset]
# 4.2 calculate the thinning interval
# ac.int is the time step interval for autocorrelation matrix
ac.int          <- 500 #set high to reduce computation time
thin.int        <- max(apply(acm2 < 0, 2, function(x) match(T,x)) * ac.int, 50)
# 4.3 thin the chain 
jags.out.thin   <- window(jags.out.trunc, thin = thin.int)
# 5. plots for visual diagnostics
plot(jags.out.thin)
autocorr.plot(jags.win.out.thin)

-更新-

正如在R中实现的那样,自相关矩阵的计算比期望的要慢(在某些情况下> 15分钟)要慢一些,GR收缩因子的计算也要小一些。有一个关于如何加快步骤4在计算器的问题在这里

-更新第2部分-

其他答案:

  1. 无法诊断收敛,只能诊断缺乏收敛(Brooks,Giudici和Philippe,2003)

  2. 软件包runjags中的 autorun.jags函数自动计算运行长度和收敛诊断。直到Gelman rubin诊断值低于1.05时,它才开始监视链。它使用Raftery和Lewis诊断程序计算链长。

  3. Gelman等人(Gelman 2004 Bayesian Data Analysis,第295页,Gelman和Shirley,2010年)指出,他们使用保守的方法丢弃链的第一半。尽管是一个相对简单的解决方案,但实际上,这足以解决我特定的一组模型和数据问题。


#code for answer 3
chain.length <- summary(jags.out)$end
jags.out.trunc <- window(jags.out, start = chain.length / 2)
# thin based on autocorrelation if < 50, otherwise ignore
acm <- autocorr.diag(jags.out.trunc, lags = c(1, 5, 10, 15, 25))
# require visual inspection, check acceptance rate
if (acm == 50) stop('check acceptance rate, inspect diagnostic figures') 
thin.int <- min(apply(acm2 < 0, 2, function(x) match(TRUE, x)), 50)
jags.out.thin <- window(jags.out.trunc, thin = thin.int)

2
有两个原则适用:您永远无法知道您的链是否已收敛到其固定分布。您可以手动进行任何融合测试,也可以实现自动化。因此,您的方法似乎足够合理。
特里斯坦,2010年

在runjags文档中,我看到autorun.jags表示在返回模型之前会自动评估模型的收敛性和足够的样本量。您能否指出我发现在Gelman rubin诊断值低于1.05之前autorun.jags才开始监视链的地方?谢谢
user1068430

@ user1068430中的autorun.jags...允许将参数传递给add.summary函数。该add.summary函数具有psrf.target默认值为1.05 的参数
David LeBauer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.