O LASSO adaptável é usado para seleção consistente de variáveis. Os problemas que encontramos ao usar o LASSO para seleção de variáveis são:
- O parâmetro de encolhimento deve ser maior para seleção que para previsão
- Parâmetros diferentes de zero grandes serão muito pequenos para que o viés seja muito grande
- Parâmetros diferentes de zero pequenos não podem ser detectados consistentemente
- Altas correlações entre preditores levam a um desempenho ruim na seleção
Assim, o LASSO é consistente apenas para a seleção de variáveis sob algumas condições no parâmetro de encolhimento, parâmetros (condição beta-min) e correlações (condição irrepresentável). Veja as páginas 101-106 da minha dissertação de mestrado para uma explicação detalhada.
O LASSO geralmente inclui muitas variáveis ao selecionar o parâmetro de ajuste para previsão, mas o modelo verdadeiro provavelmente é um subconjunto dessas variáveis. Isso sugere o uso de um estágio secundário de estimativa, como o LASSO adaptável, que controla o viés da estimativa do LASSO usando o parâmetro de ajuste ideal de previsão. Isso leva a uma seleção consistente (ou propriedade do oracle) sem as condições mencionadas acima.
Você pode usar o glmnet para o LASSO adaptável. Primeiro, você precisa de uma estimativa inicial, pelo menos quadrados, cume ou mesmo estimativas LASSO, para calcular pesos. Então você pode implementar o LASSO adaptável escalando a matriz X. Aqui está um exemplo usando estimativas iniciais de mínimos quadrados em dados de treinamento:
# 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)