运行JAGS并行时的DIC和PED

时间:2018-06-22 07:07:28

标签: r jags runjags

我正在并行运行JAGS,即每个链在单独的进程/线程中。我正在致电run.jags(..., method = "rjparallel", params = c(..., "dic", "ped"))。我收到以下错误:

  锯齿使用时无法评估DIC,PED,pD,full.pD和pOpt   平行或分开的链条

嗯......

  1. 是因为DIC和PED是从所有链而不是仅从所有链计算而来的吗?从所有线程中收集结果之后,不能在run.jags函数中完成此操作吗?

  2. 有什么解决办法吗?并行运行时如何获得DIC和PED?一定有可能吧,对吧?

2 个答案:

答案 0 :(得分:2)

如果并行运行模型,则无法跟踪dicped。原因是extend.jags函数需要“ ...多个链其中相同的模拟”(添加了重点,请参阅帮助文件并在monitor参数中查找extend.jags函数)。并行运行时,每个核心只有一条链。

但是,您可以在使用extract函数拟合模型之后收集这些信息。这是一个简单的JAGS模型的可重现示例,以说明如何执行此操作。

library(runjags)

# generate data
y <- rnorm(1000, 3, 10)

# the model
modelstring="
model{
mu ~ dnorm(0, 0.001)
tau ~ dgamma(0.001,0.001)
sigma <- 1 / sqrt(tau)
for(i in 1:1000){
y[i] ~ dnorm(mu, tau)
}
}
"
# save this model string in your working directory
fileconn <- file("simple_norm.R")
writeLines(modelstring, fileconn)
close(fileconn)

# fit the model
model = run.jags(model = "simple_norm.R", 
data = data_list,
monitor = c("mu", "sigma"),
n.chains = 3,
burnin = 1000,
sample = 5000,
method = "rjparallel"
)

# collect DIC and ped
my_dic <- extract(model, what = "dic")
my_ped <- extract(model, what = "ped")

# the output

> my_dic
Mean deviance:  7411 
penalty 1.979 
Penalized deviance: 7413 

> my_ped
Mean deviance:  7411 
penalty 3.961 
Penalized deviance: 7415 

答案 1 :(得分:0)

@M_Fidino提供的答案是非常正确的,但我只是该答案未解决的问题的技术方面-即:

2.  Is there any way around that? How can I get DIC and PED while having parallel run? It must be possible somehow, right?

JAGS使用每个观察到的随机变量在每次迭代时链之间的Kullback-Leibler散度的估计来计算DIC和PED的惩罚项。在JAGS之外计算此信息所需的大多数信息都没有存储,尽管从原理上讲可以由JAGS存储到文件中,但是这很快就会变得非常大(至少在观察数量相当大的情况下)。因此,它还没有完成,也没有计划这样做。因此,对您的问题的简短回答是“不,对不起”。

但是请注意,“ pD”(因此也就是“ DIC”)的计算取决于您询问的人-并且某些估计pD的方法不需要多个链。另请参阅:

JAGS and WinBUGS giving differing DIC

最后,JAGS版本5中的DIC / PED / WAIC监视器将有所改进-并且WAIC监视器在同一模拟中将不需要多个链。

马特