nnet::multinom生成的参数估计量尺度是多少?如何转换为概率尺度?
R语言nnet::multinom多分类模型的系数转概率方法
问题核心原因
你使用了错误的转换逻辑:二分类逻辑回归用逆logit(plogis)转换,多分类多项logit模型需要用softmax转换,不能单独对每个类别的系数做逆logit计算。
multinom默认将第一类设为参考类别,所有输出的系数都是对应类别与参考类别相比的对数优势:
- 参考类别(第一类)的线性预测值η₁固定为0
- 第k类(k≥2)的线性预测值ηₖ = 你提取到的第k类的系数(包含自变量时为系数乘以自变量取值加截距)
正确转换公式(softmax)
第k个类别的预测概率为:
P(Y=k) = exp(ηₖ) / Σᵢ₌₁ᴷ exp(ηᵢ)
其中K为总类别数,Σ是对所有类别的exp(η)求和。
你的示例手动计算验证
你示例中的系数对应的线性预测值为:
- η₁ = 0(参考类默认值)
- η₂ = 第二类的截距系数,对应
log(0.3/0.06)≈1.609 - η₃ = 第三类的截距系数,对应
log(0.64/0.06)≈2.367
代入公式计算:
# 计算所有类别的exp(η)之和 sum_exp <- exp(0) + exp(1.609) + exp(2.367) ≈ 1 + 5 + 10.667 = 16.667 # 分别计算概率 P1 = 1 / 16.667 ≈ 0.06 P2 = 5 / 16.667 ≈ 0.3 P3 = 10.667 / 16.667 ≈ 0.64
和predict输出的结果完全一致。
通用转换代码
仅含截距项的模型(你的示例场景)
# 补全参考类的线性预测值为0,再做softmax eta <- c(0, coef(mod)) prob <- exp(eta) / sum(exp(eta))
含自变量的模型
假设你拟合的模型为multinom(group ~ x, data = dat),要计算x取某值时的各类概率:
# 假设x取值为2 x_val <- 2 # 参考类线性预测值为0 eta1 <- 0 # 第二类线性预测值 = 第二类截距 + 第二类x系数 * x取值 eta2 <- coef(mod)[2,1] + coef(mod)[2,2] * x_val # 第三类线性预测值 = 第三类截距 + 第三类x系数 * x取值 eta3 <- coef(mod)[3,1] + coef(mod)[3,2] * x_val # softmax转换 prob <- exp(c(eta1, eta2, eta3)) / sum(exp(c(eta1, eta2, eta3)))
内容的提问来源于stack exchange,提问作者missng
相关产品推荐
相关产品推荐

