通过lapply()创建的模型无法使用update()函数进行更新。

5
我想在R中使用lapply()计算多个模型,但似乎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"

有没有一种方法可以让update()处理通过lapply()生成的模型?
2个回答

3
错误发生的原因是匿名函数传递的参数名称覆盖了 glm 对象的 call 元素。
modsa <- lapply(f, function(x) glm(x, data = d1))

modsa[[1]]$call
 glm(formula = x, data = d1)

#compare with a single instance of the model    
moda1<-glm(y ~ 1, data=d1)

moda1$call
 glm(formula = y ~ 1, data = d1)

如果你将公式添加回去,它将正确地重新创建调用。
update(modsa[[1]], data = d1[1:7, ], formula=f[[1]])

对于第二个实例,这不起作用,但是您可以看到,如果手动更新调用元素,则可以恢复更新功能。

modsb[[1]]$call<-getCall(moda1)

update(modsb[[1]], data = d1[1:7, ])

2

Esther是正确的,问题出在glm的调用元素上。来自?update:

'update'将会更新并(默认)重新拟合模型。它通过提取存储在对象中的调用,更新调用并(默认情况下)评估该调用来实现此目的。

如前所述,可以同时更新公式:

update(modsa[[1]], data = d1[1:7, ], formula=f[[1]])

如果这种方法不方便的话,以下是如何运行您的lapply()并直接将正确的公式分配给调用元素的方法:
modsa <- lapply(f, function(formula) eval(substitute(glm(F, data = d1), list(F=formula))))

这将把相应的公式替换到glm调用中,然后进行评估。使用这个长长的一行代码,你可以毫无问题地运行update(modsa[[1]], data = d1[1:7, ])


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接