【问题标题】:drake plan fitting lmer models fails德雷克计划拟合 lmer 模型失败
【发布时间】:2020-07-28 23:03:46
【问题描述】:

我正在尝试在 drake 计划中安装一些 lme4::lmer 模型,但出现错误

找不到“数据”,公式环境中缺少一些变量

如果我替换 lm 模型,它可以工作。

这是一个可重现的例子

library(drake)
library(lme4)
#> Loading required package: Matrix
#> 
#> Attaching package: 'Matrix'
#> The following object is masked from 'package:drake':
#> 
#>     expand

plan_lm <- drake_plan(
  dat = iris,
  mod = lm(Sepal.Length ~ Petal.Length, data = dat)
)

make(plan_lm)
#> ℹ Consider drake::r_make() to improve robustness.
#> ▶ target dat
#> ▶ target mod

plan_lmer <- drake_plan(
  dat1 = iris,
  mod1 = lmer(Sepal.Length ~ Petal.Length, data = dat1)
)

make(plan_lmer)
#> ▶ target dat1
#> ▶ target mod1
#> x fail mod1
#> Error: target mod1 failed.
#> diagnose(mod1)$error$message:
#>   'data' not found, and some variables missing from formula environment
#> diagnose(mod1)$error$calls:
#>   lme4::lFormula(formula = Sepal.Length ~ Petal.Length, data = dat1, 
#>     control = list("nloptwrap", TRUE, 1e-05, TRUE, FALSE, list(
#>         "ignore", "stop", "ignore", "stop", "stop", "message+drop.cols", 
#>         "warning", "stop"), list(list("warning", 0.002, NULL), 
#>         list("message", 1e-04), list("warning", 1e-06)), list()))
#>   lme4:::checkFormulaData(formula, data, checkLHS = control$check.formula.LHS == 
#>     "stop")
#>   base::stop("'data' not found, and some variables missing from formula environment", 
#>     call. = FALSE)
Created on 2020-07-29 by the reprex package (v0.3.0)

有什么建议吗?

【问题讨论】:

    标签: r lme4 drake-r-package


    【解决方案1】:

    这种边缘情况是https://github.com/ropensci/drake/issues/1012https://github.com/ropensci/drake/issues/1163 的一个实例。 drake 创建自己的环境来运行命令,所以dat 所在的环境与模型实际运行的环境不同。 drake 这样做是有充分理由的,并且行为不会改变,所以这个问题很遗憾是永久性的,除非 lme4 发生变化。我能提供的最佳解决方法是在运行时在目标环境中创建公式,类似于下面的 reprex。您必须手动强制数据和公式处于同一环境中。我建议编写一个自定义函数来执行此操作。

    library(drake)
    suppressPackageStartupMessages(library(lme4))
    
    fit_lmer <- function(dat) {
      envir <- environment()
      envir$dat <- dat
      f <- as.formula("Reaction ~ Days + (Days | Subject)", env = envir)
      lme4::lmer(f, data = dat)
    }
    
    plan <- drake_plan(
      dat = sleepstudy,
      mod = fit_lmer(dat)
    )
    
    make(plan)
    #> ▶ target dat
    #> ▶ target mod
    

    reprex package (v0.3.0) 于 2020 年 7 月 29 日创建

    顺便说一句,如果可以的话,请考虑避免使用 iris 数据集:https://armchairecology.blog/iris-dataset/

    【讨论】:

      【解决方案2】:

      我可以通过在新目标中重新分配来解决问题

      plan <- drake_plan(
        dat = sleepstudy,
        mod =  {dat <- dat
          lmer(Reaction ~ Days + (Days | Subject), dat)
        }
      )
      make(plan)
      

      或关注https://github.com/ropensci/drake/issues/1163,使用readd(dat)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-29
        相关资源
        最近更新 更多