我想使用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"
是否有办法允许update()
处理通过lapply()
生成的模型?
答案 0 :(得分:3)
发生错误是因为call
对象的glm
元素被传递给匿名函数的参数名称覆盖
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, ])
答案 1 :(得分:2)
Esther是正确的,问题在于glm的call元素。来自$('.target-click').click(function()
{
if ($(this).hasClass('item-selected')) {
$(this).removeClass('item-selected')
} else {
$(this).addClass('item-selected')
}
})
:
'update'将更新并(默认情况下)重新拟合模型。它通过这样做 提取存储在对象中的调用,更新调用和(通过 默认)评估该呼叫。
正如已经提到的,人们也可以更新包括公式:
?update
如果由于某种原因这不方便,以下是如何运行update(modsa[[1]], data = d1[1:7, ], formula=f[[1]])
并让它直接将正确的公式分配给调用元素:
lapply()
这将相应的公式替换为glm调用,然后对其进行评估。使用这个长的单行程,您可以毫无问题地运行modsa <- lapply(f, function(formula) eval(substitute(glm(F, data = d1), list(F=formula))))
。