Адаптивный LASSO используется для последовательного выбора переменных. Проблемы, с которыми мы сталкиваемся при использовании LASSO для выбора переменных:
- Параметр усадки должен быть больше для выбора, чем для прогноза
- Большие ненулевые параметры будут слишком малы, так что смещение будет слишком большим
- Небольшие ненулевые параметры не могут быть обнаружены последовательно
- Высокая корреляция между предикторами приводит к плохой эффективности выбора
Таким образом, LASSO согласуется только для выбора переменной при некоторых условиях по параметру усадки, параметрам (условие бета-минимума) и корреляциям (условие без представления). Смотрите страницы 101-106 моей магистерской диссертации для подробного объяснения.
LASSO часто включает слишком много переменных при выборе параметра настройки для прогнозирования, но истинная модель, скорее всего, является подмножеством этих переменных. Это предполагает использование вторичного этапа оценки, такого как адаптивный LASSO, который управляет смещением оценки LASSO с использованием параметра настройки оптимального прогнозирования. Это приводит к последовательному отбору (или свойству оракула) без условий, упомянутых выше.
Вы можете использовать glmnet для адаптивного LASSO. Сначала вам нужна начальная оценка, либо наименьших квадратов, гребня или даже оценки LASSO, чтобы рассчитать веса. Затем вы можете реализовать адаптивный LASSO, масштабируя X-матрицу. Вот пример, использующий начальные оценки методом наименьших квадратов по данным обучения:
# 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)