Estoy usando cv.glmnet
para encontrar predictores. La configuración que uso es la siguiente:
lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min
results<-predict(lassoResults,s=bestlambda,type="coefficients")
choicePred<-rownames(results)[which(results !=0)]
Para asegurarse de que los resultados son reproducibles set.seed(1)
. Los resultados son muy variables. Ejecuté exactamente el mismo código 100 para ver qué tan variables fueron los resultados. En las ejecuciones 98/100 siempre se seleccionó un predictor particular (a veces solo); se seleccionaron otros predictores (el coeficiente fue distinto de cero) generalmente 50/100 veces.
Entonces, me dice que cada vez que se ejecuta la validación cruzada, probablemente seleccionará una mejor lambda diferente, porque la aleatorización inicial de los pliegues es importante. Otros han visto este problema ( resultados de CV.glmnet ) pero no hay una solución sugerida.
Estoy pensando que tal vez el que aparece 98/100 probablemente esté muy relacionado con todos los demás. Los resultados no se estabilizan si LOOCV simplemente correr ( ), pero tengo curiosidad por qué son tan variable cuando .nfold < n
fuente
set.seed(1)
una vez corristecv.glmnet()
100 veces? Esa no es una metodología excelente para la reproducibilidad; mejor a laset.seed()
derecha antes de cada ejecución, o bien mantenga los pliegues constantes a lo largo de las ejecuciones. Cada una de sus llamadascv.glmnet()
está llamandosample()
N veces. Entonces, si la longitud de sus datos cambia, la reproductividad cambia.Respuestas:
El punto aquí es que en
cv.glmnet
los pliegues K ("partes") se seleccionan al azar.En la validación cruzada de K-folds, el conjunto de datos se divide en partes, y las partes K - 1 se usan para predecir la parte K-ésima (esto se hace K veces, usando una parte K diferente cada vez). Esto se hace para todas las lambdas, y es la que da el error de validación cruzada más pequeño.K K- 1 K K
lambda.min
Es por eso que cuando usa los resultados no cambian: cada grupo está formado por uno, por lo que no hay muchas opciones para los grupos K.n fo l ds = n K
Del
cv.glmnet()
manual de referencia:MSEs es el marco de datos que contiene todos los errores para todas las lambdas (para las 100 ejecuciones),
lambda.min
es su lambda con un error promedio mínimo.fuente
cv.glmnet(...)$lambda
. Mi alternativa soluciona esto: stats.stackexchange.com/a/173895/19676Luego, para cada predictor obtengo:
De esta manera obtengo una descripción bastante sólida del efecto del predictor. Una vez que tenga distribuciones para los coeficientes, podría ejecutar cualquier cosa estadística que considere valiosa para obtener CI, valores de p, etc ... pero aún no investigé esto.
Este método se puede usar con más o menos cualquier método de selección que se me ocurra.
fuente
Agregaré otra solución, que maneja el error en @ Alice debido a la falta de lambdas, pero no requiere paquetes adicionales como @Max Ghenis. Gracias a todas las otras respuestas: ¡todos hacen puntos útiles!
fuente
La respuesta de Alice funciona bien en la mayoría de los casos, pero a veces se equivoca debido a que a
cv.glmnet$lambda
veces se obtienen resultados de diferente longitud, por ejemplo:OptimLambda
a continuación debería funcionar en el caso general, y también es más rápido al aprovechar elmclapply
procesamiento paralelo y evitar los bucles.fuente
Puede controlar la aleatoriedad si establece explícitamente foldid. Aquí un ejemplo de CV 5 veces
Ahora ejecute cv.glmnet con estos foldids.
Obtendrá los mismos resultados cada vez.
fuente