R中Gamma回归模型两种MSE计算方法结果不一致排查
问题原因及解决方案
你遇到的差异并非bug,而是因为glm返回的默认残差类型和predict()的默认输出空间都不是你预期的原始响应变量空间:
1. glm$residuals的默认类型不是响应残差
Gamma回归(以及广义线性模型GLM)中,glm对象的residuals默认是工作残差(working residuals),它是在链接函数变换后的空间(而非原始y的空间)计算得到的。
- 对于Gamma回归默认的
inverse链接,工作残差基于变换后的线性预测器(即1/μ,μ是模型拟合的响应均值)计算,和原始观测值y与拟合值μ的差完全不是一回事。
2. predict(glm)默认返回线性预测器,而非响应空间的预测值
predict(my_mod)默认输出的是链接空间的线性预测值(比如inverse链接下就是1/μ),不是原始y空间的拟合值μ。直接用y - predict(my_mod)计算的是y减1/μ,这显然不是你想要的“观测值减预测值”。
修正后的MSE计算方法
要得到正确的原始响应空间的MSE,需要同时指定残差类型为"response",或者让predict()返回响应空间的拟合值:
方法一:使用响应残差
# 获取原始响应残差(y - 拟合的μ) resid_response <- resid(my_mod, type = "response") # 计算MSE mean(resid_response^2)
方法二:手动计算观测值减响应空间预测值
# 获取响应空间的拟合值μ pred_response <- predict(my_mod, type = "response") # 计算MSE mean((my_data$y - pred_response)^2)
运行上述两种方法,你会得到完全一致的结果,这才是你预期的“观测值减预测值的平方均值”。
额外说明
Gamma回归作为广义线性模型的一种,通常更适合用离差(deviance)、Pearson残差等指标做模型评估,而非MSE(因为MSE是针对正态分布误差的评估指标)。但如果你的需求确实是计算原始响应空间的MSE,上述方法可以解决你的问题。
内容的提问来源于stack exchange,提问作者Adrian Keister
相关产品推荐
相关产品推荐

