在一组不同的解释变量上并行化 R 中的面板 logit 计算

Posted

技术标签:

【中文标题】在一组不同的解释变量上并行化 R 中的面板 logit 计算【英文标题】:Parallelise panel logit computations in R on a set of different explanatory variables 【发布时间】:2017-08-03 08:37:40 【问题描述】:

我是 R 中并行计算的初学者。我遇到了 doParallel 包,我认为它可能对我有用。

以下代码旨在并行评估多个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()

当我尝试以下列方式并行化它时,它不起作用。我收到以下错误:

中的错误:任务 1 失败 -“找不到对象 'XX'”

一组几个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)


有人可以就如何正确并行化此任务提供建议吗?

谢谢!

【问题讨论】:

你在哪里定义对象 X?这个作业XX&lt;-X[,c("resVar",vars,"Year")]是做什么的? 当然,X 是源数据集,在运行两个循环之前定义,resVar 作为因变量。然后它循环遍历subModelInd 中从 1 到子模型数量的子模型数量。 您能否提供一些 XX 的示例数据,使其成为最小可重复的示例***.com/questions/5963269/… ? @rbm 我用数据框编辑了帖子 对不起,但这并不能重现问题。当我运行代码时,它可以工作并且我没有收到 object XX not found 错误。 【参考方案1】:

是的,pglm 及其访问变量的方式似乎确实存在问题。一个简单的解决方法是将XX 分配给全局变量,即更改

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

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

这应该可以解决问题,因为每个集群都作为一个单独的进程运行(据我所知不是一个单独的线程),所以你不会遇到两个进程/线程尝试使用 XX 变量的问题。

我在set.seed(131)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

这也应该对你有用。

【讨论】:

谢谢rbm!出色的工作

以上是关于在一组不同的解释变量上并行化 R 中的面板 logit 计算的主要内容,如果未能解决你的问题,请参考以下文章

R:如何在 R 3.2.1 中使用 lattice 并行化多面板绘图?

R中的并行化:如何在每个节点上“源”?

如何使用 sfInit 和 makeCluster 类型“MPI”/R 中的消息传递/集群上的并行化

并行化大型动态程序

使用 C 和并行化在 R 中快速关联

为啥 R 不能在一组空索引上正确删除元素?