2017-03-13 10 views
2

私はdoParallelパッケージに出くわしました。私のケースでは便利かもしれません。異なる説明変数のセットでRのパラレルパネルロジット計算

次のコードは、パラレル、いくつかのpglm回帰で評価することを目指し:

require("foreach") 
require("doParallel") 

resVar <- sample(1:6,100,TRUE) 
x1  <- 1:100 
x2  <- rnorm(100) 
x3  <- rchisq(100, 2, ncp = 0) 
x4  <- rweibull(100, 1, scale = 1) 
Year <- sample(2011:2014,100,replace=TRUE) 
X  <- data.frame(resVar,x1,x2,x3,x4,Year) 

facInt = 1:4 # no factors 
#find all possible combinations 
cmbList <- lapply(2, function(nbFact) { 
    allCmbs <- t(combn(facInt, nbFact)) 
    dupCmbs <- combn(1:4, nbFact, function(x) any(duplicated(x))) 
    allCmbs[!dupCmbs, , drop = FALSE] }) 

noSubModel <- c(0, sapply(cmbList, nrow)) 
noModel  <- sum(noSubModel) 
combinations <- cmbList[[1]] 
factors  <- X[,c("x1","x2","x3","x4")] 
coeff_vars <- matrix(colnames(factors)[combinations[1:length(combinations[,1]),]],ncol = length(combinations[1,])) 

yName  <- 'resVar' 
cl <- makeCluster(4) 
registerDoParallel(cl) 
r <- foreach(subModelInd=1:noSubModel[2], .combine=cbind) %dopar% { 
    require("pglm") 
    vars <- coeff_vars[subModelInd,] 
    formula <- as.formula(paste('as.numeric(', yName, ')',' ~ ', paste(vars,collapse=' + '))) 
    XX<-X[,c("resVar",vars,"Year")] 
    ans <- pglm(formula, data = XX, family = ordinal('logit'), model = "random", method = "bfgs", print.level = 3, R = 5, index = 'Year') 

     coefficients(ans) 

} 
stopCluster(cl) 
cl <- c() 

私は、次の方法でそれを並列化しようとすると、それは動作しません。私は次のエラーを取得する:

Error in { : task 1 failed - "object 'XX' not found"

いくつかのpglm回帰順番に評価作品のセット:

require("pglm") 
r <- foreach(icount(subModelInd), .combine=cbind) %do% { 
    vars <- coeff_vars[subModelInd,] 
    formula <- as.formula(paste('as.numeric(', yName, ')',' ~ ', paste(vars,collapse=' + '))) 
    XX<-X[,c("resVar",vars,"Year")] 
    ans <- pglm(formula, data = XX, family = ordinal('logit'), model = "random", method = "bfgs", print.level = 3, R = 5, index = 'Year') 

    coefficients(ans) 

} 

誰かが正しく、このタスクを並列化する方法についてのアドバイスをしてくださいことはできますか?

ありがとうございます!

+0

ここで、オブジェクトXを定義しますか?この割り当て 'XX <-X [、c(" resVar "、vars、" Year ")]'それは何をするのですか? – jsb

+0

もちろん、Xは2つのループを実行する前に定義されたソースデータセットで、 'resVar'を従属変数としています。次に、1からサブモデルの数になる 'subModelInd'のサブモデルの量をループします。 –

+0

XXのサンプルデータを最小限の再現可能なサンプルにすることができますか?http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example? – rbm

答えて

2

はい、pglmの問題と変数にアクセスする方法の問題があるようです。簡単な修正は、各クラスタが別々のプロセス(ないよう別のスレッドとして実行するように、これは、トリックを行う必要がありますすなわち

assign("XX", X[,c("resVar",vars,"Year")], pos = 1) 

XX<-X[,c("resVar",vars,"Year")] 

を変更、グローバル変数にXXを割り当てることです私が知る限り)、変数XXを使用しようとしている2つのプロセス/スレッドで問題が発生することはありません。

私はset.seed(131)の2つの余分な行と、coefficients(ans)の後の別の行を追加しました。

set.seed(131) 

... rest of your code .... 
coefficients(ans) 

write(paste0(coefficients(ans)[1],"\n"),file="c:\\temp\\r\\out.txt",append=TRUE) 

と一貫6ファイルの行(同じ数字が、明らかに異なる順序で)得た:

0.703727602527463 
1.03799340156792 
1.15220874833614 
1.30381769320552 
1.42656613017171 
1.77287504108163 

同様にあなたのために働く必要があります。

+0

ありがとうrbm!よくできました –