LASSO adaptatif est utilisé pour une sélection de variables cohérente. Les problèmes que nous rencontrons lors de l'utilisation de LASSO pour la sélection de variables sont:
- Le paramètre de rétrécissement doit être plus grand pour la sélection que pour la prédiction
- Les grands paramètres non nuls seront trop petits pour que le biais soit trop grand
- Les petits paramètres non nuls ne peuvent pas être détectés de manière cohérente
- Des corrélations élevées entre les prédicteurs conduisent à de mauvaises performances de sélection
Ainsi, le LASSO n'est cohérent pour la sélection des variables que dans certaines conditions sur le paramètre de rétrécissement, les paramètres (condition bêta-min) et les corrélations (condition irreprésentable). Voir les pages 101-106 de ma thèse de maîtrise pour une explication détaillée.
Le LASSO comprend souvent trop de variables lors de la sélection du paramètre de réglage pour la prédiction, mais le vrai modèle est très probablement un sous-ensemble de ces variables. Cela suggère d'utiliser une étape secondaire d'estimation comme le LASSO adaptatif qui contrôle le biais de l'estimation LASSO en utilisant le paramètre de réglage optimal de la prédiction. Cela conduit à une sélection cohérente (ou propriété oracle) sans les conditions mentionnées ci-dessus.
Vous pouvez utiliser glmnet pour LASSO adaptatif. Tout d'abord, vous avez besoin d'une estimation initiale, soit des moindres carrés, des crêtes ou même des estimations LASSO, pour calculer les poids. Ensuite, vous pouvez implémenter LASSO adaptatif en mettant à l'échelle la matrice X. Voici un exemple utilisant les estimations initiales des moindres carrés sur les données d'entraînement:
# 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)