【问题标题】:Scoping issue when using doParallel使用 doParallel 时的范围问题
【发布时间】:2018-12-01 18:14:11
【问题描述】:

我正在尝试使用 doParallel 包估计多个非参数模型。我的问题似乎与np 包有关。 看看这个可重现的例子:

library(np)
library(doParallel)

df     <- data.frame(Y = runif(100, 0, 10), X = rnorm(100))
models <- list(as.formula(Y ~ X))

npestimate <- function(m, data) {
  LCLS <- npregbw(m, data = data, regtype = "lc", bwmethod = "cv.ls")
  LLLS <- npregbw(m, data = data, regtype = "ll", bwmethod = "cv.ls")
  # sigt <- npsigtest(LCLS, boot.method = "wild", boot.type = "I")
  return(list(LCLS = LCLS, LLLS = LLLS))
}

cl <- makeCluster(length(models))
registerDoParallel(cl)

results <- foreach(m = models, .packages = "np", .verbose = T) %dopar% 
  npestimate(m, data = df)

stopCluster(cl)

如您所见,我创建了一个名为 npestimate() 的函数,以便为每个模型计算不同的东西。我注释掉了我想使用npsigtest 运行显着性测试的一行。通常,npsigtest 通过查看调用npregbw 的环境来获取使用的数据。

但这在这里不起作用。我不知道为什么,但npsigtest 就是找不到上面两行代码中使用的数据。 数据会自动导出到节点,因此在foreach 中使用.export 是多余的。

对如何使这项工作有任何建议?

【问题讨论】:

    标签: r doparallel


    【解决方案1】:

    npsigtest 几乎复制了lm 中使用的方法和lm 对象的函数。因此,它具有相同的潜在范围界定陷阱。问题在于与公式相关的环境:

    environment(models[[1]])
    #<environment: R_GlobalEnv>
    

    很容易解决:

    npestimate <- function(m, data) {
      environment(m) <- environment()
      LCLS <- npregbw(m, data = data, regtype = "lc", bwmethod = "cv.ls")
      LLLS <- npregbw(m, data = data, regtype = "ll", bwmethod = "cv.ls")
      sigt <- npsigtest(LCLS, boot.method = "wild", boot.type = "I")
      return(list(LCLS = LCLS, LLLS = LLLS))
    }
    

    实际上,由于这些问题,我经常更喜欢 eval(bquote()) 构造。

    【讨论】:

    • 非常感谢。这确实解决了我的问题。 eval(bquote()) 构造到底是什么意思?
    • 感谢您的澄清! :)
    • 还有一个问题:现在npsigtest 找到了数据。但是当有包含NA的行被npregbw过滤掉时,npsigtest不知道哪些行被忽略了。通常它确实知道这一点。
    • npestimate 内或之前(但在foreach 内)这样做也不起作用。
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 2019-07-12
    • 2021-07-17
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多