使用predict.glm对logistic回归模型预测得到线性结果的问题
问题原因与解决方案
这是predict.glm()的默认行为导致的:默认情况下,它返回的是链接函数尺度(logit尺度)的线性预测值,而非logistic模型最终输出的概率值。
具体解释
你的logistic模型拟合是正确的——从输出的系数可以看到,截距-3、斜率3完全匹配你生成数据时的sigmoid函数y=1/(1+exp(3-3x))(对应logit变换为log(y/(1-y)) = -3 + 3x)。但predict.glm()默认参数type="link",所以返回的是-3 + 3x这个线性结果,也就是你看到的直线。
解决方法
在调用predict()时,指定type="response"参数,就能得到logistic模型输出的概率值(和原数据y同尺度):
# 重新拟合模型(和之前一致) L <- glm(y ~ x, family=quasibinomial(link='logit'), data=df) # 指定type="response"获取概率尺度的预测值 y_fit <- predict.glm(L, newdata=df, type="response") # 绘制拟合结果,和原logistic曲线对比 plot(df$x, df$y, main="正确的Logistic拟合曲线") lines(df$x, y_fit, col="red", lwd=2)
运行这段代码后,你会得到和原数据完全重合的logistic曲线,符合预期。
补充说明
type="link":默认值,返回链接函数变换后的线性预测值(logit尺度,对应log(p/(1-p)))type="response":返回响应变量尺度的预测值(概率p,即sigmoid(线性预测值))type="terms":返回各预测项的贡献值
内容的提问来源于stack exchange,提问作者Ingolifs
相关产品推荐
相关产品推荐

