Saya menggunakan cv.glmnet
untuk menemukan prediktor. Pengaturan yang saya gunakan adalah sebagai berikut:
lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min
results<-predict(lassoResults,s=bestlambda,type="coefficients")
choicePred<-rownames(results)[which(results !=0)]
Untuk membuat yakin hasilnya direproduksi saya set.seed(1)
. Hasilnya sangat bervariasi. Saya menjalankan kode yang sama persis 100 untuk melihat bagaimana variabel hasilnya. Dalam menjalankan 98/100 memiliki satu prediktor tertentu selalu dipilih (kadang-kadang hanya pada itu sendiri); prediktor lain dipilih (co-efisien bukan nol) biasanya 50/100 kali.
Jadi dikatakan kepada saya bahwa setiap kali validasi silang berjalan itu mungkin akan memilih lambda terbaik yang berbeda, karena pengacakan awal dari lipatan penting. Orang lain telah melihat masalah ini ( hasil CV.glmnet ) tetapi tidak ada solusi yang disarankan.
Saya berpikir bahwa mungkin yang muncul 98/100 mungkin sangat berkorelasi dengan yang lain? Hasilnya memang stabil jika saya hanya menjalankan LOOCV ( ), tapi saya ingin tahu mengapa mereka sangat variabel ketika .
sumber
set.seed(1)
menjalankancv.glmnet()
100 kali? Itu bukan metodologi yang bagus untuk reproduksibilitas; lebih baik keset.seed()
kanan sebelum setiap lari, atau jaga agar lipatannya konstan di seluruh lintasan. Setiap panggilan Anda untukcv.glmnet()
meneleponsample()
N kali. Jadi jika panjang data Anda pernah berubah, maka reprodubilitas akan berubah.Jawaban:
Intinya di sini adalah bahwa dalam
cv.glmnet
lipatan K ("bagian") diambil secara acak.Dalam validasi silang K-folds, dataset dibagi dalam bagian , dan bagian K - 1 digunakan untuk memprediksi bagian K-th (ini dilakukan kali K , menggunakan bagian K yang berbeda setiap kali). Ini dilakukan untuk semua lambda, dan yang memberikan kesalahan validasi silang terkecil.K K−1 K K
lambda.min
Inilah sebabnya ketika Anda menggunakan hasilnya tidak berubah: setiap grup terbuat dari satu, jadi tidak ada banyak pilihan untuk grup K.nfolds=n K
Dari
cv.glmnet()
manual referensi:UMK adalah kerangka data yang berisi semua kesalahan untuk semua lambdas (untuk 100 berjalan),
lambda.min
adalah lambda Anda dengan kesalahan rata-rata minimum.sumber
cv.glmnet(...)$lambda
. Alternatif saya memperbaiki ini: stats.stackexchange.com/a/173895/19676Lalu, untuk setiap prediktor saya dapatkan:
Dengan cara ini saya mendapatkan deskripsi yang cukup kuat tentang efek prediksi. Setelah Anda memiliki distribusi untuk koefisien, daripada Anda dapat menjalankan hal-hal statistik yang Anda pikir layak untuk mendapatkan CI, nilai p, dll ... tapi saya belum menyelidiki ini.
Metode ini dapat digunakan dengan lebih atau kurang metode pemilihan apa pun yang dapat saya pikirkan.
sumber
Saya akan menambahkan solusi lain, yang menangani bug di @ Alice's karena lambda yang hilang, tetapi tidak memerlukan paket tambahan seperti @Max Ghenis. Terima kasih terutang pada semua jawaban lain - semua orang membuat poin berguna!
sumber
Sebagian besar jawaban Alice berfungsi dengan baik, tetapi terkadang kesalahan keluar karena
cv.glmnet$lambda
terkadang mengembalikan hasil dengan panjang yang berbeda, misalnya:OptimLambda
di bawah ini akan berfungsi dalam kasus umum, dan juga lebih cepat dengan memanfaatkanmclapply
pemrosesan paralel dan menghindari loop.sumber
Anda dapat mengontrol keacakan jika Anda secara eksplisit mengatur foldid. Berikut ini contoh untuk CV 5 kali lipat
Sekarang jalankan cv.glmnet dengan lipatan ini.
Anda akan mendapatkan hasil yang sama setiap kali.
sumber