R中多项式的拟合值:参考类别的系数?

时间:2013-06-24 19:34:11

标签: r multinomial

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

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

但是,拟合(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)))?

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

2 个答案:

答案 0 :(得分:5)

我有同样的问题,在环顾四周之后,我认为解决方案是:     给出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

答案 1 :(得分: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