1

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

锯齿 DIC、PED、pD、full.pD 和 pOpt 在使用平行链或单独链时无法评估

嗯……

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

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

4

2 回答 2

2

如果您正在并行运行模型,则无法跟踪dicped。这样做的原因是该函数需要“ ......extend.jags在同一模拟中的多个链”(强调添加,请参阅帮助文件并查找函数的参数)。并行运行时,每个核心只有一个链。monitorextend.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 
于 2018-06-25T13:50:18.250 回答
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 和 WinBUGS 提供不同的 DIC

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

马特

于 2018-09-06T12:18:09.837 回答