我使用 R 中的包在单独的处理节点上运行每个链的贝叶斯统计模型runjags
。我想通过使用包在并行循环中嵌套run.jags
调用来一次拟合多个模型foreach
。但是,这通常会导致错误消息,可能是因为foreach
循环不“知道”在循环内我正在调用其他并行进程,因此内核可能是双重分配的(或其他什么)。这是一个示例错误消息:
{ 中的错误:任务 2 失败 -“尝试运行 JAGS 模型时遇到以下错误:socketConnection
中的错误(“localhost”,端口 = 端口,服务器 = TRUE,阻塞 = TRUE,:无法打开连接
这是一些示例代码,用于生成数据并拟合两个模型,每个模型请求 2 个内核(总共需要 4 个内核,我的笔记本电脑上有)。我很想找到一个解决方案,让我可以并行运行多个并行 JAGS 模型。实际上,我一次在集群上运行 5-10 个模型,每个模型需要 3 个内核。
library(foreach)
library(runjags)
#generate a random variable, mean of 25, sd = 5.----
y.list <- list()
for(i in 1:2){
y.list[[i]] <- rnorm(100, 25, sd = 5)
}
#Specify a JAGS model to fit an intercept.----
jags.model = "
model{
for(i in 1:N){
y.hat[i] <- intercept
y[i] ~ dnorm(y.hat[i], tau)
}
#specify priors.
intercept ~ dnorm(0,1E-3)
tau <- pow(sigma, -2)
sigma ~ dunif(0, 100)
}
"
n.cores <- 4
registerDoParallel(n.cores)
#Fit models in parallel, with chains running in parallel.----
#two processes that each require two cores (4 cores are registered and all that is required.)
output <- list()
output <-
foreach(i = 1:length(y.list)) %dopar% {
#specify data object.
jd <- list(y=y.list[[i]], N = length(y.list[[i]]))
#fit model.
jags.out <- run.jags(jags.model,
data=jd,
n.chains=2,
monitor=c('intercept','tau'),
method='rjparallel')
#return output
return(jags.out)
}