德雷克计划拟合 lmer 模型失败
drake plan fitting lmer models fails
我正在尝试在 drake
计划中安装一些 lme4::lmer
模型,但出现错误
'data' not found, and some variables missing from formula environment
如果我替换 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)
有什么建议吗?
这个边缘案例是 https://github.com/ropensci/drake/issues/1012 and https://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-07-29 创建
顺便说一句,如果可以的话,请考虑避免使用 iris 数据集:https://armchairecology.blog/iris-dataset/
我可以通过在新目标中重新分配来解决这个问题
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)
我正在尝试在 drake
计划中安装一些 lme4::lmer
模型,但出现错误
'data' not found, and some variables missing from formula environment
如果我替换 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)
有什么建议吗?
这个边缘案例是 https://github.com/ropensci/drake/issues/1012 and https://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-07-29 创建顺便说一句,如果可以的话,请考虑避免使用 iris 数据集:https://armchairecology.blog/iris-dataset/
我可以通过在新目标中重新分配来解决这个问题
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)