2017-01-13 10 views
1

複数のコアでベイジアン統計関数のレプリケートチェーンを実行しようとしています。コアあたり1本の鎖。以下の関数mcmcは、1つのmcmcチェーンを実行するためのスクリプトです。私の考えは、mcmc関数を3回実行することだけです。各インスタンスは別々のコアで実行されます。私は変更しようとした例をいくつか見つけましたが、適切に動作させることができませんでした。次のエラーが表示されます。3ノードでエラーが発生しました。最初のエラー:次元数が正しくありません。これは、私が、apply関数のパラレル・バージョンを使用する方法を理解していないと思うようになります。私はそれがまっすぐ進むはずだと思っているが、私の誤りを見つけることはできない。私は、ベイジアンの統計、プログラミング、そしてコンピュータをその場で勉強しています。誰かが私が間違っていることを教えてもらえますか?複数のベイジアンチェーンをパラレルで実行するR:3ノードでエラーが発生しました。最初のエラー:次元数が正しくありません

これまでに回答があった場合、私は助けになった回答を見つけることができませんでした。

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

私は自分の問題点を理解しました。まず、パッケージを交換し、降雪の代わりに平行に使用しました。第二に、私は私の機能を適用するために私の問題を断片に分割するリストが必要であることを理解しました。私の場合は、私が適用したい関数の中で私の変数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) 
関連する問題