Adaptives LASSO wird zur konsistenten Variablenauswahl verwendet. Die Probleme, die bei der Verwendung des LASSO für die Variablenauswahl auftreten, sind:
- Der Schrumpfungsparameter muss zur Auswahl größer sein als die Vorhersage
- Große Parameter ungleich Null sind zu klein, so dass die Vorspannung zu groß ist
- Kleine Parameter ungleich Null können nicht konsistent erkannt werden
- Hohe Korrelationen zwischen Prädiktoren führen zu einer schlechten Auswahlleistung
Daher ist der LASSO nur für die Variablenauswahl unter bestimmten Bedingungen hinsichtlich des Schrumpfungsparameters, der Parameter (Beta-Min-Bedingung) und der Korrelationen (nicht darstellbare Bedingung) konsistent. Eine ausführliche Erklärung finden Sie auf den Seiten 101-106 meiner Masterarbeit .
Das LASSO enthält häufig zu viele Variablen, wenn der Abstimmungsparameter für die Vorhersage ausgewählt wird, aber das wahre Modell ist sehr wahrscheinlich eine Teilmenge dieser Variablen. Dies legt nahe, eine sekundäre Schätzstufe wie das adaptive LASSO zu verwenden, die die Vorspannung der LASSO-Schätzung unter Verwendung des vorhersageoptimalen Abstimmungsparameters steuert. Dies führt zu einer konsistenten Auswahl (oder Orakeleigenschaft) ohne die oben genannten Bedingungen.
Sie können glmnet für adaptives LASSO verwenden. Zuerst benötigen Sie eine anfängliche Schätzung, entweder die kleinsten Quadrate, die Grat- oder sogar die LASSO-Schätzung, um die Gewichte zu berechnen. Anschließend können Sie adaptives LASSO implementieren, indem Sie die X-Matrix skalieren. Hier ist ein Beispiel mit anfänglichen Schätzungen der kleinsten Quadrate für Trainingsdaten:
# 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)