6

我正在使用 nnet 包中的函数 multinom 来运行多项逻辑回归。

据我了解,在多项逻辑回归中,系数是响应概率与参考响应概率之比的对数变化(即 ln(P( i )/P( r ))= B 1 +B 2 *X... 其中 i 是一个响应类别,r 是参考类别,X 是某个预测变量)。

但是,fitted(multinom(...)) 会为每个类别生成估计值,甚至是参考类别r

编辑示例:

set.seed(1)
library(nnet)
DF <- data.frame(X = as.numeric(rnorm(30)), 
                 Y = factor(sample(letters[1:5],30, replace=TRUE)))
DF$Y<-relevel(DF$Y, ref="a") #ensure a is the reference category
model <- multinom(Y ~ X, data = DF)
coef(model)
#  (Intercept)           X
#b   0.1756835  0.55915795
#c  -0.2513414 -0.31274745
#d   0.1389806 -0.12257963
#e  -0.4034968  0.06814379

head(fitted(model))
#          a         b          c         d         e
#1 0.2125982 0.2110692 0.18316042 0.2542913 0.1388810
#2 0.2101165 0.1041655 0.26694618 0.2926508 0.1261210
#3 0.2129182 0.2066711 0.18576567 0.2559369 0.1387081
#4 0.1733332 0.4431170 0.08798363 0.1685015 0.1270647
#5 0.2126573 0.2102819 0.18362323 0.2545859 0.1388516
#6 0.1935449 0.3475526 0.11970164 0.2032974 0.1359035

head(DF)
#           X Y
#1 -0.3271010 a

为了计算第 1 行的响应b和响应a之间的预测概率比,我们计算exp(0.1756835+0.55915795*(-0.3271010))=0.9928084。我看到这对应于第 1 行的拟合 P(b)/P(a)(0.2110692/0.2125982=0.9928084)。

参考类别的拟合概率是否以代数方式计算(例如,0.2110692/exp(0.1756835+0.55915795*(-0.3271010)))?

有没有办法获得参考类别的预测概率方程?

4

2 回答 2

8

我有同样的问题,环顾四周后,我认为解决方案是:给定 3 个类:a、b、c 和算法输出的拟合(模型)概率 pa、pb、pc,您可以从这 3 个中重建这些概率方程:

log(pb/pa) = beta1*X

log(pc/pa) = beta2*X

pa+pb+pc=1

其中 beta1,beta2 是 coef(model) 输出的行,X 是您的输入数据。

玩弄你得到的那些方程:

pb = exp(beta1*X)/(1+exp(beta1*X)+exp(beta2*X))

pc = exp(beta2*X)/(1+exp(beta1*X)+exp(beta2*X))

pa = 1 - pb - pc
于 2013-11-16T00:53:31.057 回答
1

这里的关键是它的帮助文件中multinom()说“拟合了对数线性模型,第一类的系数为零。”

所以这意味着可以直接计算参考类的预测值,假设类“a”的系数都为零。例如,对于上面给出的样本行,我们可以使用 softmax 变换计算“a”类的预测概率: exp(0+0)/(exp(0+0) + exp(0.1756835 + 0.55915795*(-0.3271010)) + exp(-0.2513414 + (-0.31274745)*(-0.3271010)) + exp(0.1389806 + (-0.12257963)*(-0.3271010)) + exp(-0.4034968 + 0.06814379*(-0.3271010)))

或者更简单地说,使用非硬编码数字,我们可以将第一行数据的整个概率集计算为:

softMax <- function(x){
    expx <- exp(x)
    return(expx/sum(expx))
}
coefs <- rbind(c(0,0), coef(model))
linear.predictor <- as.vector(coefs%*%c(1,-0.3271010))
softMax(linear.predictor)

FWIW:原始问题中的示例对我来说并没有完全重现,我的种子给出了不同的随机偏差。所以我重新复制了这个例子,并在下面进行了计算。

library(nnet)
set.seed(1)
DF <- data.frame(
    X = as.numeric(rnorm(30)), 
    Y = factor(sample(letters[1:5],30, replace=TRUE)))
DF$Y<-relevel(DF$Y, ref="a") #ensure a is the reference category
model <- multinom(Y ~ X, data = DF)
coef(model)
##   (Intercept)             X
## b -0.33646439  1.200191e-05
## c -0.36390688 -1.773889e-01
## d -0.45197598  1.049034e+00
## e -0.01418543  3.076309e-01

DF[1,]
##            X Y
## 1 -0.6264538 c

fitted.values(model)[1,]
##          a          b          c          d          e 
## 0.27518921 0.19656378 0.21372240 0.09076844 0.22375617 

coefs <- rbind(c(0,0), coef(model))
linear.predictor <- as.vector(coefs%*%c(1,DF[1,"X"]))
softMax(linear.predictor)
## [1] 0.27518921 0.19656378 0.21372240 0.09076844 0.22375617
于 2020-01-23T15:33:51.357 回答