LASSO adattivo viene utilizzato per una selezione delle variabili coerente. I problemi che incontriamo quando si utilizza LASSO per la selezione delle variabili sono:
- Il parametro di restringimento deve essere maggiore per la selezione rispetto alla previsione
- I parametri diversi da zero saranno troppo piccoli in modo che il bias sia troppo grande
- Piccoli parametri diversi da zero non possono essere rilevati in modo coerente
- Alte correlazioni tra predittori portano a scarse prestazioni di selezione
Pertanto, il LASSO è coerente solo per la selezione delle variabili in alcune condizioni relative al parametro di restringimento, ai parametri (condizione beta-min) e alle correlazioni (condizione non rappresentabile). Vedi le pagine 101-106 della tesi di laurea magistrale per una spiegazione dettagliata.
LASSO include spesso troppe variabili quando si seleziona il parametro di ottimizzazione per la previsione, ma il modello vero è molto probabilmente un sottoinsieme di queste variabili. Ciò suggerisce l'utilizzo di uno stadio secondario di stima come il LASSO adattivo che controlla la distorsione della stima LASSO utilizzando il parametro di ottimizzazione predittivo-ottimale. Ciò porta a una selezione coerente (o proprietà dell'oracolo) senza le condizioni sopra menzionate.
Puoi usare glmnet per LASSO adattivo. Innanzitutto è necessario una stima iniziale, ovvero minimi quadrati, cresta o persino stime LASSO, per calcolare i pesi. Quindi è possibile implementare LASSO adattivo ridimensionando la matrice X. Ecco un esempio usando le stime iniziali dei minimi quadrati sui dati di allenamento:
# 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)