Estoy empezando a incursionar con el uso de glmnet
la LASSO regresión donde mi resultado de interés es dicotómica. He creado un pequeño marco de datos simulados a continuación:
age <- c(4, 8, 7, 12, 6, 9, 10, 14, 7)
gender <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow",
"red", "yellow")
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)
Las columnas (variables) en el conjunto de datos anterior son las siguientes:
age
(edad del niño en años) - continuogender
- binario (1 = masculino; 0 = femenino)bmi_p
(Percentil de IMC) - continuom_edu
(nivel de educación más alto de la madre) - ordinal (0 = menos que la escuela secundaria; 1 = diploma de escuela secundaria; 2 = título de bachiller; 3 = título de posgrado)p_edu
(nivel de educación más alto del padre) - ordinal (igual que m_edu)f_color
(color primario favorito) - nominal ("azul", "rojo" o "amarillo")asthma
(estado de asma infantil) - binario (1 = asma; 0 = sin asma)
El objetivo de este ejemplo es hacer uso de LASSO para crear un modelo de predicción de la condición de asma infantil de la lista de 6 posibles variables de predicción ( age
, gender
, bmi_p
, m_edu
, p_edu
, y f_color
). Obviamente, el tamaño de la muestra es un problema aquí, pero espero obtener más información sobre cómo manejar los diferentes tipos de variables (es decir, continua, ordinal, nominal y binaria) dentro del glmnet
marco cuando el resultado es binario (1 = asma ; 0 = sin asma).
Como tal, ¿estaría alguien dispuesto a proporcionar un R
script de muestra junto con explicaciones para este ejemplo simulado usando LASSO con los datos anteriores para predecir el estado del asma? Aunque es muy básico, lo sé, y probablemente muchos otros en CV, ¡lo agradecería enormemente!
fuente
dput
de un real objeto R; ¡no hagas que los lectores pongan glaseado encima ni te horneen un pastel! Si genera el marco de datos apropiado en R, por ejemplofoo
, edite en la pregunta la salida dedput(foo)
.glmnet
en acción con un resultado binario.Respuestas:
Las variables categóricas generalmente se transforman primero en factores, luego se crea una matriz variable variable de predictores y, junto con los predictores continuos, se pasa al modelo. Tenga en cuenta que glmnet usa penalizaciones de cresta y lazo, pero puede configurarse para que sea solo.
Algunos resultados:
Los coeficientes se pueden extraer del glmmod. Aquí se muestra con 3 variables seleccionadas.
Por último, la validación cruzada también se puede utilizar para seleccionar lambda.
fuente
f_color
variable? ¿Se considera que el nivel de factor 1 a 4 es un paso mayor que 1 a 2, o son todos igualmente ponderados, no direccionales y categóricos? (Quiero aplicarlo a un análisis con todos los predictores desordenados)xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]
codifica la variable categórica f_color (como se declaraas.factor
en las líneas anteriores). Debe usar la codificación de variable ficticia R predeterminada, a menoscontrasts.arg
que se proporcione el argumento. Esto significa que todos los niveles de f_color son igualmente ponderados y no direccionales, excepto el primero que se utiliza como clase de referencia y se absorbe en la intersección.model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]
daría el mismo resultado que las dos líneas de arriba? ¿Por qué usar un paso adicional para concatenar las variables continuas condata.frame
?Usaré el paquete enet ya que ese es mi método preferido. Es un poco más flexible.
fuente
elasticnet
; sin embargo, no sé qué hacer con el resultado delR
script anterior . ¿Puedes por favor aclarar? ¡Gracias por adelantado!Solo para ampliar el excelente ejemplo proporcionado por pat. El problema original planteaba variables ordinales (m_edu, p_edu), con un orden inherente entre niveles (0 <1 <2 <3). En la respuesta original de Pat, creo que estas fueron tratadas como variables categóricas nominales sin ningún orden entre ellas. Puedo estar equivocado, pero creo que estas variables deberían codificarse de tal manera que el modelo respete su orden inherente. Si se codifican como factores ordenados (en lugar de factores desordenados como en la respuesta de pat), glmnet da resultados ligeramente diferentes ... Creo que el siguiente código incluye correctamente las variables ordinales como factores ordenados, y proporciona resultados ligeramente diferentes:
fuente