运行 JAGS 并行时 DIC 和 PED
DIC and PED when running JAGS parallely
我正在 运行 并行地使用 JAGS,即每个链在单独的 process/thread 中。我打电话给run.jags(..., method = "rjparallel", params = c(..., "dic", "ped"))
。我收到以下错误:
jags The DIC, PED, pD, full.pD and pOpt cannot be assessed when using
parallel or separate chains
嗯……
是不是因为DIC和PED是从所有链计算出来的,而不是一个?不能在run.jags
函数中收集所有线程的结果后完成吗?
有什么解决办法吗?如何在并行 运行 的同时获得 DIC 和 PED?一定有可能吧?
如果您是 运行 并行模型,则无法跟踪 dic
或 ped
。这样做的原因是 extend.jags
函数需要“...多个链 WITHIN 相同的模拟”(重点添加,请参阅帮助文件并查找 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
@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 将其存储到文件中,但这会很快变得非常大(至少当观察数量相当大时)。所以它还没有完成,也没有计划让它这样做,所以对你的问题的简短回答是 'No, sorry'.
但是请注意,'pD'(因此 'DIC')的计算因您询问的对象而异 - 并且一些估计 pD 的方法不需要多个链。另见:
JAGS and WinBUGS giving differing DIC
最后,JAGS 版本 5 中的 DIC/PED/WAIC 监视器将有一些改进 - 并且 WAIC 监视器将不需要在同一模拟中使用多个链。
马特
我正在 运行 并行地使用 JAGS,即每个链在单独的 process/thread 中。我打电话给run.jags(..., method = "rjparallel", params = c(..., "dic", "ped"))
。我收到以下错误:
jags The DIC, PED, pD, full.pD and pOpt cannot be assessed when using parallel or separate chains
嗯……
是不是因为DIC和PED是从所有链计算出来的,而不是一个?不能在
run.jags
函数中收集所有线程的结果后完成吗?有什么解决办法吗?如何在并行 运行 的同时获得 DIC 和 PED?一定有可能吧?
如果您是 运行 并行模型,则无法跟踪 dic
或 ped
。这样做的原因是 extend.jags
函数需要“...多个链 WITHIN 相同的模拟”(重点添加,请参阅帮助文件并查找 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
@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 将其存储到文件中,但这会很快变得非常大(至少当观察数量相当大时)。所以它还没有完成,也没有计划让它这样做,所以对你的问题的简短回答是 'No, sorry'.
但是请注意,'pD'(因此 'DIC')的计算因您询问的对象而异 - 并且一些估计 pD 的方法不需要多个链。另见:
JAGS and WinBUGS giving differing DIC
最后,JAGS 版本 5 中的 DIC/PED/WAIC 监视器将有一些改进 - 并且 WAIC 监视器将不需要在同一模拟中使用多个链。
马特