R - Regresión de lazo - Lambda diferente por regresor

11

Quiero hacer lo siguiente:

1) Regresión OLS (sin término de penalización) para obtener coeficientes beta ; representa las variables utilizadas para la regresión. Hago esto porbjj

lm.model = lm(y~ 0 + x)
betas    = coefficients(lm.model)

2) Regresión de lazo con un término de penalización, los criterios de selección serán los Criterios de Información Bayesianos (BIC), dados por

λj=log(T)T|bj|

donde representa el número de variable / regresor, para el número de observaciones y para las betas iniciales obtenidas en el paso 1). Quiero tener resultados de regresión para este valor específico de , que es diferente para cada regresor utilizado. Por lo tanto, si hay tres variables, habrá tres valores diferentes .jTbjλjλj

El problema de optimización de OLS-Lasso viene dado por

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

¿Cómo puedo hacer esto en R con el paquete lars o glmnet? No puedo encontrar una manera de especificar lambda y no estoy 100% seguro si obtengo los resultados correctos si ejecuto

lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")

Agradezco cualquier ayuda aquí.


Actualizar:

He usado el siguiente código ahora:

fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin    = as.numeric(fits.cv[9]) #lambda.min
fits    = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef    = coef(fits, s = lmin)

En la línea 1 utilizo la validación cruzada con mi factor de penalización especificado ( ), que es diferente para cada regresor . La línea 2 selecciona el "lambda.min" de fits.cv, que es el lambda que proporciona un error medio mínimo de validación cruzada. La línea 3 realiza un ajuste de lazo ( ) en los datos. Nuevamente utilicé el factor de penalización . La línea 4 extrae los coeficientes de los ajustes que pertenecen al "óptimo" elegido en la línea 2.λj=log(T)T|bj|alpha=1λλ

Ahora tengo los coeficientes beta para los regresores que representan la solución óptima del problema de minimización.

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

con un factor de penalización . El conjunto óptimo de coeficientes es probablemente un subconjunto de los regresores que utilicé inicialmente, esto es una consecuencia del método Lasso que reduce el número de regresores utilizados.λj=log(T)T|bj|

¿Mi comprensión y el código son correctos?

Dom
fuente
2
Puede usar el marcado LATEX en su publicación, encerrado en signos de dólar. $\alpha$se convierte en . Haga esto, ya que hará que las personas puedan comprender su pregunta con mayor facilidad y, por lo tanto, responderla. α
Sycorax dice Reinstate Monica

Respuestas:

15

De la glmnetdocumentación ( ?glmnet), vemos que es posible realizar una contracción diferencial. Esto nos lleva al menos en parte a responder la pregunta de OP.

penalty.factor: Se pueden aplicar factores de penalización separados a cada coeficiente. Este es un número que se multiplica lambdapara permitir la contracción diferencial. Puede ser 0 para algunas variables, lo que implica que no hay contracción, y esa variable siempre se incluye en el modelo. El valor predeterminado es 1 para todas las variables (e implícitamente infinito para las variables enumeradas en exclude). Nota: los factores de penalización se reescalan internamente para sumar nvars, y la lambdasecuencia reflejará este cambio.

