使用多个CPU核进行R计算
让我们做一个简单的练习 在R中输入以下代码,我们最终将使用多个CPU核进行R计算,r,memory,cluster-computing,doparallel,R,Memory,Cluster Computing,Doparallel,让我们做一个简单的练习 在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(lalo
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]
}
我注意到这是一个较低的CPU百分比,因此我调用了doParallel
包并尝试运行循环
,希望输出相同的结果(即saveP1[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 ]
}
require(双并行)
cl当您创建集群时,您将创建新的不可见的R会话。因此,您必须为集群提供非基函数。尝试运行:
clusterEvalQ(cl,library(Matching))
clusterEvalQ(cl,library(rgenoud))
尝试使用匹配::GenMatch
。此外,可能会有所帮助。感谢链接,这非常好,并对dax提供的答案表示赞赏
clusterEvalQ(cl,library(Matching))
clusterEvalQ(cl,library(rgenoud))