LASSO Adaptif digunakan untuk pemilihan variabel yang konsisten. Masalah yang kami temui saat menggunakan LASSO untuk pemilihan variabel adalah:
- Parameter penyusutan harus lebih besar untuk pemilihan daripada prediksi
- Parameter bukan nol besar akan terlalu kecil sehingga biasnya terlalu besar
- Parameter bukan nol yang kecil tidak dapat dideteksi secara konsisten
- Korelasi yang tinggi antara prediktor menyebabkan kinerja seleksi yang buruk
Dengan demikian LASSO hanya konsisten untuk pemilihan variabel dalam beberapa kondisi pada parameter susut, parameter (kondisi beta-min) dan korelasi (kondisi tidak terwakili). Lihat halaman 101-106 disertasi master saya untuk penjelasan terperinci.
LASSO sering menyertakan terlalu banyak variabel ketika memilih parameter tuning untuk prediksi tetapi model sebenarnya sangat mungkin merupakan subset dari variabel-variabel ini. Ini menyarankan menggunakan tahap estimasi kedua seperti LASSO adaptif yang mengontrol bias estimasi LASSO menggunakan parameter tuning prediksi-optimal. Ini mengarah pada pemilihan yang konsisten (atau properti oracle) tanpa persyaratan yang disebutkan di atas.
Anda dapat menggunakan glmnet untuk LASSO adaptif. Pertama, Anda perlu perkiraan awal, baik kuadrat terkecil, punggungan, atau bahkan perkiraan LASSO, untuk menghitung bobot. Kemudian Anda dapat menerapkan LASSO adaptif dengan menskalakan matriks X. Berikut ini contoh menggunakan estimasi awal kuadrat terkecil pada data pelatihan:
# 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)