Sin embargo, para responder completamente la pregunta, creo que hay dos enfoques disponibles para usted, dependiendo de lo que quiera lograr.

  1. Su pregunta es cómo aplicar la reducción diferencial glmnety recuperar los coeficientes para un valor específico . Al suministrar st, algunos valores no son 1 logra una contracción diferencial en cualquier valor de . Para lograr la contracción st la contracción para cada es , solo tenemos que hacer algo de álgebra. Sea el factor de penalización para , a lo que se suministraría . A partir de la documentación, podemos ver que estos valores se reescalan por un factor de st . Esto significa queλ b j ϕ j = log Tλpenalty.factorλbjϕjbjCϕj=ϕj m=C m j = 1 logTϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjϕj ϕjCϕj λ=1m=Cj=1mlogTT|bj|ϕjreemplaza en la siguiente expresión de optimización. Entonces resuelva para , proporcione los valores to y luego extraiga los coeficientes para . Yo recomendaría usar .ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. La segunda es la forma "estándar" de uso glmnet: se realiza una validación cruzada repetida en para seleccionar modo que se minimice el MSE fuera de la muestra. Esto es lo que describo a continuación con más detalle. La razón por la que usamos CV y ​​verificamos MSE fuera de la muestra es porque el MSE dentro de la muestra siempre se minimizará para , es decir, es un MLE ordinario. El uso de CV mientras se varía nos permite estimar el rendimiento del modelo en datos fuera de muestra y seleccionar un que sea óptimo (en un sentido específico).λ λ = 0 b λ λkλλ=0bλλ

Esa glmnetllamada no especifica un (ni debería hacerlo, porque calcula toda la trayectoria por defecto por razones de rendimiento). devolverá los coeficientes para el valor . Pero no importa la elección de que proporcione, el resultado reflejará la penalización diferencial que aplicó en la llamada para ajustarse al modelo.λ λ λλλcoef(fits,s=something)λsomethingλ

La forma estándar de seleccionar un valor óptimo de es usar , en lugar de . La validación cruzada se utiliza para seleccionar la cantidad de contracción que minimiza el error fuera de la muestra, mientras que la especificación de reducirá algunas características más que otras, de acuerdo con su esquema de ponderación.λcv.glmnetglmnetpenalty.factor

Este procedimiento optimiza

minbRmt=1T(ytbXt)2+λj=1m(ϕj|bj|)

donde es el factor de penalización para la característica (lo que proporciona en el argumento). (Esto es ligeramente diferente de su expresión de optimización; tenga en cuenta que algunos de los subíndices son diferentes). Tenga en cuenta que el término es el mismo en todas las características, por lo que la única forma en que algunas características se reducen más que otras es a través de . Es importante destacar que y no son lo mismo; es escalar y es un vector! En esta expresión, es fijo / se supone conocido; es decir, la optimización elegirá la óptima , no la óptimaϕjjthpenalty.factorλϕjλϕλϕλbλ.

Esto es básicamente la motivación de la glmnetforma en que la entiendo: usar la regresión penalizada para estimar un modelo de regresión que no sea demasiado optimista sobre su desempeño fuera de la muestra. Si este es su objetivo, quizás este sea el método adecuado para usted después de todo.

Sycorax dice reinstalar a Mónica
fuente
+1 Esto es correcto. También agregaré que la regularización de la regresión puede verse como un previo bayesiano, es decir, el máximo a posteriori (MAP) es la probabilidad máxima (ML) regularizada. Trabajar en ese marco se da más flexibilidad en la regularización si fuera necesario.
TLJ
Si ejecuto, pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) ¿cómo extraigo las betas regresoras que corresponden a la lambda que especifiqué, ya que la lambda es diferente para cada factor de riesgo?
Dom
1
@Dom Me di cuenta demasiado tarde que hay una manera obvia de obtener exactamente lo que quieres usar glmnet. Ver mi respuesta revisada.
Sycorax dice Reinstate Monica
2
Tenga cuidado de personalizar la penalización por separado para cada predictor. Eso equivaldría a nada más que la selección de variables paso a paso en algunos casos. La regresión penalizada disminuye el error cuadrático medio al suponer un número muy limitado de parámetros de penalización e información de préstamo entre predictores.
Frank Harrell
2
@FrankHarrell Gracias por el comentario! Parece que usar diferentes penalizaciones para cada predictor equivale a un modelo bayesiano que asume un previo diferente para cada parámetro. Eso no me parece que represente un peligro único sobre la inferencia bayesiana en general. Además, ¿podría explicar cómo la regresión penalizada toma prestada información entre los predictores? No estoy seguro de comprender completamente cómo es ese el caso en tal escenario.
Sycorax dice Reinstate Monica