Estoy usando glmnet para calcular las estimaciones de regresión de crestas. Obtuve algunos resultados que me hicieron sospechar que glmnet realmente está haciendo lo que creo que hace. Para verificar esto, escribí un script R simple donde comparo el resultado de la regresión de cresta realizada por resolver y el de glmnet, la diferencia es significativa:
n <- 1000
p. <- 100
X. <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)
beta1 <- solve(t(X)%*%X+5*diag(p),t(X)%*%Y)
beta2 <- glmnet(X,Y, alpha=0, lambda=10, intercept=FALSE, standardize=FALSE,
family="gaussian")$beta@x
beta1-beta2
La norma de la diferencia es generalmente alrededor de 20, lo que no puede deberse a algoritmos numéricamente diferentes, debo estar haciendo algo mal. ¿Cuáles son las configuraciones que tengo que configurar glmnet
para obtener el mismo resultado que con la cresta?
r
ridge-regression
glmnet
John
fuente
fuente
Respuestas:
La diferencia que está observando se debe a la división adicional por el número de observaciones, N, que GLMNET utiliza en su función objetivo y la estandarización implícita de Y por su desviación estándar de muestra como se muestra a continuación.
donde usamos en lugar de para , 1 / ( n - 1 ) s y s y = ∑ i ( y i - ˉ y ) 21 / n 1 / ( n - 1 ) sy
Al diferenciar con respecto a beta, establecer la ecuación a cero,
Y resolviendo para beta, obtenemos la estimación,
Para recuperar las estimaciones (y sus penalizaciones correspondientes) en la métrica original de Y, GLMNET multiplica tanto las estimaciones como las lambdas por y devuelve estos resultados al usuario,sy
lambda u n s t d . = s y λ
Compare esta solución con la derivación estándar de regresión de cresta.
Tenga en cuenta que se escala por un factor adicional de N. Además, cuando usamos la función o , la penalización se escalará implícitamente por . Es decir, cuando usamos estas funciones para obtener las estimaciones de coeficientes para algunos , estamos efectivamente obteniendo estimaciones para .1 / s y λ ∗ λ = λ ∗ / s yλ 1 / sy λ∗ λ = λ∗/ sy
predict()
coef()
Basándose en estas observaciones, la pena utilizado en GLMNET necesita ser reducido por un factor de .sy/ N
Los resultados generalizan a la inclusión de una intercepción y variables X estandarizadas. Modificamos una matriz X estandarizada para incluir una columna de unos y la matriz diagonal para tener una entrada cero adicional en la posición [1,1] (es decir, no penalizar la intersección). A continuación, puede desestandarizar las estimaciones por sus respectivas desviaciones estándar de muestra (nuevamente asegúrese de estar usando 1 / n al calcular la desviación estándar).
Código agregado para mostrar X estandarizado sin intercepción:
fuente
De acuerdo con https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html , cuando la familia está
gaussian
,glmnet()
debe minimizarCuando se usaX λ
glmnet(x, y, alpha=1)
para ajustar el lazo con las columnas en estandarizadas, la solución para la penalización reportada es la solución para minimizar Sin embargo, al menos en , cuando se usa para ajustar la regresión de cresta, la solución para una penalización reportada es la solución para minimizar donde es la desviación estándar de . Aquí, la penalización debería haberse informado como .glmnet_2.0-13
glmnet(x, y, alpha=0)
Lo que podría suceder es que la función primero estandariza a y luego minimiza que efectivamente es minimizar o equivalente, para minimizary y0 0
Para el lazo ( ), volver a escalar para informar la penalización como tiene sentido. Entonces, para todos , debe ser reportado como la penalización para mantener la continuidad de los resultados en . Esta es probablemente la causa del problema anterior. Esto se debe en parte al uso de (2) para resolver (1). Solo cuando o existe cierta equivalencia entre los problemas (1) y (2) (es decir, una correspondencia entre en (1) y en (2)). Para cualquier otroα = 1 η ηsy α ηsy α α = 0 α = 1 λ η α ∈ ( 0 , 1 ) , los problemas (1) y (2) son dos problemas de optimización diferentes, y no hay correspondencia uno a uno entre en (1) y en (2).λ η
fuente