【问题标题】:R package gamlss used inside foreach() fails to find an object在 foreach() 中使用的 R 包 gamlss 无法找到对象
【发布时间】:2018-03-09 05:39:00
【问题描述】:

我正在尝试获取留一预测值。请帮我解决这个“找不到对象”的问题。我已经搜索了类似的问题,但没有设法弄清楚。这是在 Windows 10 上。

提前致谢

library('gamlss')
library('foreach')
library('doParallel')

registerDoParallel(cores = 4)
# Generate data
set.seed(314)
sample.size <- 30
input.processed.cut <- data.frame(TP = round(runif(sample.size) * 100), 
                                  FP = round(runif(sample.size) * 100), 
                                  x = runif(sample.size))
# Fit Beta-binomial
model3 <- gamlss(formula = cbind(TP, FP) ~ x,   
                 family = BB,  
                 data = input.processed.cut) 

# Get the leave-one-out values
loo_predict.mu <- function(model.obj, input.data) {
  yhat <- foreach(i = 1 : nrow(input.data), .packages="gamlss", .combine = rbind) %dopar% {
    updated.model.obj <- update(model.obj, data = input.data[-i, ])
    predict(updated.model.obj, what = "mu", newdata = input.data[i,], type = "response")
  }
  return(data.frame(result = yhat[, 1], row.names = NULL))
}

par.run <- loo_predict.mu(model3, input.processed.cut)
# Error in { : task 1 failed - "object 'input.data' not found" 

> version
               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          4.3                         
year           2017                        
month          11                          
day            30                          
svn rev        73796                       
language       R                           
version.string R version 3.4.3 (2017-11-30)
nickname       Kite-Eating Tree 

【问题讨论】:

  • @akrun 在我看来问题不是由foreach 引起的(尽管由OP声明)。要看到这一点,只需将 %dopar% 替换为 %do。我认为这个问题是包 {gamlss} 中的一个错误。
  • 感谢反馈,我已更正。
  • 您能否解释一下:如果从do切换到dopar会破坏它,那一定是dopar的错,对吗?为什么应该是 gamlss?
  • 我也只使用%do%(按顺序)得到错误,这就是原因。 object not found 是 foreach-parallel 的常见错误(由 @akrun 报告),因为对象未传递给集群。但是这个错误只出现在并行版本中。
  • 我遇到过关于 lm 对象的类似帖子,但没有帮助。 r.789695.n4.nabble.com/…

标签: r foreach doparallel gamlss


【解决方案1】:

我收到了 gamlss 团队的回复,并验证了他们的解决方案有效。唯一需要改变的是向 predict() 提供“data”和“newdata”。

loo_predict.mu <- function(model.obj, input.data) {
  yhat <- foreach(i = 1 : nrow(input.data), .packages="gamlss", .combine = rbind) %dopar% {
    updated.model.obj <- update(model.obj, data = input.data[-i, ])
    predict(updated.model.obj, what = "mu", data = input.data[-i, ],
            newdata = input.data[i,], type = "response")
  }
  return(data.frame(result = yhat[, 1], row.names = NULL))
}

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 2018-07-30
    • 1970-01-01
    • 2017-07-18
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2018-08-13
    相关资源
    最近更新 更多