在foreach中使用glm的问题

在foreach中使用glm的问题,r,foreach,glm,R,Foreach,Glm,我尝试使用foreach循环来取乐多个glm。我遇到的问题是,当我试图指定权重时,它表示找不到对象。下面的代码重现了我遇到的问题 library(foreach) library(doParallel) registerDoParallel(cores=4) getDoParWorkers() train_samples<-vector(mode="list", length=4) for(i in 1:4){ train_samples[[i]]<-sample(n

我尝试使用foreach循环来取乐多个glm。我遇到的问题是,当我试图指定权重时,它表示找不到对象。下面的代码重现了我遇到的问题

library(foreach)
library(doParallel)

registerDoParallel(cores=4)  
getDoParWorkers()



train_samples<-vector(mode="list", length=4)
for(i in 1:4){
  train_samples[[i]]<-sample(nrow(mtcars),nrow(mtcars)*.8,replace=FALSE)
}

train_samples
d_data<-mtcars
#Add a weights column to illustrate the issue. The actual weights would vary.
d_data$weights = 1 

#This results in an error: object 'd_data' not found
foreach(k=1:4) %dopar%{
  model.fit<-glm(formula='hp~cyl+disp+mpg',
                 family=poisson,
                 data=d_data[train_samples[[k]],],
                 weights=d_data[train_samples[[k]],12])
}

#Removing the weights condition makes it run fine.
foreach(k=1:4) %dopar%{
  model.fit<-glm(formula='hp~cyl+disp+mpg',
                 family=poisson,
                 data=d_data[train_samples[[k]],])
}
库(foreach)
图书馆(双平行)
寄存器双并行(核心=4)
getDoParWorkers()

训练样本我能够复制你的错误。我不知道为什么会这样,但我想出了一个有效的解决方案

如果您将glm函数从循环中取出,并创建一个单独的函数,然后在循环中使用该函数,那么它将正常工作

model <- function(k, input_data, samples){

  samples <- samples[[k]]
  input_data <- input_data[samples,]
  weights <- input_data[samples, 12]
  print(weights)

  model.fit <- glm(formula = 'hp ~ cyl + disp + mpg',
                 family = poisson,
                 data = input_data,
                 weights = weights)

  return(model.fit)
}


trial.data <- foreach(k = 1:4, 
                      .errorhandling = 'pass') %dopar% {
                        model(k, d_data, train_samples)
                      }

print(trial.data)

model迟到了这个聚会,但问题是
glm()
首先在数据环境中寻找权重,然后是公式。使用
%dopar%
并行运行时,提供的权重向量不会出现在这些环境中。引用全局环境可使代码正确运行:

foreach(k=1:4) %dopar% {
  #Create a weight vector, saves on globalenv() references later
  w=d_data[train_samples[[k]],12]
  model.fit<-glm(formula='hp~cyl+disp+mpg',
                 family=poisson,
                 data=d_data[train_samples[[k]],],
                 #Instruct glm() to look in the global environment for weights
                 weights=globalenv()$w)
}
foreach(k=1:4)%dopar%{
#创建权重向量,稍后保存globalenv()引用
w=d_数据[序列样本[[k]],12]

model.fit您可能需要将权重/数据传递给处理它的核心。您是否尝试过。导出?我无法复制您的错误。我收到另一个错误,“任务1失败-”未找到对象“k”。@MJH,我尝试过使用.export=“d_data”"并在警告已导出d_数据的情况下得到相同的错误。我在下面添加了一个额外的示例。@msubbaiah,我不确定您为什么会得到这个错误。我添加了一个额外的示例,如果错误是由“weights”参数引起的,它可能对您有用。@Kyle感谢您的编辑。导出函数应该可以工作。我是sti我无法复制您的错误。两个foreach循环都为我运行。谢谢您的帮助!不幸的是,这对我来说不太合适。它可以正常运行,但包括.errorhandling='pass'会导致trial.data变量中充满错误消息。它在运行代码时是否存储错误消息或结果?@Kyle ap延迟的原因。我调整了模型函数。这现在在并行和非并行处理中工作。此外,在通过多个循环实现之前,您可能希望调查您的采样或权重。如果您从%dopar%切换到%do%,您确实可以使用打印权重语句报告NA值。太棒了,这对我适用!我不是我不确定为什么需要以这种特定的方式指定权重。我发现,如果使用speedglm软件包,您不会遇到定义权重的问题。我认为打印权重语句报告的NA值是由于在采样输入\数据后定义权重而产生的。切换输入\数据
foreach(k=1:4) %dopar% {
  #Create a weight vector, saves on globalenv() references later
  w=d_data[train_samples[[k]],12]
  model.fit<-glm(formula='hp~cyl+disp+mpg',
                 family=poisson,
                 data=d_data[train_samples[[k]],],
                 #Instruct glm() to look in the global environment for weights
                 weights=globalenv()$w)
}