glmnet: Bagaimana cara membuat parameterisasi multinomial?

11

Masalah berikut: Saya ingin memprediksi variabel respons kategoris dengan satu (atau lebih) variabel kategorikal menggunakan glmnet ().

Namun, saya tidak dapat memahami output yang diberikan glmnet kepada saya.

Ok, pertama mari kita buat dua variabel kategori terkait:

Hasilkan Data

p <- 2 #number variables
mu <- rep(0,p)
sigma <- matrix(rep(0,p^2), ncol=p)
sigma[1,2] <- .8 #some relationship ..
diag(sigma) <- 1
sigma <- pmax(sigma, t(sigma))
n <- 100
set.seed(1)
library(MASS)
dat <- mvrnorm(n, mu, sigma)
#discretize
k <- 3 # number of categories
d <- apply(dat, 2, function(x) {
  q <- quantile(x, probs=seq(0,1, 1/k))[-c(1, k+1)]
  out <- numeric(length(x))
  for(i in 1:(k-1))
  {  out[x<q[k-i]] <- i } 
  return(out)
})
d <- data.frame(apply(d, 2, as.factor))
d[,2] <- relevel(d[,2], ref="0")
d[,1] <- relevel(d[,1], ref="0")
colnames(d) <- c("X1", "X2")

Kita mendapatkan:

> table(d)
   X2
X1   0  1  2
  0 22 11  1
  1  9 14 10
  2  3  8 22

Prediksi: multinom ()

Kemudian mari kita prediksi X1 oleh X2 menggunakan multinom () dari paket nnet:

library(nnet)
mod1 <- multinom(X1~X2, data=d)
mod1

yang memberi kita:

Call:
multinom(formula = X1 ~ X2, data = d)

Coefficients:
  (Intercept)      X21      X22
1  -0.8938246 1.134993 3.196476
2  -1.9924124 1.673949 5.083518

Pemeriksaan manual

Sekarang mari kita periksa, apakah kita dapat mereproduksi itu secara manual:

tb <- table(d)
log(tb[2,1] / tb[1,1]) #intercept category1
[1] -0.8938179
log(tb[3,1] / tb[1,1]) #intercept category2
[1] -1.99243
log((tb[1,1]*tb[2,2]) / (tb[1,2]*tb[2,1])) #logodds-ratio cat X1 0vs1 in X2 0vs1
[1] 1.13498
#same for the three remaining log odds ratios

Kami menghasilkan angka yang sama, bagus!

Prediksi: glmnet ()

Sekarang mari kita lakukan hal yang sama dengan glmnet:

library(glmnet)
y <- d[,1]
X <- model.matrix(X1~X2, data=d)[,-1]
mod2 <- glmnet(X, y, family="multinomial", lambda=c(0))
coef(mod2, s=0) #meaning of coefficients unclear!
$`0`
3 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept)  0.9620216
X21         -1.1349130
X22         -3.1958293   

$`1`
3 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) 0.06825755
X21         .         
X22         .         

$`2`
3 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) -1.0302792
X21          0.5388814
X22          1.8870363

Perhatikan bahwa saya menetapkan s = 0, sehingga tidak ada regularisasi dan parameter harus berisi informasi yang sama persis dengan parameter fungsi multinom ().

Namun, kami mendapatkan parameter yang sangat berbeda. Ini disebabkan oleh berbagai parameterisasi yang mereka gunakan di glmnet, lihat misalnya:

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (judul: model multinomial) atau kertas yang sesuai: http://www.jstatsoft.org/v33/i01/paper (heading: 4. Diatur secara teratur regresi multinomial)

P(Y=k|X)

Peluang bersyarat: multinom ()

Jadi saya pertama-tama saya menghitung probabilitas ini dari multinom ():

p.fit <- predict(mod1, type="probs")
head(d)
head(p.fit)
ccp <- matrix(0,3,3)
ccp[,3] <- p.fit[1,]
ccp[,2] <- p.fit[2,]
ccp[,1] <- p.fit[4,]
ccp
           [,1]      [,2]       [,3]
[1,] 0.64705896 0.3333332 0.03030114
[2,] 0.26470416 0.4242450 0.30303140
[3,] 0.08823688 0.2424218 0.66666746
colSums(ccp) #sum to 1, ok; sorry for the awful code ...
[1] 1 1 1

