Saya ingin melakukan hal berikut:
1) Regresi OLS (tanpa istilah hukuman) untuk mendapatkan koefisien beta ; adalah variabel yang digunakan untuk regresi. Saya melakukan ini dengan
lm.model = lm(y~ 0 + x)
betas = coefficients(lm.model)
2) Regresi Lasso dengan masa hukuman, kriteria pemilihannya adalah Kriteria Informasi Bayesian (BIC), yang diberikan oleh
di mana berarti variabel / angka regresi, untuk jumlah pengamatan, dan untuk beta awal yang diperoleh pada langkah 1). Saya ingin mendapatkan hasil regresi untuk nilai khusus ini , yang berbeda untuk setiap regressor yang digunakan. Karenanya jika ada tiga variabel, akan ada tiga nilai yang berbeda .
Masalah optimasi OLS-Lasso kemudian diberikan oleh
Bagaimana saya bisa melakukan ini dalam R dengan paket lars atau glmnet? Saya tidak dapat menemukan cara untuk menentukan lambda dan saya tidak 100% yakin jika saya mendapatkan hasil yang benar jika saya menjalankan
lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")
Saya menghargai bantuan apa pun di sini.
Memperbarui:
Saya telah menggunakan kode berikut sekarang:
fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin = as.numeric(fits.cv[9]) #lambda.min
fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef = coef(fits, s = lmin)
Pada baris 1 saya menggunakan validasi silang dengan faktor penalti yang ditentukan ( ), yang berbeda untuk setiap regresi . Baris 2 memilih "lambda.min" dari fits.cv, yang merupakan lambda yang memberikan kesalahan validasi silang rata-rata minimum. Baris 3 melakukan laso fit ( ) pada data. Sekali lagi saya menggunakan faktor penalti . Baris 4 mengekstrak koefisien dari kecocokan yang termasuk ke dalam "optimal" dipilih pada baris 2.λλalpha=1
Sekarang saya memiliki koefisien beta untuk regressor yang menggambarkan solusi optimal dari masalah minimisasi
dengan faktor penalti . Rangkaian koefisien optimal kemungkinan besar adalah subset dari regressor yang awalnya saya gunakan, ini adalah konsekuensi dari metode Lasso yang menyusutkan jumlah regressor yang digunakan.
Apakah pemahaman dan kode saya benar?
sumber
$\alpha$
menjadi . Tolong buat ini, karena itu akan membuat orang lebih mudah memahami pertanyaan Anda, dan karenanya menjawabnya.Jawaban:
Dari
glmnet
dokumentasi (?glmnet
), kami melihat bahwa dimungkinkan untuk melakukan penyusutan diferensial. Ini membuat kita setidaknya sebagian untuk menjawab pertanyaan OP.Untuk sepenuhnya menjawab pertanyaan, saya pikir ada dua pendekatan yang tersedia untuk Anda, tergantung pada apa yang ingin Anda capai.
Pertanyaan Anda adalah bagaimana menerapkan diferensial yang menyusutλ λ bj φjbjCφj=φ ' j m=CΣ m j = 1 logTϕj=logTT|b∗j| ϕj bj Cϕj=ϕ′j ϕ ′ j ϕjCϕ ′ j λ=1m=C∑mj=1logTT|b∗j| ϕ′j menggantikan dalam ekspresi optimisasi di bawah ini. Jadi selesaikan untuk , berikan nilai to , dan kemudian ekstrak koefisien untuk . Saya akan merekomendasikan menggunakan .ϕj C ϕ′j λ=1
glmnet
dan mengambil koefisien untuk nilai tertentu . Menyediakan beberapa nilai bukan 1 menghasilkan penyusutan diferensial pada nilai . Untuk mencapai susut, susut untuk setiap adalah , kita hanya perlu melakukan beberapa aljabar. Biarkan menjadi faktor penalti untuk , apa yang akan diberikan . Dari dokumentasi, kita dapat melihat bahwa nilai-nilai ini diskalakan ulang dengan faktor st . Ini berarti bahwaλ b j ϕ j = log Tpenalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
Yang kedua adalah cara "standar" untuk digunakank λ λ=0 b λ λ
glmnet
: Seseorang melakukan -validasi silang berulang untuk memilih sehingga Anda meminimalkan MSE out-of-sample. Inilah yang saya jelaskan di bawah ini secara lebih rinci. Alasan kami menggunakan CV dan memeriksa MSE di luar sampel adalah karena MSE dalam sampel akan selalu diminimalkan untuk , yaitu adalah MLE biasa. Menggunakan CV sambil memvariasikan memungkinkan kita untuk memperkirakan kinerja model pada data out-of-sample , dan memilih yang optimal (dalam arti tertentu).λ λ = 0 b λ λItuλ λ λ λ
glmnet
panggilan tidak menentukan (atau harus itu, karena menghitung seluruh yang lintasan secara default untuk alasan kinerja). akan kembali koefisien untuk nilai . Namun, apa pun pilihan Anda berikan, hasilnya akan mencerminkan penalti diferensial yang Anda terapkan dalam panggilan yang sesuai dengan model.λ λ λcoef(fits,s=something)
something
Cara standar untuk memilih nilai optimal dari adalah menggunakan , daripada . Validasi silang digunakan untuk memilih jumlah penyusutan yang meminimalkan kesalahan out-of-sample, sedangkan spesifikasi akan menyusutkan beberapa fitur lebih dari yang lain, sesuai dengan skema pembobotan Anda.λ
cv.glmnet
glmnet
penalty.factor
Prosedur ini optimal
di mana adalah faktor penalti untuk fitur (apa yang Anda berikan dalam argumen). (Ini sedikit berbeda dari ekspresi optimisasi Anda; perhatikan bahwa beberapa subskrip berbeda.) Perhatikan bahwa istilah adalah sama di semua fitur, jadi satu-satunya cara beberapa fitur menyusut lebih banyak daripada yang lain adalah melalui . Yang penting, dan tidak sama; adalah skalar dan adalah vektor! Dalam ungkapan ini, diperbaiki / diasumsikan dikenal; yaitu, optimasi akan memilih optimal , bukan optimalϕj jth λ ϕj λ ϕ λ ϕ λ b λ .
penalty.factor
Ini pada dasarnya adalah motivasi
glmnet
seperti yang saya pahami: untuk menggunakan regresi yang dihukum untuk memperkirakan model regresi yang tidak terlalu optimis tentang kinerja out-of-sample. Jika ini adalah tujuan Anda, mungkin ini adalah metode yang tepat untuk Anda.sumber
pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
bagaimana cara saya mengekstrak betas regresor yang sesuai dengan lambda yang saya tentukan, karena lambda berbeda untuk setiap faktor risiko?glmnet
. Lihat jawaban saya yang telah direvisi.