Processing math: 6%

12 votos

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

Quiero hacer lo siguiente:

1) regresión por MCO (sin penalización plazo) para obtener los coeficientes beta bj; j representa las variables utilizadas para la regresión. Hago esto por

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

2) Lazo de regresión con una penalización término, el criterio de selección será el Criterio de Información Bayesiano (BIC), dada por

λj=log(T)T|bj|

where j stands for the variable/regressor number, T for the number of observations, and b_{j}^{*} for the initial betas obtained in step 1). I want to have regression results for this specific \lambda_j value, which is different for each regressor used. Hence if there are three variables, there will be three different values \lambda_j.

The OLS-Lasso optimization problem is then given by

\underset{b\epsilon \mathbb{R}^{n} }{min} = \left \{ \sum_{t=1}^{T}(y_{t}-b^{\top} X_{t} )^{2} + T\sum_{j=1}^{m} ( \lambda_{t}|b_{j}| )\right \}

How can I do this in R with either the lars or glmnet package? I cannot find a way to specify lambda and I am not 100% sure if I get the correct results if I run

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

I appreciate any help here.


Update:

I have used the following code now:

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)

In line 1 I use cross validation with my specified penalty factor (\lambda _{j} = \frac{\log (T)}{T|b_{j}^{*}|}), que es diferente para cada regresor. La línea 2, se selecciona el "lambda.min" de ajuste.cv, que es la expresión lambda que da a los medios mínimos de validación cruzada de error. La línea 3 se realiza un lazo de ajuste (alpha=1) en los datos. De nuevo he utilizado el factor de penalización \lambda. Línea 4 extractos de los coeficientes de adapta a las cuales pertenecen a la "óptima" \lambda elegido en la línea 2.

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

\underset{b\epsilon \mathbb{R}^{n} }{min} = \left \{ \sum_{t=1}^{T}(y_{t}-b^{\top} X_{t} )^{2} + T\sum_{j=1}^{m} ( \lambda_{t}|b_{j}| )\right \}

with a penalty factor \lambda _{j} = \frac{\log (T)}{T|b_{j}^{*}|}. El conjunto óptimo de los coeficientes es más probable que un subconjunto de los regresores que yo inicialmente utilizado, esto es una consecuencia del método de Lazo que se contrae el número de regresores.

Es mi entendimiento y el código correcto?

15voto

user777 Puntos 10934

De la glmnet documentación (?glmnet), vemos que es posible realizar el diferencial de la contracción. Esto nos lleva al menos parte del camino para responder OP pregunta.

penalty.factor: Aparte de la pena de factores que pueden aplicarse a cada coeficiente. Este es un número que se multiplica lambda a permitir diferencial de la contracción. Puede ser 0 para algunas variables, lo que implica que no se encoge, y que esta variable está siempre incluido en el modelo. El valor predeterminado es 1 para todas las variables (e implícitamente la infinidad de variables enumeradas en exclude). Nota: la pena de factores internos ajustaron a la suma de nvars, y el lambda secuencia de reflejar este cambio.

Completamente de responder a la pregunta, sin embargo, creo que hay dos métodos disponibles para usted, dependiendo de lo que usted quiere lograr.

  1. Su pregunta es cómo aplicar el diferencial de reducción en glmnet y recuperar los coeficientes para un determinado valor de \lambda. Suministrar penalty.factor s.t. algunos valores no son 1 alcanza diferencial de la contracción en cualquier valor de \lambda. Para lograr la contracción de s.t. la contracción de cada una de las b_j\phi_j= \frac{\log T}{T|b_j^*|}, sólo tenemos que hacer algo de álgebra. Deje \phi_j ser el factor de penalización para b_j, lo que sería suministrada a penalty.factor. A partir de la documentación, podemos ver que estos valores son re-escalado por un factor de C\phi_j=\phi^\prime_j s.t. m=C\sum_{j=1}^m \frac{\log T}{T|b^*_j|}. Esto significa que \phi_j^\prime reemplaza \phi_j en el debajo de la optimización de la expresión. Para resolver para C, el suministro de los valores de \phi_j^\prime a glmnet, y, a continuación, extraer los coeficientes de \lambda=1. Me gustaría recomendar el uso de coef(model, s=1, exact=T).

  2. El segundo es el "estándar" de la forma de uso glmnet: Uno realiza repetidas k-fold cross-validation para seleccionar \lambda de manera tal que se minimice fuera de la muestra de MSE. Esto es lo que yo describo a continuación en más detalle. La razón por la que el uso del CV y check out-of-sample MSE es debido a que en la muestra de MSE siempre va a ser minimizados por \lambda=0, es decir, b es una corriente MLE. Mediante CV mientras que la variable \lambda nos permite estimar cómo el modelo se realiza por fuera de la muestra de datos y seleccione un \lambda que es óptimo (en un sentido específico).

Que glmnet convocatoria no especifica un \lambda (ni debe, porque se calcula la totalidad de la \lambda trayectoria por defecto por razones de rendimiento). coef(fits,s=something) devolverá los coeficientes de las \lambda valor something. Pero no importa la elección de \lambda, resultado que refleja el diferencial de la sanción que se aplica en la llamada para ajustar el modelo.

La manera estándar para seleccionar un valor óptimo de \lambda es para uso cv.glmnet, en lugar de glmnet. La validación cruzada se utiliza para seleccionar la cantidad de contracción, lo cual minimiza el fuera-de-error de muestreo, mientras que la especificación de penalty.factor reducen algunas características más que otros, de acuerdo a su sistema de ponderación.

Este procedimiento se optimiza

\underset{b\in \mathbb{R}^{m} }{\min} = \left \{ \sum_{t=1}^{T}(y_{t}-b^{\top} X_{t} )^{2} + \lambda \sum_{j=1}^{m} ( \phi_{j}|b_{j}| )\right \}

where \phi_j is the penalty factor for the j^{th} feature (what you supply in the penalty.factor argument). (This is slightly different from your optimization expression; note that some of the subscripts are different.) Note that the \lambda term is the same across all features, so the only way that some features are shrunk more than others is through \phi_j. Importantly, \lambda and \phi are not the same; \lambda is scalar and \phi is a vector! In this expression, \lambda is fixed/assumed known; that is, optimization will pick the optimal b, not the optimal \lambda.

Esta es básicamente la motivación de glmnet como yo lo entiendo: para utilizar penalizado de regresión para estimar un modelo de regresión que no es demasiado optimista acerca de su rendimiento de ejemplo. Si este es tu objetivo, tal vez este es el método adecuado para usted, después de todo.

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