Agrupar variáveis ​​categóricas no glmnet

8

Considere o seguinte ajuste:

fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")

Como indico quais colunas xsão categóricas / multinomiais? Existe uma opção para especificar o índice das variáveis ​​agrupadas?

A documentação descreve a opção da type.multinomialseguinte maneira:

Se "agrupado", uma penalidade de laço agrupado é usada nos coeficientes multinomiais para uma variável. Isso garante que eles estejam todos juntos. O padrão é "desagrupado".

James
fonte

Respostas:

13

Os dois primeiros argumentos que glmnet()se espera são uma matriz dos preditores ( xno seu caso) e um vetor da resposta ( g4no seu caso). Para a xmatriz, espera-se que você já tenha enganado as variáveis ​​categóricas. Em outras palavras, glmnet()na verdade não sabe se algum de seus preditores é categórico, porque eles já foram enganados.

Se seus dados estiverem em um quadro de dados, uma boa maneira de construir a xmatriz é usar a model.matrix()função Ele aceita a linguagem da fórmula, exclui automaticamente a variável de resposta e cria variáveis ​​fictícias para quaisquer preditores definidos como fatores.

As opções family="multinomial"e se type.multinomial="grouped"referem à variável de resposta que possui mais de 2 resultados possíveis. Você pode passar a variável de resposta ( g4) como um fator.

Os autores do pacote fornecem uma boa vinheta explicando o uso de glmnet(), embora, infelizmente, não dê um exemplo model.matrix()para preparar a xmatriz.

Kevin Markham
fonte
1
Um pouco atrasado para a festa, mas apenas para observar que outra boa introdução ao glmnet, junto com um exemplo usando model.matrix, é dada em Uma introdução ao aprendizado estatístico. Para obter mais
informações
12

Como justmarkham aponta, você pode construir a matriz de design xusando model.matrix. Observe que você deseja excluir a interceptação, pois o glmnet inclui uma por padrão. Você também pode alterar a função de contraste padrão, que, por padrão, deixa de fora um nível de cada fator (codificação do tratamento). Porém, devido à penalidade no laço, isso não é mais necessário para a identificabilidade e, de fato, torna a interpretação das variáveis ​​selecionadas mais complicada. Para fazer isso, defina

contr.Dummy <- function(contrasts, ...){
   conT <- contr.treatment(contrasts=FALSE, ...)
   conT
}
options(contrasts=c(ordered='contr.Dummy', unordered='contr.Dummy'))

Agora, quaisquer que sejam os níveis de um fator selecionados, você pode pensar nisso como sugerindo que esses níveis específicos são importantes, versus todos os níveis omitidos. No aprendizado de máquina, eu vi essa codificação conhecida como codificação one-hot.

Assumindo que g4tem Kníveis, os type.multinomial="grouped"especifica de opção que as características de xvai todos, insira o modelo simultaneamente para cada um dos Kpreditores lineares, em oposição a ter o preditor linear para cada classe (em geral) que têm as suas próprias características. glmnet(atualmente?) não suporta penalidades de tipo agrupado de preditores (a xmatriz). O pacote grplassosim, mas está escrito em R puro, então é mais lento que glmnet, mas você pode tentar.

Andrew M
fonte
Você poderia explicar isso de maneira um pouco diferente? Ou (mais ao ponto) talvez você poderia fornecer informações à minha pergunta relacionada: stats.stackexchange.com/questions/238623/...
theforestecologist
Olá @AndrewM, model.matrixnão exclui nenhum nível da primeira variável categórica quando omitimos a interceptação. A matriz de design deve ser uma entrada glmnetindependentemente? e como interpretamos o nível não comprometido da primeira variável categórica na regressão do laço?
Goldman Clarck