2015-06-22 2 views
0

Проделайте следующее простое упражнение от previous question.сделать R вычислить с несколькими ядрами ЦП

Ввод следующий код в R, мы, наконец, выход нашей P1 переменной как:

library(Matching) 
data(lalonde) 
lalonde$ID <- 1:length(lalonde$age) 
n <- 10 
P1 <- rep(NA, n) 

for (i in 1:n) { 
    lalonde <- lalonde[sample(1:nrow(lalonde)), ] # randomise the order 

    X = cbind(lalonde$age, lalonde$educ, lalonde$black, lalonde$hisp, 
      lalonde$married, lalonde$nodegr, lalonde$u74, lalonde$u75, 
      lalonde$re75, lalonde$re74) 

    BalanceMat <- cbind(lalonde$age, lalonde$educ, lalonde$black, 
         lalonde$hisp, lalonde$married, lalonde$nodegr, 
         lalonde$u74, lalonde$u75, lalonde$re75, lalonde$re74, 
         I(lalonde$re74*lalonde$re75)) 

    genout <- GenMatch(Tr=lalonde$treat, X=X, BalanceMatrix=BalanceMat, estimand="ATE", 
        pop.size=16, max.generations=10, wait.generations=1) 

    mout <- Match(Y=NULL, Tr=lalonde$treat, X=X, 
       Weight.matrix=genout, 
       replace=TRUE, ties=FALSE) 

    summary(mout) 

    treated <- lalonde[mout$index.treated,] 
    treated$Pair_ID <- treated$ID 

    non.treated <- lalonde[mout$index.control,] 
    non.treated$Pair_ID <- treated$ID 

    matched.data <- rbind(treated, non.treated) 
    matched.data <- matched.data[order(matched.data$Pair_ID),] 

    P1[i] <- matched.data$ID[matched.data$Pair_ID==1 & matched.data$treat==0] 

} 

И мы можем получить наш результат:

summary(as.factor(P1)) 

Я заметил, что это низкий процент CPU, поэтому я вызываю пакет doParallel и пытаюсь запустить loop и хочу вывести тот же результат (то есть сохранить P1[i]). Но я получаю ошибку:

require(doParallel) 
cl<-makeCluster(3) 
registerDoParallel(cl) 

m <- 10 
P1 <- rep(NA, m) 

Result = foreach(i=icount(m),.combine=cbind) %dopar%{ 

    lalonde <- lalonde[sample(1:nrow(lalonde)), ] # randomise the order 

    X = cbind(lalonde$age, lalonde$educ, lalonde$black, lalonde$hisp, 
      lalonde$married, lalonde$nodegr, lalonde$u74, lalonde$u75, 
      lalonde$re75, lalonde$re74) 

    BalanceMat <- cbind(lalonde$age, lalonde$educ, lalonde$black, 
         lalonde$hisp, lalonde$married, lalonde$nodegr, 
         lalonde$u74, lalonde$u75, lalonde$re75, lalonde$re74, 
         I(lalonde$re74*lalonde$re75)) 

    genout <- GenMatch(Tr=lalonde$treat, X=X, BalanceMatrix=BalanceMat, estimand="ATE", 
        pop.size=16, max.generations=10, wait.generations=1) 

    mout <- Match(Y=NULL, Tr=lalonde$treat, X=X, 
       Weight.matrix=genout, 
       replace=TRUE, ties=FALSE) 

    summary(mout) 

    treated <- lalonde[mout$index.treated,] 
    treated$Pair_ID <- treated$ID 

    non.treated <- lalonde[mout$index.control,] 
    non.treated$Pair_ID <- treated$ID 

    matched.data <- rbind(treated, non.treated) 
    matched.data <- matched.data[order(matched.data$Pair_ID),] 

    P1[i] <- matched.data$ID[matched.data$Pair_ID==1 & matched.data$treat==0] 


} 

что GenMatch не может быть найден. Любое предложение улучшить мой код?

+0

Попробуйте использовать 'Matching :: GenMatch'. –

+1

Кроме того, может быть полезно [это] (http://stackoverflow.com/questions/4077069/is-there-another-way-of-loading-extra-packages-in-workers-parallel-computing). –

+0

Спасибо за ссылку, это здорово и приветствует ответ, предоставленный dax – lukeg

ответ

0

При создании кластера вы создаете новые невидимые сеансы R. Таким образом, вы должны предоставить своим кластерам не-базовые функции. Попробуйте запустить:

clusterEvalQ(cl,library(Matching)) 
clusterEvalQ(cl,library(rgenoud)) 
Смежные вопросы