当我包装doParallel时,我在{中出现错误:任务1失败-“下标超出范围”

时间:2019-07-05 10:52:51

标签: r doparallel

我正在尝试使用Dirlich回归模型执行最佳子集选择回归。这是一些模拟数据。

library(doParallel)
library(DirichletReg)

OpA<-runif(1000,0,0.25)
OpB<-runif(1000,0,0.25)
OpC<-1-OpA-OpB

V1<-runif(1000,0,1.0)
V2<-runif(1000,0,1.0)
V3<-runif(1000,0,1.0)
V4<-runif(1000,0,1.0)
V5<-runif(1000,0,1.0)

data.df<-data.frame(cbind(OpA,OpB,OpC,V1,V2,V3,V4,V5))

AL <- DR_data(data.df[, c("OpA","OpB","OpC")])
cnames<-c("V1","V2","V3","V4","V5")

我想从所有方面获得对数的喜好:一个变量;所有两个变量;等型号:

l<-1
results.df<-data.frame(fn=character(),
                       logLik=double())
results.df$fn<-as.character(results.df$fn)
for (i in seq(1,length(cnames))){
  models<-(t(combn(cnames,i)))
  for (j in seq(1:nrow(models))){
    fn<-"AL~1"
    for(k in 1:i)
      fn<-paste(fn,models[j,k],sep="+")
    DR.Fit <- DirichReg(formula(fn), data.df)
    results.df[l,]$fn<-fn
    results.df[l,]$logLik<-DR.Fit$logLik
    l<-l+1
  }
}

数据帧results.df给了我答案。但是实际上,我将需要针对较大的候选变量集和重复的数据子集运行此操作。因此,我试图使问题平行化。我的意图是在并行循环内,将选择一个不同的数据随机子集进行训练(估计),其余用于测试(预测)。这是并行包装器:

cl <- makeCluster(4)
registerDoParallel(cl)

fn<-character()
clusterExport(cl, c("AL","fn"))
p<-foreach(p=1:4,
           .combine = combine, 
           .multicombine = TRUE,
           .packages=c("DirichletReg"))%dopar%{

  l<-1
  results.df<-data.frame(fn=character(),
                         logLik=double())
  results.df$fn<-as.character(results.df$fn)
  for (i in seq(1,length(cnames))){
    models<-(t(combn(cnames,i)))
    for (j in seq(1:nrow(models))){
      fn<-"AL~1"
      for(k in 1:i)
        fn<-paste(fn,models[j,k],sep="+")
      DR.Fit <- DirichReg(formula(fn), data.df)
      results.df[l,]$fn<-fn
      results.df[l,]$logLik<-DR.Fit$logLik
      l<-l+1
    }
  }
  return(results.df)
}

stopCluster(cl)

除了在这里重复四次相同的模型外,我所做的只是寻找p包含一些重复的结果-在此阶段一切正常。但是,当我运行它时,我得到了

Error in { : task 1 failed - "subscript out of bounds"

如何调试此过程以找出导致此问题的原因?

顺便说一句,我不知道为什么我需要预定义fn,然后将其与AL一起进行clusterExport,应该在每个集群中创建它吗?

0 个答案:

没有答案