Saya tidak berpikir Anda telah membuat kesalahan dalam kode. Ini adalah masalah menafsirkan output.
Lasso tidak menunjukkan individu mana yang "lebih dapat diprediksi" daripada yang lain. Ini hanya memiliki kecenderungan bawaan untuk memperkirakan koefisien sebagai nol. Semakin besar koefisien penalticatatan( λ ) adalah, semakin besar kecenderungan itu.
Plot validasi silang Anda menunjukkan bahwa semakin banyak koefisien yang dipaksa ke nol, model melakukan pekerjaan yang lebih baik dan lebih baik dalam memprediksi subset nilai yang telah dihapus secara acak dari dataset. Ketika kesalahan prediksi tervalidasi silang terbaik (diukur sebagai "Penyimpangan Binomial" di sini) tercapai ketika semua koefisien nol, Anda harus menduga bahwa tidak ada kombinasi linear dari setiap subset dari regressor yang mungkin berguna untuk memprediksi hasil.
Anda dapat memverifikasi ini dengan menghasilkan respons acak yang independen dari semua regressor dan menerapkan prosedur pemasangan Anda kepada mereka. Berikut cara cepat untuk mengemulasi dataset Anda:
n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
dimnames=list(1:n, c("y", paste0("x", 1:k)))))
Kerangka data X
memiliki satu kolom biner acak bernama "y" dan 338 kolom biner lainnya (yang namanya tidak penting). Saya menggunakan pendekatan Anda untuk mundur "y" terhadap variabel-variabel itu, tetapi - hanya untuk berhati-hati - saya memastikan vektor respons y
dan matriks model x
cocok (yang mungkin tidak mereka lakukan jika ada nilai yang hilang dalam data) :
f <- y ~ . - 1 # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")
Hasilnya sangat seperti milik Anda:
plot(fit)
Memang, dengan data yang sepenuhnya acak ini Lasso masih mengembalikan sembilan perkiraan koefisien bukan nol (meskipun kita tahu, dengan konstruksi, bahwa nilai yang benar semuanya nol). Tetapi kita seharusnya tidak mengharapkan kesempurnaan. Selain itu, karena pemasangan didasarkan pada penghilangan subset data secara acak untuk validasi silang, Anda biasanya tidak akan mendapatkan output yang sama dari satu proses ke proses berikutnya. Dalam contoh ini, panggilan kedua untuk cv.glmnet
menghasilkan kecocokan dengan hanya satu koefisien bukan nol. Untuk alasan ini, jika Anda punya waktu, itu selalu ide yang baik untuk menjalankan kembali prosedur pemasangan beberapa kali dan melacak estimasi koefisien yang secara konsisten bukan nol. Untuk data ini - dengan ratusan regresi - ini akan membutuhkan beberapa menit untuk mengulangi sembilan kali lagi.
sim <- cbind(as.numeric(coef(fit)),
replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025),
xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
main="Results of Repeated Cross-Validated Lasso Fits")
Delapan dari regresi ini memiliki perkiraan nol di sekitar setengah dari kecocokan; sisanya tidak pernah memiliki estimasi nol. Ini menunjukkan sejauh mana Lasso masih akan memasukkan estimasi koefisien bukan nol bahkan ketika koefisien itu sendiri benar-benar nol.