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 por
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
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 .
El problema de optimización de OLS-Lasso viene dado por
¿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.alpha=1
Ahora tengo los coeficientes beta para los regresores que representan la solución óptima del problema de minimización.
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.
¿Mi comprensión y el código son correctos?
fuente
$\alpha$
se convierte en . Haga esto, ya que hará que las personas puedan comprender su pregunta con mayor facilidad y, por lo tanto, responderla.Respuestas:
De la
glmnet
documentación (?glmnet
), vemos que es posible realizar una contracción diferencial. Esto nos lleva al menos en parte a responder la pregunta de OP.Sin embargo, para responder completamente la pregunta, creo que hay dos enfoques disponibles para usted, dependiendo de lo que quiera lograr.
Su pregunta es cómo aplicar la reducción diferencialλ λ bj ϕjbjCϕj=ϕ ′ j m=C∑ m j = 1 logTϕj=logTT|b∗j| ϕj bj Cϕj=ϕ′j ϕ ′ j ϕjCϕ ′ j λ=1m=C∑mj=1logTT|b∗j| ϕ′j reemplaza 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 .ϕj C ϕ′j λ=1
glmnet
y 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 Tpenalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
La segunda es la forma "estándar" de usok λ λ=0 b λ λ
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 λ λEsaλ λ λ λ
glmnet
llamada 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.glmnet
glmnet
penalty.factor
Este procedimiento optimiza
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ϕj jth λ ϕj λ ϕ λ ϕ λ b λ .
penalty.factor
Esto es básicamente la motivación de la
glmnet
forma 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.fuente
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?glmnet
. Ver mi respuesta revisada.