并行运行多个贝叶斯链R:3个节点产生错误;第一个错误:维数不正确

时间:2017-01-13 19:18:37

标签: r parallel-processing bayesian mcmc

我试图在多个核心上运行贝叶斯统计函数的复制链;每个核心1链。下面的函数mcmc是运行单个mcmc链的脚本。我的想法是我可以运行三次mcmc函数,每个实例都在一个单独的核心上。我发现了一些我试图修改的例子,但却无法让它正常运行。我收到以下错误:3个节点产生错误;第一个错误:维度数不正确。这让我觉得我不理解如何使用apply函数的并行版本。我一直认为它应该是直截了当但似乎无法找到我的错误。我正在学习贝叶斯统计,编程和计算机。谁能告诉我我做错了什么?

如果以前已经回答过我的道歉,我无法找到有帮助的答案。

library(parallel) 
library(snowfall) 
library(rlecuyer)

cps=detectCores()-5 #I have access to 8 cores, but want to target only three
sfInit(parallel=TRUE, cpus=cps)
sfExportAll()
sfClusterSetupRNG()

#necessary input; GB, all.layers, ind defined previously
nchain=3
n.mcmc=2000
df=9

#mcmc is a function to run a single mcmc chain
tmp.fcn <- function(i){
  tmp.out[i]=mcmc(GB,all.layers,ind,df,n.mcmc)
}


sfExport("GB","all.layers","ind","df","n.mcmc","nchain")
tmp.time=Sys.time()
score.list=sfClusterApplySR(1:nchain,tmp.fcn) 
time.1=Sys.time()-tmp.time

1 个答案:

答案 0 :(得分:1)

我弄清楚我的问题是什么。首先,我切换包并使用平行而不是降雪。其次,我发现我需要一个列表,将我的问题分解为碎片以应用我的功能。在我的情况下,我没有在我想要应用的函数中随机生成我的变量t的起始值,而是创建了一个包含3个随机起始值的列表,然后将我的函数(tmp.func)应用于该列表(t.start) 。

library(parallel)
n.core<-detectCores()-5
cl <- makeCluster(n.core)

#write function
tmp.func<-function(i){
tmp.out=mcmc(GB,all.layers,ind,df=8,cov.1=.5,cov.0=.15,t.start[i],n.mcmc=11000)
tmp.out
}

t.start=c(.15,.1,.2)
clusterEvalQ(cl,{library(adegenet);library(Matrix);library(MASS);library(mvtnorm);library(fda);library(raster);library(rgdal)})

clusterExport(cl,c("t.start","GB","all.layers","ind","mcmc"))

#apply function
out.11k=parLapply(cl,1:length(t.start),tmp.func)


stopCluster(cl)