1

前の質問から次の簡単な演習を行いましょう。

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、同じ結果 (つまり save 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が見つかりません。コードを改善するための提案はありますか?

4

1 に答える 1

1

クラスターを作成すると、新しい非表示の R セッションが作成されます。したがって、クラスターに非基本関数を与える必要があります。実行してみてください:

clusterEvalQ(cl,library(Matching))
clusterEvalQ(cl,library(rgenoud))
于 2015-06-22T13:41:37.590 に答える