Проблема с областью видимости при использовании doParallel

Я пытаюсь оценить несколько непараметрических моделей, используя пакет 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 является излишним.

Любые предложения, как сделать эту работу?


person Martin Schmelzer    schedule 22.06.2018    source источник


Ответы (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()) из-за таких проблем.

person Roland    schedule 22.06.2018
comment
Большое спасибо. Это решило мою проблему. Что именно вы имеете в виду под конструкциями eval(bquote())? - person Martin Schmelzer; 22.06.2018
comment
Спасибо за разъяснение! :) - person Martin Schmelzer; 22.06.2018
comment
Еще один вопрос: теперь npsigtest находит данные. Но когда есть строки, содержащие NA, которые отфильтрованы npregbw, npsigtest не знает, какие строки были пропущены. Обычно он это знает. - person Martin Schmelzer; 22.06.2018
comment
Выполнение этого в течение npestimate или до него (но в пределах foreach) также не работает. - person Martin Schmelzer; 22.06.2018