为什么 glm() 无法恢复真实参数?

机器算法验证 r 广义线性模型
2022-03-22 10:13:03

以下数据的 glm() 给出截距 0.56916 和斜率 x 0.018。但真正的斜率应该是 1/10。有人知道为什么 glm() 不能恢复真实的斜率吗?谢谢。

R> tmp = data.frame(x=seq_len(100), y=rpois(100, lambda=seq_len(100)/10))
R> fit = glm(y ~ x, family=poisson, data=tmp)
R> fit

Call:  glm(formula = y ~ x, family = poisson, data = tmp)

Coefficients:
(Intercept)            x  
    0.56916      0.01812  

Degrees of Freedom: 99 Total (i.e. Null);  98 Residual
Null Deviance:      252.6 
Residual Deviance: 125.1    AIC: 442.3
R> library(ggplot2)
R> p=qplot(tmp$x, predict(fit))
R> ggsave(p, file='/tmp/glm_poisson_fit.png')
Saving 7 x 7 in image
R> 
1个回答

泊松回归模型是

log(E(Yx))=α+βx

所以你正在为你的数据拟合不同的函数,然后是生成它的函数,所以它会有不同的参数。泊松回归默认使用日志作为链接函数为了使您的模拟与泊松回归模型一致,您需要从

YP(exp[α+βx])

将其翻译成 R 代码,得到:

set.seed(123)
n <- 100

x <- seq_len(n)
y <- rpois(n, x/10)
beta <- glm(y ~ x, family='poisson')$coef
plot(x, y)
curve(x/10, min(x), max(x), col='blue', lty=2, lwd=2, add=TRUE)
curve(exp(beta[1] + beta[2] * x), min(x), max(x), col='red', lwd=2, add=TRUE)
title(expression(lambda == x/10))

x <- seq_len(n)
y <- rpois(n, exp(x/10))
beta <- glm(y ~ x, family='poisson')$coef
plot(x, y)
curve(exp(x/10), min(x), max(x), col='blue', lty=2, lwd=2, add=TRUE)
curve(exp(beta[1] + beta[2] * x), min(x), max(x), col='red', lwd=2, add=TRUE)
title(expression(lambda == exp(x/10)))

在此处输入图像描述

正如您在图上看到的,第一种情况下的真实回归线(蓝色虚线)与模型预测的回归线(红线)不同,而在第二种情况下,它们非常匹配,以至于在图上无法区分.