Poisson GLM 如何处理非计数数据(速率数据)?

机器算法验证 r 广义线性模型 泊松回归 抵消
2022-03-17 14:16:10

我的问题是相关的,但与以下问题不同: Fitting a Poisson GLM in R - questions with rates vs. counts

下面是一些假数据:

### some fake data
x=c(1:14)
y=c(0,  1,  2,  3,  1,  4,  9, 18, 23, 31, 20, 25, 37, 45)
y_rate <- y / 1000

我将使用带有日志链接的 Poisson GLM 来预测y_rate

### model
pois_mdl <- glm(y_rate ~ x, family=poisson(link="log"))
summary(pois_mdl)

绘制拟合:

### plot
plot(x, y_rate)
lines(x, pois_mdl$fitted.values)

我很惊讶泊松glm()允许因变量中的非整数值。泊松分布的绘制始终是整数(无论均值参数的值如何)。为什么不glm()炸?

2个回答

不知道为什么glm()不炸。要弄清楚这一点,您必须解压缩所有底层代码。(此外,如果您唯一的问题是 R 代码是如何工作的,那么这个问题在此处是题外话。)

我能说的是你没有正确地模拟费率。如果要对rate而不是counts建模,则需要在模型的公式中包含偏移量。(关于偏移量的CV有一个很好的讨论:何时在泊松回归中使用偏移量?)使用您的示例,代码将是:

pois_mdl2 <- glm(y~x+offset(log(rep(1000,14))), family=poisson(link="log"))

请注意,尽管系数估计值相同,但标准误却大不相同:

summary(pois_mdl2)$coefficients
#               Estimate Std. Error   z value      Pr(>|z|)
# (Intercept) -6.5681214 0.25118701 -26.14833 1.029521e-150
# x            0.2565236 0.02203911  11.63947  2.596237e-31
summary(pois_mdl)$coefficients
#               Estimate Std. Error    z value  Pr(>|z|)
# (Intercept) -6.5681214  7.9431516 -0.8268911 0.4082988
# x            0.2565236  0.6969324  0.3680753 0.7128171

虽然我不建议那些希望保持心理健康的人查看源代码,但我查看. R 没有爆炸的原因似乎是它只是懒得做它可能应该做的那种防御检查。glmglm

主要的迭代重新加权最小二乘循环通过使用附加到family适当类型的对象的方法来工作。在这种情况下,即poisson

> poi <- poisson()
> class(poi)
[1] "family"

这个家庭对象具有适合模型所需的所有 glm ,例如:

> poi$linkfun(1)
[1] 0
> poi$linkinv(1)
[1] 2.718282

另一个,这是反向链接的导数:

> poi$mu.eta(1)
[1] 2.718282

y数据来自第 258 行

dev <- sum(dev.resids(y, mu, weights))

不幸的是,dev.resids根本不在乎是否y是正整数值:

> poi$dev.resid(1.5, 1, 1)
[1] 0.2163953

所以我猜R它不会爆炸,因为它没想到爆炸。