Функция lme4::glmer.nb выдает ошибку в family$family: оператор $ не определен для этого класса S4 в зависимости от порядка запуска моделей

library(lme4)

dummy <- as.data.frame(cbind(speed = rpois(100, 10), pop = rep(1:4, each = 25), season = rep(1:2, each = 50), id = seq(1, 100, by = 1)))
dummy2 <- as.data.frame(cbind(speed = c(rnbinom(50, 10, 0.6), rnbinom(50, 10, 0.1)), pop = rep(1:4, each = 25), season = rep(1:2, each = 50), id = seq(1, 100, by = 1)))

poisson <- glmer(speed~pop*season + (1|id),
             data=dummy, family="poisson")
neg.bin <- glmer.nb(speed ~ pop*season + (1|id),
                data=dummy2, control=glmerControl(optimizer="bobyqa"))

Когда я запускаю скрипт, создающий модель Пуассона перед отрицательной биномиальной моделью с использованием пакета lme4, я получаю следующую ошибку при запуске модели neg.bin:

Error in family$family : $ operator not defined for this S4 class

Однако, если я запускаю модели в обратном порядке, я не получаю сообщение об ошибке.

library(lme4)
dummy <- as.data.frame(cbind(speed = rpois(100, 10), pop = rep(1:4, each = 25), season = rep(1:2, each = 50), id = seq(1, 100, by = 1)))
dummy2 <- as.data.frame(cbind(speed = c(rnbinom(50, 10, 0.6), rnbinom(50, 10, 0.1)), pop = rep(1:4, each = 25), season = rep(1:2, each = 50), id = seq(1, 100, by = 1)))
neg.bin <- glmer.nb(speed ~ pop*season + (1|id),
                data=dummy2, control=glmerControl(optimizer="bobyqa"))
poisson <- glmer(speed~pop*season + (1|id),
             data=dummy, family="poisson")

В примере модели neg.bin есть предупреждения о сходимости, но тот же самый шаблон происходит с моими реальными моделями, которые сходятся нормально. Как запуск модели Пуассона сначала влияет на модель neg.bin?


person canderson156    schedule 27.09.2016    source источник


Ответы (1)


Поскольку вы замаскировали функцию R poisson. Следующее будет работать нормально (за исключением того, что для neg.bin есть предупреждение о сходимости):

library(lme4)
set.seed(0)
dummy <- as.data.frame(cbind(speed = rpois(100, 10), pop = rep(1:4, each = 25), season = rep(1:2, each = 50), id = seq(1, 100, by = 1)))
dummy2 <- as.data.frame(cbind(speed = c(rnbinom(50, 10, 0.6), rnbinom(50, 10, 0.1)), pop = rep(1:4, each = 25), season = rep(1:2, each = 50), id = seq(1, 100, by = 1)))

## use a different name for your model, say `poisson_fit`
poisson_fit <- glmer(speed~pop*season + (1|id),
         data=dummy, family="poisson")

negbin_fit <- glmer.nb(speed ~ pop*season + (1|id),
            data=dummy2, control=glmerControl(optimizer="bobyqa"))

Вот в чем проблема. Среди первых нескольких строк glmer.nb есть одна строка:

mc$family <- quote(poisson)

Таким образом, если вы замаскируете poisson, корректная функция poisson из пакета stats не будет найдена.

Бен только что исправил эту проблему, заменив это на:

mc$family <- quote(stats::poisson)

Мое первоначальное замечание по поводу family = "poisson" и match.fun здесь не имеет значения. Это только объясняет, почему в таких подпрограммах, как glm и mgcv::gam, разрешено передавать строку family.

person Zheyuan Li    schedule 27.09.2016
comment
Хорошо поймал. Я думаю, что смогу исправить это в версии для разработчиков. - person Ben Bolker; 28.09.2016
comment
исправлено в разрабатываемой версии. - person Ben Bolker; 28.09.2016
comment
почему ты извиняешься? Это хороший ответ. Я буду очень рад, если другие люди ответят на lme4 вопросы, это избавит меня от хлопот. И да, ты прав. Я думаю, что ваши комментарии об использовании family="poisson" неверны / касательны. Проблема в том, что glmer.nb внутренне использует poisson, а не "poisson" (или привык) - person Ben Bolker; 28.09.2016