【问题标题】:What is the scale of parameter estimates produced by nnet::multinom?nnet::multinom 产生的参数估计的规模是多少?
【发布时间】:2026-02-01 12:40:01
【问题描述】:

我正在使用 nnet 包中的 multinom 函数在 R 中进行多项逻辑回归。当我拟合模型时,我希望得到 logit 尺度上的参数估计值。但是,使用逆 logit 转换变量不会给出与预测示例匹配的概率估计,请参见下面的示例。

帮助文件指出“拟合了对数线性模型,第一类的系数为零”,但是如何转换参数估计值以获得对概率尺度的预测效果?

library("nnet")

set.seed(123)

# Simulate some simple fake data
groups <- t(rmultinom(500, 1, prob = c(0.05, 0.3, 0.65))) %*% c(1:3)
moddat <- data.frame(group = factor(groups))

# Fit the multinomial model
mod <- multinom(group ~ 1, moddat)
predict(mod, type = "probs")[1,] # predicted probabilities recover generating probs

# But transformed coefficients don't become probabilities
plogis(coef(mod))       # inverse logit
1/(1 + exp(-coef(mod))) # inverse logit

使用predict我可以恢复生成概率:

   1    2    3 
0.06 0.30 0.64 

但是取系数的逆对数并不能给出概率:

  (Intercept)
2   0.8333333
3   0.9142857

【问题讨论】:

  • 这更像是一个解释问题,因此更适合 CrossValidated.com。但是不要在那里发布它,因为它已经被询问和回答:stats.stackexchange.com/questions/17196/…
  • 感谢您的提醒,我实际上找到了另一篇描述解决方案的帖子——softmax 转换*.com/questions/17283595/…
  • 我无法撤回我的赞成票或更改推理,但该问题应作为副本关闭。
  • 抱歉,我没有意识到。我应该删除这个问题吗?
  • 如果您查看您的问题并认为它具有独特的功能,可能允许在此问题上搜索的人找到该问题,而这些功能在搜索中找不到,否则会由已识别的重复项找到通过@missing 那么你应该把它留下来。当我查看这两个问题时,您的回答似乎确实为搜索工作添加了一些有用的术语。所以我现在处于一种奇怪的情况,刚刚对你的问题投了赞成票,而早些时候对你的答案投了反对票(基于重复)。如果您可以稍微修改一下,我会推翻我的反对意见。

标签: r nnet


【解决方案1】:

逆对数是二项式模型的正确反向变换。在多项式模型的情况下,适当的反向变换是softmax 函数,如this question 中所述。

文档中关于“对数线性模型适合第一类系数为零”的声明本质上意味着参考概率在链接尺度上设置为 0。

从上面的例子中手动恢复概率:

library("nnet")
set.seed(123)

groups <- t(rmultinom(500, 1, prob = c(0.05, 0.3, 0.65))) %*% c(1:3)
moddat <- data.frame(group = factor(groups))
 
mod <- multinom(group ~ 1, moddat)
# weights:  6 (2 variable)
# initial  value 549.306144 
# final  value 407.810115 
# converged
predict(mod, type = "probs")[1,] # predicted probabilities recover generating probs
#   1    2    3 
# 0.06 0.30 0.64 

# Inverse logit is incorrect
1/(1 + exp(-coef(mod))) # inverse logit
#   (Intercept)
# 2   0.8333333
# 3   0.9142857

 
# Use softmax transformation instead
 softmax <- function(x){
   expx <- exp(x)
   return(expx/sum(expx))
 }
 
# Add the reference category probability (0 on link scale) and use softmax tranformation
all_coefs <- rbind("1" = 0, coef(mod)) 
softmax(all_coefs)
#   (Intercept)
# 1        0.06
# 2        0.30
# 3        0.64

【讨论】:

  • 正确的做法不是为重复的问题提供答案,而是标记它。