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 $b_{j}^{*}$; $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

$$\lambda _{j} = \frac{\log (T)}{T|b_{j}^{*}|}$$

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