LASSO adaptativo se utiliza para la selección de variables consistentes. Los problemas que encontramos al usar LASSO para la selección de variables son:
- El parámetro de contracción debe ser mayor para la selección que para la predicción.
- Los parámetros grandes distintos de cero serán demasiado pequeños para que el sesgo sea demasiado grande
- Los parámetros pequeños distintos de cero no se pueden detectar de forma coherente
- Las altas correlaciones entre predictores conducen a un bajo rendimiento de selección
Por lo tanto, el LASSO solo es consistente para la selección de variables bajo algunas condiciones en el parámetro de contracción, parámetros (condición beta-min) y correlaciones (condición irrepresentable). Consulte las páginas 101-106 de mi disertación de maestría para obtener una explicación detallada.
El LASSO a menudo incluye demasiadas variables al seleccionar el parámetro de ajuste para la predicción, pero es muy probable que el modelo verdadero sea un subconjunto de estas variables. Esto sugiere utilizar una etapa secundaria de estimación como el LASSO adaptativo que controla el sesgo de la estimación LASSO utilizando el parámetro de ajuste óptimo de predicción. Esto lleva a una selección consistente (o propiedad de oráculo) sin las condiciones mencionadas anteriormente.
Puede usar glmnet para LASSO adaptativo. Primero necesita una estimación inicial, ya sea mínimos cuadrados, cresta o incluso estimaciones LASSO, para calcular los pesos. Luego puede implementar LASSO adaptativo escalando la matriz X. Aquí hay un ejemplo usando estimaciones iniciales de mínimos cuadrados en los datos de entrenamiento:
# get data
y <- train[, 11]
x <- train[, -11]
x <- as.matrix(x)
n <- nrow(x)
# standardize data
ymean <- mean(y)
y <- y-mean(y)
xmean <- colMeans(x)
xnorm <- sqrt(n-1)*apply(x,2,sd)
x <- scale(x, center = xmean, scale = xnorm)
# fit ols
lm.fit <- lm(y ~ x)
beta.init <- coef(lm.fit)[-1] # exclude 0 intercept
# calculate weights
w <- abs(beta.init)
x2 <- scale(x, center=FALSE, scale=1/w)
# fit adaptive lasso
require(glmnet)
lasso.fit <- cv.glmnet(x2, y, family = "gaussian", alpha = 1, standardize = FALSE, nfolds = 10)
beta <- predict(lasso.fit, x2, type="coefficients", s="lambda.min")[-1]
# calculate estimates
beta <- beta * w / xnorm # back to original scale
beta <- matrix(beta, nrow=1)
xmean <- matrix(xmean, nrow=10)
b0 <- apply(beta, 1, function(a) ymean - a %*% xmean) # intercept
coef <- cbind(b0, beta)