Agrupar variables categóricas en glmnet

8

Considere el siguiente ajuste:

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

¿Cómo indico qué columnas xson categóricas / multinomiales? ¿Existe una opción para especificar el índice de las variables agrupadas?

La documentación describe la opción de la type.multinomialsiguiente manera:

Si está "agrupado", se utiliza una penalización de lazo agrupada en los coeficientes multinomiales para una variable. Esto asegura que todos estén juntos en nuestra salida. El valor predeterminado es "desagrupado".

James
fuente

Respuestas:

13

Los dos primeros argumentos que glmnet()se esperan son una matriz de predictores ( xen su caso) y un vector de la respuesta ( g4en su caso). Para la xmatriz, se espera que ya haya anulado las variables categóricas. En otras palabras, en glmnet()realidad no sabe si alguno de sus predictores son categóricos, porque ya se han anulado.

Si sus datos están en un marco de datos, una buena manera de construir la xmatriz es utilizando la model.matrix()función. Acepta lenguaje de fórmulas, excluirá automáticamente la variable de respuesta y creará variables ficticias para cualquier predictor definido como factor.

Las opciones family="multinomial"y se type.multinomial="grouped"refieren a la variable de respuesta que tiene más de 2 resultados posibles. Puede pasar la variable de respuesta ( g4) como factor.

Los autores del paquete proporcionan una bonita viñeta que explica el uso de glmnet(), aunque desafortunadamente no da un ejemplo model.matrix()para preparar la xmatriz.

Kevin Markham
fuente
1
Un poco tarde para la fiesta, pero solo para notar que otra buena introducción a glmnet, junto con un ejemplo usando model.matrix, se da en Una Introducción al Aprendizaje Estadístico. www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
owen88
12

Como señala justmarkham, puede construir la matriz de diseño xutilizando model.matrix. Tenga en cuenta que querrá excluir la intercepción, ya que glmnet incluye una por defecto. También es posible que desee cambiar la función de contraste predeterminada, que por omisión omite un nivel de cada factor (codificación de tratamiento). Pero debido a la penalización del lazo, esto ya no es necesario para la identificabilidad, y de hecho hace que la interpretación de las variables seleccionadas sea más complicada. Para hacer esto, establezca

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

Ahora, cualquiera que sea el nivel de un factor seleccionado, puede pensar que sugiere que estos niveles específicos son importantes, en comparación con todos los niveles omitidos. En el aprendizaje automático, he visto que esta codificación se conoce como codificación de uno en caliente.

Suponiendo que g4tiene Kniveles, la type.multinomial="grouped"opción especifica que todas las características de xentrarán en el modelo simultáneamente para cada uno de los Kpredictores lineales, en lugar de tener el predictor lineal para cada clase (en general) que tenga sus propias características. glmnetno es compatible (¿actualmente?) con penalizaciones de predictores (la xmatriz) de tipo agrupado . El paquete grplassosí, pero está escrito en R puro, por lo que es más lento que glmnet, pero podría intentarlo.

Andrew M
fuente
¿Quizás podría explicar esto un poco diferente? O (más precisamente) tal vez podría dar una idea a mi pregunta relacionada: stats.stackexchange.com/questions/238623/...
theforestecologist
Hola @AndrewM, model.matrixno excluye ningún nivel de la primera variable categórica cuando omitimos la intercepción. ¿Debería la matriz de diseño ser una entrada glmnetindependientemente? ¿Y cómo interpretamos el nivel no omitido de la primera variable categórica en la regresión de lazo?
Goldman Clarck