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

时间:2018-06-06 08:19:08

标签: r lapply scoping

我想使用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()生成的模型?

2 个答案:

答案 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))))