glmnet: Çok terimli parametreleştirme nasıl anlaşılır?


11

Aşağıdaki sorun: glmnet () kullanarak bir (veya daha fazla) kategorik değişken ile kategorik bir yanıt değişkeni tahmin etmek istiyorum.

Ancak glmnet'in bana verdiği çıktıyı anlamıyorum.

Tamam, önce iki kategorik değişken oluşturalım:

Veri Oluştur

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")

Biz:

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

Tahmin: multinom ()

O zaman nnet paketinden multinom () kullanarak X1 x X2'yi tahmin edelim:

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

bu da bize:

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

Manuel kontrol

Şimdi bunu manuel olarak yeniden üretip üretemeyeceğimizi kontrol edelim:

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

Aynı numaraları üretiyoruz, güzel!

Tahmin: glmnet ()

Şimdi aynısını glmnet ile yapalım:

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

S = 0 ayarladığımı unutmayın, bu nedenle düzenlenme yoktur ve parametreler, multinom () işlevinin parametreleriyle aynı bilgileri içermelidir.

Yine de çok farklı parametreler elde ediyoruz. Bunun nedeni glmnet'te kullandıkları farklı parametrelendirmelerdir, bakınız:

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (başlık: Çok terimli modeller) veya ilgili makale: http://www.jstatsoft.org/v33/i01/paper (başlık: 4. Düzenli) multinomiyal regresyon)

P(Y=k|X)

Koşullu olasılıklar: multinom ()

Bu yüzden ilk önce multinom () bu olasılıkları hesaplamak:

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

Burada doymuş bir modelimiz olduğundan, bu verilerden hesaplayabileceğimizle aynı olmalıdır:

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

gerçekten de durum böyle.

Koşullu olasılıklar: glmnet ()

Şimdi aynı glmnet'ten:

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

Hücre koşullu olasılıkları bir şekilde ilişkili ancak farklıdır. Ayrıca bire kadar toplamıyorlar.

Burada iki problemimiz var:

a) şartlı olasılıklar 1 ve

b) parametreler verilerde gördüğümüzü tanımlamaz: örneğin 2. satırda sütunlar arasında farklılıklar vardır, ancak glmnet her iki katsayıyı da (kesişimi değil) sıfır olarak tahmin eder.

Doğrusal bir regresyon problemi kullandım ve s = 0'ın sıfır regülasyon anlamına geldiğinden emin olmak için glm ve glmnet'i s = 0 ile karşılaştırdım (çözeltiler hemen hemen aynıydı).

Herhangi bir yardım ve fikir çok takdir edilecektir!

Yanıtlar:


5

Multinom ve glmnet parametreleri hakkında, bu cevabı faydalı buldum, Çok terimli bir lojistik regresyon yapmak için glm algoritmalarını kullanabilir miyim?

özellikle, "Evet, bir Poisson GLM (log lineer model) ile multinom modellere sığabilirsiniz. Dolayısıyla multinom logistic veya log lineer Poisson modelleri eşdeğerdir."

Bu yüzden glmnet katsayılarının multinom katsayılarına yeniden ölçümünü göstereceğim.

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

Bu yardımcı olur umarım. Ama Genelleştirilmiş Doğrusal Modelin (Poisson) ve çok terimli lojistik modelin içeri ve dışarı denkliğini anladığımı sanmıyorum.

Bana iyi ve okunabilir ve "kolayca" anlaşılabilir bir kaynak olup olmadığını söyle ..


1
Durumun "neden" olduğuna dair başka bir açıklamanız var mı? Yani, neden bu daha tipik çok terimli katsayıların ve 'baz' katsayıların bir kombinasyonu olan katsayılar üretir. Bu, her katsayı kümesini bir log-lineer model olarak yorumlamamıza izin veriyor mu?
samplesize1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.