我正在尝试使用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
只是找不到上面两行代码中使用的数据。
数据会自动导出到节点,因此在.export
中使用foreach
是多余的。
有什么建议可以做到这一点吗?
答案 0 :(得分:3)
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())
构造。