Проделайте следующее простое упражнение от 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
не может быть найден. Любое предложение улучшить мой код?
Попробуйте использовать 'Matching :: GenMatch'. –
Кроме того, может быть полезно [это] (http://stackoverflow.com/questions/4077069/is-there-another-way-of-loading-extra-packages-in-workers-parallel-computing). –
Спасибо за ссылку, это здорово и приветствует ответ, предоставленный dax – lukeg