R语言逻辑回归predict()与手动计算结果不符的原因排查
问题分析:
predict()与手动计算结果不一致的原因 你的手动计算存在三个关键错误,导致结果和predict()输出不符,下面逐一拆解并给出正确计算方式:
1. 遗漏了截距项(Intercept)
glm的逻辑回归模型默认包含截距,你的手动公式完全没加入(Intercept)的系数-1.1542256,这是最核心的误差来源。
2. 遗漏了分类变量grade对应的系数
你的测试数据中grade是D3,而glm输出的系数里gradeD3的系数是0.9201400——分类变量在回归中是以基准水平为参照的,未出现在系数列表中的grade类别(比如A类)是基准组,D3属于有系数的对比组,必须把这一项加入线性预测值。
另外你的测试数据sex是Female,对应sexMale的取值为0,所以这一项的贡献为0,这部分你是对的。
3. 公式的括号结构错误
你的手动计算代码里,指数部分的括号逻辑完全错误:
prob_1 <- 1/(1+e^-((-0.0479764603)*41.72451)-0.0139099563*44)
这里e^-()只包裹了interest_rate的项,然后直接减去age项,正确的逻辑应该是把所有线性项的总和取负,也就是:logit = b0 + b1*x1 + b2*x2 + ...,然后p = 1/(1 + exp(-logit))
正确的手动计算过程
我们按照模型系数和测试数据重新计算:
步骤1:明确各变量对应的系数与取值
| 变量 | 取值 | 系数 | 项贡献 |
|---|---|---|---|
| (Intercept) | 1 | -1.1542256 | -1.1542256 |
| interest_rate | 41.72451 | -0.0479765 | -0.0479765*41.72451 ≈ -2.0010 |
| sexMale | 0 | -0.8814945 | 0 |
| age | 44 | -0.0139100 | -0.0139100*44 ≈ -0.61204 |
| gradeD3 | 1 | 0.9201400 | 0.9201400 |
步骤2:计算线性预测值(logit)
logit <- (-1.1542256) + (-0.0479765 * 41.72451) + 0 + (-0.0139100 * 44) + 0.9201400 # 计算结果约为:-2.8471
步骤3:代入sigmoid函数计算概率
prob_correct <- 1/(1 + exp(-logit)) prob_correct # 输出:0.05478904,和predict()结果完全一致
内容的提问来源于stack exchange,提问作者Tsotne
相关产品推荐
相关产品推荐

