Estoy intentando utilizar un modelo lineal disperso para mis datos, entrada x(29*50), salida y(29*1). En R, el paquete de glmnet se puede utilizar.
En primer lugar, cv.glmnet() elige lambda y coeficientes (con error mínimo), aquí con el método cv leave-one-out, y luego lo grafica.
cv.fit = cv.glmnet(x,y,family="gaussian",nfolds=29)
plot(cv.fit)
el gráfico de mse frente a log(lambda) en el modelo cv
A continuación, imprime los coeficientes
coef(cv.fit,s="lambda.min")
Matriz dispersa 51 x 1 de clase "dgCMatrix"
1
(Intercepción) 267.7241
cluster_0 .
cluster_1 .
cluster_2 .
cluster_3 .
cluster_4 .
...cluster_47 .
cluster_48 .
cluster_49 .
Por último, para medir la capacidad de predicción del modelo, se calcula la precisión (definida como 1 menos el error absoluto medio dividido por el rango numérico de y)
py <- predict(cv.fit,newx=x,s="lambda.min")
py
V1 267.7241
V2 267.7241
...
v29 267.7241
ave_abs_error <- mean(abs(py-y))
n_range <- max(y)-min(y)
acc <- 1-ave_abs_error/n_range
acc
0.918365
Aunque el acc(0,918365) es muy alto, hay un problema grave. Como se ve en el gráfico anterior, lambda.min es muy grande (73,03439), y todos los coeficientes son cero (sólo con el valor de intercepción 267,7241), todas las predicciones py son las mismas que la intercepción. ¡Eso es realmente extraño!
He buscado en muchos hilos del foro, aquí Un ejemplo: Regresión LASSO con glmnet para resultados binarios explica que no hay un mínimo local por muy pocas observaciones y todos los coeficientes se redujeron a cero con las penalizaciones por contracción.
¿Alguien tiene otras interpretaciones?
Gracias de antemano.
1 votos
He realizado modelos con exactamente este tipo de resultados: un efecto que esperaba que variara de un estado a otro (en EE.UU., incluyendo DC, para un total de 51 "estados") resultó no variar en absoluto según el estado. Una de las muchas formas de comprobar las cosas es volver a ejecutar el modelo utilizando
lm
solo: lo más probable es que todos los coeficientes estimados sean pequeños y la mayoría no sean significativos.0 votos
En primer lugar, trazamos la distribución de y. (¿Es normal? Si no lo es, hay que transformarla con alguna función para que sea suficientemente normal, por ejemplo log, log1p). En segundo lugar, asegúrate de normalizar tus variables x (por ejemplo, utilizando
scale()
).0 votos
Además, nfolds=29 es elegir LOOCV. Puede probar con nfolds más pequeños (3..10), teniendo en cuenta que los coeficientes de cualquier ejecución individual dependerán de la semilla aleatoria y pueden no ser estables. Véase Variabilidad en los resultados de cv.glmnet