lme4::glmer.nb函数根据我运行模型的顺序,会出现“Error in family$family : $ operator not defined for this S4 class”的错误提示。

7
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软件包创建泊松模型的脚本,并在之后运行负二项式模型时,出现了以下错误:

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模型示例确实存在收敛警告,但是我的实际模型也出现了相同的情况,而这些模型正在正常收敛。运行Poisson模型会如何影响neg.bin模型?

1个回答

3

因为您掩盖了 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,则无法找到来自 stats 包中的正确函数 poisson

Ben 刚刚通过将此代码替换为以下内容解决了此问题:

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

我的原始观察关于family = "poisson"match.fun并不是真正的问题所在。它只是解释了为什么在像glmmgcv::gam这样的程序中,传递一个family字符串是合法的。


不错的发现。我想我可以在开发版本中修复这个问题。 - Ben Bolker
开发版本已修复。 - Ben Bolker
为什么你要道歉?这是一个好答案。如果其他人回答“lme4”问题,我会非常高兴,这可以省去我的麻烦。而且,你是对的。我认为你关于使用family="poisson"的评论是不正确/离题的。问题在于glmer.nb 内部使用的是poisson,而不是"poisson"(或曾经使用)。 - Ben Bolker

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