Karena kita memiliki model jenuh di sini, ini harus sama dengan apa yang dapat kita hitung dari data:

emp <- table(d)/100
cemp <- apply(emp, 2, function(x) {
  x / sum(x)
})
cemp 
   X2
             0         1          2
  0 0.64705882 0.3333333 0.03030303
  1 0.26470588 0.4242424 0.30303030
  2 0.08823529 0.2424242 0.66666667

yang memang demikian.

Peluang bersyarat: glmnet ()

Sekarang sama dari glmnet:

c1 <- coef(mod2, s=0)
c <-matrix(rapply(c1, function(x) { as.matrix(x)}, how="unlist"), 3,3, byrow=T)

ccp2 <- matrix(0,3,3)
config <- rbind(c(0,0), c(1,0), c(0,1))

for(l in 1:3) #loop through categories
{
  denom <- numeric(3)
  for(i in 1:3) # loop through possible predictor combinations
  { 
    x1 <- config[i, 1]
    x2 <- config[i, 2]
    denom[i] <- exp(c[l,1] + x1 * c[l,2]  + x2 * c[l,3])
  }
  ccp2[l,1] <- denom[1] / sum(denom)
  ccp2[l,2] <- denom[2] / sum(denom)
  ccp2[l,3] <- denom[3] / sum(denom)
}
ccp2
          [,1]      [,2]       [,3]
[1,] 0.7340082 0.2359470 0.03004484
[2,] 0.3333333 0.3333333 0.33333333
[3,] 0.1073668 0.1840361 0.70859708
colSums(ccp2)
[1] 1.1747083 0.7533165 1.0719753

Probabilitas kondisional sel agak terkait tetapi berbeda. Juga mereka tidak meringkas satu.

Jadi kita punya dua masalah di sini:

a) probabilitas bersyarat tidak meringkaskan hingga 1 dan

b) parameter tidak menggambarkan apa yang kita lihat dalam data: misalnya di baris 2 ada perbedaan di seluruh kolom, tetapi glmnet memperkirakan kedua koefisien (bukan intersep) sebagai nol.

Saya menggunakan masalah regresi linier dan membandingkan glm dan glmnet dengan s = 0 untuk memastikan bahwa s = 0 berarti nol regularisasi (solusinya hampir identik).

Bantuan & ide apa pun akan sangat dihargai!

jmb
sumber

Jawaban:

5

Tentang parameter dari multinom dan glmnet, saya menemukan jawaban ini bermanfaat, Dapatkah saya menggunakan algoritma glm untuk melakukan regresi logistik multinomial?

terutama, "Ya, dengan GLM Poisson (model log linier) Anda dapat memenuhi model multinomial. Oleh karena itu multinomial logistik atau log linear model Poisson adalah setara."

Jadi saya akan menunjukkan reparametrization dari koefisien glmnet ke multinom koefisien.

n.subj=1000
x1 <- rnorm(n.subj)
x2 <- rnorm(n.subj)
prob <- matrix(c(rep(1,n.subj), exp(3+2*x1+x2), exp(-1+x1-3*x2)), , ncol=3)
prob <- sweep(prob, 1, apply(prob, 1, sum), "/")

y = c()
for (i in 1:n.subj)
  y[i] <- sample(3, 1, replace = T, prob = prob[i,])

multinom(y~x1+x2)

x <- cbind(x1,x2); y2 <- factor(y)
fit <- glmnet(x, y2, family="multinomial", lambda=0, type.multinomial =     "grouped")
cf <- coef(fit)

cf[[2]]@x - cf[[1]]@x   # for the category 2
cf[[3]]@x - cf[[1]]@x   # for the category 3

Semoga ini membantu. Tapi saya tidak berpikir saya mengerti kesetaraan Generalized Linear Model (Poisson) dan model logistik multinomial masuk dan keluar.

Katakan padaku apakah ada sumber yang baik dan mudah dibaca serta "mudah" dimengerti ..

KH Kim
sumber
1
Apakah Anda memiliki penjelasan lebih lanjut untuk "mengapa" ini masalahnya? Yaitu - mengapa glance menghasilkan koefisien yang merupakan kombinasi dari koefisien multinomial yang lebih khas dan koefisien 'basis'. Apakah ini memungkinkan kami untuk menafsirkan setiap set koefisien sebagai model log-linear ?
samplesize1