glmnet: Como entender a parametrização multinomial?


11

Problema a seguir: desejo prever uma variável de resposta categórica com uma (ou mais) variáveis ​​categóricas usando glmnet ().

No entanto, não consigo entender a saída que o glmnet me fornece.

Ok, primeiro vamos gerar duas variáveis ​​categóricas relacionadas:

Gerar dados

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

Nós temos:

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

Previsão: multinom ()

Vamos prever o X1 pelo X2 usando o multinom () do pacote nnet:

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

o que nos dá:

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

Verificação manual

Agora vamos verificar se podemos reproduzir isso manualmente:

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

Nós produzimos os mesmos números, bom!

Previsão: glmnet ()

Agora vamos fazer o mesmo com o 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

Observe que eu defino s = 0, portanto, não há regularização e os parâmetros devem conter exatamente as mesmas informações que os parâmetros da função multinom ().

Ainda assim, temos parâmetros muito diferentes. Isso ocorre devido às diferentes parametrizações que eles usam no glmnet, veja, por exemplo:

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (cabeçalho: modelos multinomiais) ou o artigo correspondente: http://www.jstatsoft.org/v33/i01/paper (cabeçalho: 4. Regularizado regressão multinomial)

Mas não importa exatamente como se parametrize, deve-se obter o mesmo , a probabilidade da categoria k condicional em X.P(Y=k|X)

Probabilidades condicionais: multinom ()

Então, primeiro eu calculo essas probabilidades de 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

Como temos um modelo saturado aqui, deve ser o mesmo que podemos calcular a partir dos dados:

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

qual é realmente o caso.

Probabilidades condicionais: glmnet ()

Agora o mesmo da 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

As probabilidades condicionais da célula são um pouco relacionadas, mas diferentes. Também eles não somam um.

Então, temos dois problemas aqui:

a) as probabilidades condicionais não somam 1 e

b) os parâmetros não descrevem o que vemos nos dados: por exemplo, na linha 2 existem diferenças entre as colunas, mas o glmnet estima ambos os coeficientes (não a interceptação) como zero.

Usei um problema de regressão linear e comparei glm e glmnet com s = 0 para garantir que s = 0 significa regularização zero (as soluções eram quase idênticas).

Qualquer ajuda e idéias serão muito apreciadas!

Respostas:


5

Sobre os parâmetros de multinom e glmnet, achei esta resposta benéfica. Posso usar algoritmos glm para fazer uma regressão logística multinomial?

especialmente: "Sim, com um Poisson GLM (modelo linear logarítmico), você pode ajustar modelos multinomiais. Portanto, os modelos logísticos multinomiais ou logísticos lineares Poisson são equivalentes".

Então, mostrarei a reparametrização dos coeficientes glmnet para coeficientes multinom.

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

Espero que isto ajude. Mas acho que não entendo a equivalência entre o Modelo Linear Generalizado (Poisson) e o modelo logístico multinomial.

Diga-me se há uma fonte boa, legível e "facilmente" compreensível.


1
Você tem alguma explicação adicional para "por que" esse é o caso? Ou seja, por que o glance produz coeficientes que são uma combinação dos coeficientes multinomiais mais típicos e dos coeficientes 'base'. Isso nos permite interpretar cada conjunto de coeficientes como um modelo log-linear ?
samplesize1

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.