我试图在多个核心上运行贝叶斯统计函数的复制链;每个核心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
答案 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)