我正在尝试使用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,应该在每个集群中创建它吗?