speedglm()返回拟合值与glm()结果差异巨大的原因问询
问题原因
你对模型返回字段的定义存在误解,这是导致结果差异的核心原因:
- 无论是R基础包的
glm()还是speedglm包的speedglm(),linear.predictors字段存储的都是连接函数转换前的线性预测值,对应逻辑回归的公式为:$logit(p) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n$
等号右侧的计算结果就是线性预测值,取值范围为全体实数,因此你得到的负数结果属于正常输出。 - 你从基础
glm()中拿到的fitted.values是经过连接函数逆变换后的最终拟合值,对逻辑回归来说就是sigmoid变换后的概率结果:$p = \frac{1}{1+exp(-线性预测值)}$
所以这个结果才会落在0-1的区间内,符合你对因变量取值范围的预期。 speedglm()中你指定了fitted = TRUE参数后,直接提取speedglm$fitted.values字段即可得到和基础glm()完全对应的概率拟合值,你之前错误提取了linear.predictors字段才会出现结果差异。
验证方法
你可以通过以下代码验证对应关系:
# 验证speedglm的线性预测值经sigmoid变换后等于自身存储的拟合值 all.equal(plogis(speedglm$linear.predictors), speedglm$fitted.values) # 验证speedglm的拟合值与基础glm的拟合值差异仅为计算精度级别的误差 all.equal(glm$fitted.values, speedglm$fitted.values, tolerance = 1e-6)
另外你提到的“文档说明linear.predictors对应glm的fitted.values”属于错误理解,基础glm()本身也存在linear.predictors字段,其取值和speedglm()的同名字段完全一致,和fitted.values是完全不同的两个输出。
内容的提问来源于stack exchange,提问作者C.Robin
相关产品推荐
相关产品推荐

