update () не работает для моделей, созданных с помощью lapply () - PullRequest
0 голосов
/ 06 июня 2018

Я хотел бы использовать 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 голосов
/ 06 июня 2018

Эстер верна, проблема в элементе вызова glm.Начиная с ?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, ]).

0 голосов
/ 06 июня 2018

Ошибка возникает из-за того, что элементы 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, ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...