No creo que hayas cometido un error en el código. Se trata de interpretar la salida.
El lazo no indica qué regresores individuales son "más predictivos" que otros. Simplemente tiene una tendencia incorporada a estimar coeficientes como cero. Cuanto mayor es el coeficiente de penalización , mayor es esa tendencia.Iniciar sesión( λ )
Su gráfica de validación cruzada muestra que a medida que más y más coeficientes se fuerzan a cero, el modelo hace un mejor y mejor trabajo al predecir subconjuntos de valores que se han eliminado al azar del conjunto de datos. Cuando se logran los mejores errores de predicción con validación cruzada (medidos como la "Desviación Binomial" aquí) cuando todos los coeficientes son cero, debe sospechar que ninguna combinación lineal de ningún subconjunto de regresores puede ser útil para predecir los resultados.
Puede verificar esto generando respuestas aleatorias que sean independientes de todos los regresores y aplicando su procedimiento de ajuste. Aquí hay una forma rápida de emular su conjunto de datos:
n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
dimnames=list(1:n, c("y", paste0("x", 1:k)))))
El marco de datos X
tiene una columna binaria aleatoria llamada "y" y otras 338 columnas binarias (cuyos nombres no importan). Utilicé su enfoque para hacer retroceder "y" contra esas variables, pero, solo para tener cuidado, me aseguré de que el vector de respuesta y
y la matriz del modelo x
coincidan (lo que podrían no hacer en caso de que falten valores en los datos) :
f <- y ~ . - 1 # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")
El resultado es notablemente como el tuyo:
plot(fit)
De hecho, con estos datos completamente aleatorios, el Lazo aún devuelve nueve estimaciones de coeficientes distintos de cero (aunque sabemos, por construcción, que los valores correctos son todos cero). Pero no debemos esperar la perfección. Además, debido a que el ajuste se basa en la eliminación aleatoria de subconjuntos de datos para la validación cruzada, generalmente no obtendrá el mismo resultado de una ejecución a la siguiente. En este ejemplo, una segunda llamada a cv.glmnet
produce un ajuste con un solo coeficiente distinto de cero. Por esta razón, si tiene tiempo, siempre es una buena idea volver a ejecutar el procedimiento de ajuste varias veces y realizar un seguimiento de qué coeficientes estimados son consistentemente distintos de cero. Para estos datos, con cientos de regresores, esto llevará un par de minutos repetir nueve veces más.
sim <- cbind(as.numeric(coef(fit)),
replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025),
xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
main="Results of Repeated Cross-Validated Lasso Fits")
Ocho de estos regresores tienen estimaciones distintas de cero en aproximadamente la mitad de los ajustes; el resto de ellos nunca tienen estimaciones distintas de cero. Esto muestra en qué medida el Lazo aún incluirá estimaciones de coeficientes distintos de cero, incluso cuando los coeficientes sean verdaderamente cero.