update()不适用于通过lapply()创建的模型

Hei*_*idi 5 r scoping lapply

我想用lapply()R来计算几个模型,但似乎该update()函数无法处理通过生成的模型lapply().

一个最小的例子:

d1 <- data.frame(y = log(1:9), x = 1:9, trt = rep(1:3, each = 3))

f <- list(y ~ 1, y ~ x, y ~ trt)

modsa <- lapply(f, function(formula) glm(formula, data = d1))
modsb <- lapply(f, glm, data = d1)

update(modsa[[1]], data = d1[1:7, ])
#> Error: object of type 'closure' is not subsettable
update(modsb[[1]], data = d1[1:7, ])
#> Error in FUN(formula = X[[i]], data = d1[1:7, ]): could not find function "FUN"
Run Code Online (Sandbox Code Playgroud)

有没有办法可以update()处理通过生成的模型lapply()

The*_*ras 2

Esther 是正确的,问题出在 glm 的 call 元素上。从?update

\n\n
\n

\xe2\x80\x98update\xe2\x80\x99 将更新并(默认情况下)重新拟合模型。它通过提取存储在对象中的调用、更新调用并(默认情况下)评估该调用来实现此目的。

\n
\n\n

如前所述,还可以更新包括公式:

\n\n
update(modsa[[1]], data = d1[1:7, ], formula=f[[1]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果由于某种原因这不方便,以下是如何运行lapply()并让它直接将正确的公式分配给调用元素:

\n\n
modsa <- lapply(f, function(formula) eval(substitute(glm(F, data = d1), list(F=formula))))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会将相应的公式替换为 glm 调用,然后对其进行评估。有了这条长单线,您就可以update(modsa[[1]], data = d1[1:7, ])毫无问题地跑步。

\n