45 votos

Cómo interpretar glmnet?

Estoy tratando de ajustar un modelo de regresión lineal multivariado con aproximadamente 60 variables predictoras y el 30 de observaciones, así que estoy usando el glmnet paquete para la regularización de la regresión debido a que p>n.

He estado yendo a través de la documentación y otras cuestiones, pero todavía no puedo interpretar los resultados, aquí se muestra un ejemplo de código (con 20 predictores y 10 observaciones para simplificar):

Puedo crear una matriz x con num filas = num observaciones y num cols = num predictores y un vector y que representa la variable de respuesta

> x=matrix(rnorm(10*20),10,20)
> y=rnorm(10)

Me cabe una glmnet modelo de salir de alfa como por defecto (= 1 para el lazo de pena)

> fit1=glmnet(x,y)
> print(fit1)

Entiendo que puedo obtener diferentes predicciones con la disminución de los valores de lambda (es decir, de penalti)

Call:  glmnet(x = x, y = y) 

        Df    %Dev   Lambda
  [1,]  0 0.00000 0.890700
  [2,]  1 0.06159 0.850200
  [3,]  1 0.11770 0.811500
  [4,]  1 0.16880 0.774600
   .
   .
   .
  [96,] 10 0.99740 0.010730
  [97,] 10 0.99760 0.010240
  [98,] 10 0.99780 0.009775
  [99,] 10 0.99800 0.009331
 [100,] 10 0.99820 0.008907

Ahora puedo predecir mi Beta valores de elegir, por ejemplo, el más pequeño lambda valor de glmnet

> predict(fit1,type="coef", s = 0.008907)

21 x 1 sparse Matrix of class "dgCMatrix"
                  1
(Intercept) -0.08872364
V1           0.23734885
V2          -0.35472137
V3          -0.08088463
V4           .         
V5           .         
V6           .         
V7           0.31127123
V8           .         
V9           .         
V10          .         
V11          0.10636867
V12          .         
V13         -0.20328200
V14         -0.77717745
V15          .         
V16         -0.25924281
V17          .         
V18          .         
V19         -0.57989929
V20         -0.22522859

Si, en cambio, puedo elegir lambda con

cv <- cv.glmnet(x,y)
model=glmnet(x,y,lambda=cv$lambda.min)

Todas las variables sería (.).

Dudas y preguntas:

  1. No estoy seguro acerca de cómo elegir lambda.
  2. Debo usar el no (.) variables para adaptarse a otro modelo? En mi caso me gustaría tener tanto variables como sea posible.
  3. ¿Cómo puedo saber el valor de p, es decir, que las variables significativamente a predecir la respuesta?

Pido disculpas por mi pobre conocimiento estadístico! Y gracias por cualquier ayuda.

50voto

Ben Ogorek Puntos 1040

Aquí es un poco intuitivo hecho - en realidad, no se supone que para dar glmnet un único valor de lambda. A partir de la página 9 de la documentación aquí:

No se proporciona un valor único para lambda (para las predicciones después de CV el uso de predecir (en su lugar). La oferta en lugar de una disminución de la secuencia de valores de lambda. glmnet se basa en su calienta comienza por la velocidad, y a menudo es más rápido para adaptarse a una ruta de acceso completa de calcular un solo ajuste.

cv.glmnet le ayudará a elegir lambda, como usted se refirió en sus ejemplos. Los autores de la glmnet paquete sugieren cv$lambda.1se en lugar de cv$lambda.min, pero en la práctica he tenido éxito con el último.

Después de la ejecución de cv.glmnet, usted no tiene que volver a ejecutar glmnet! Cada lambda en la cuadrícula (cv$lambda) ya se ha ejecutado. Es rápido porque utiliza el warm up principio.

Para extraer la carrera deseada de cv.glmnet.fit, intente esto:

small.lambda.index <- which(cv$lambda == cv$lambda.min)
small.lambda.betas <- cv$glmnet.fit$beta[,small.lambda.index]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X