Saya ingin sampel sesuai dengan kepadatan
manadanbenar-benar positif. (Motivasi: Ini bisa berguna untuk pengambilan sampel Gibbs ketika parameter bentuk kepadatan Gamma memiliki seragam sebelumnya.)
Adakah yang tahu cara mengambil sampel dari kepadatan ini dengan mudah? Mungkin itu standar dan hanya sesuatu yang tidak saya ketahui?
Saya bisa memikirkan algoritma penolakan penolakan bodoh yang akan lebih atau kurang bekerja (menemukan mode dari f , sampel ( a , u ) dari seragam dalam kotak besar [ 0 , 10 a ∗ ] × [ 0 , f ( a ∗ ) ] dan menolak jika ), tetapi (i) sama sekali tidak efisien dan (ii) akan terlalu besar untuk ditangani oleh komputer dengan mudah bahkan untuk dan . (Perhatikan bahwa mode untuk besardan kira-kira pada .)
Terima kasih sebelumnya atas bantuannya!
Jawaban:
Sampel penolakan akan bekerja dengan sangat baik ketika dan masuk akal untuk c d ≥ exp ( 2 ) .cd≥exp(5) cd≥exp(2)
Untuk sedikit menyederhanakan matematika, misalkan , tulis x = a , dan catat ituk=cd x=a
untuk . Pengaturan x = u 3 / 2 memberikanx≥1 x=u3/2
untuk . Ketika k ≥ exp ( 5 ) , distribusi ini sangat dekat dengan Normal (dan semakin dekat dengan k semakin besar). Secara khusus, Anda bisau≥1 k≥exp(5) k
Temukan mode numerik (menggunakan, misalnya, Newton-Raphson).f(u)
Luaskan ke urutan kedua tentang modenya.logf(u)
Ini menghasilkan parameter dari distribusi Normal yang mendekati perkiraan. Untuk akurasi yang tinggi, Normal yang mendekati ini mendominasi kecuali pada ekor yang ekstrem. (Ketika k < exp ( 5 ) , Anda mungkin perlu meningkatkan pdf Normal sedikit untuk memastikan dominasi.)f(u) k<exp(5)
Setelah melakukan pekerjaan pendahuluan ini untuk setiap nilai diberikan , dan setelah memperkirakan konstanta M > 1 (seperti yang dijelaskan di bawah), memperoleh varian acak adalah masalah:k M>1
Gambarkan nilai dari distribusi Normal yang mendominasi g ( u ) .u g(u)
Jika atau jika baru seragam variate X melebihi f ( u ) / ( M g ( u ) ) , kembali ke langkah 1.u<1 X f(u)/(Mg(u))
Set .x=u3/2
Jumlah yang diharapkan dari evaluasi karena perbedaan antara g dan f hanya sedikit lebih besar dari 1. (Beberapa evaluasi tambahan akan terjadi karena penolakan varian kurang dari 1 , tetapi bahkan ketika k serendah 2 frekuensi seperti kejadiannya kecil.)f g f 1 k 2
Plot ini menunjukkan dengan logaritma dari g dan f sebagai fungsi u untuk . Karena grafiknya sangat dekat, kita perlu memeriksa rasio mereka untuk melihat apa yang terjadi:k=exp(5)
Ini menampilkan log rasio ; faktor M = exp ( 0,004 ) dimasukkan untuk memastikan logaritma positif di seluruh bagian utama distribusi; yaitu, untuk memastikan M g ( u ) ≥ f ( u ) kecuali mungkin di daerah dengan probabilitas yang dapat diabaikan. Dengan membuat M cukup besar Anda dapat menjamin bahwa M ⋅ glog(exp(0.004)g(u)/f(u)) M=exp(0.004) Mg(u)≥f(u) M M⋅ g mendominasi dalam semua kecuali ekor yang paling ekstrim (yang praktis tidak memiliki peluang untuk dipilih dalam simulasi). Namun, semakin besar M , semakin sering penolakan akan terjadi. Ketika k tumbuh besar, M dapat dipilih sangat dekat dengan 1 , yang praktis tidak ada penalti.f M. k M. 1
Pendekatan serupa bekerja bahkan untuk , tetapi nilai-nilai M yang cukup besar mungkin diperlukan ketika exp ( 2 ) < k < exp ( 5 ) , karena f ( u ) terasa asimetris. Misalnya, dengan k = exp ( 2 ) , untuk mendapatkan g yang cukup akurat kita perlu menetapkan M = 1 :k > exp( 2 ) M. exp( 2 ) < k < exp( 5 ) f(u) k=exp(2) g M=1
Kurva merah atas adalah grafik sedangkan kurva biru bawah adalah grafik log ( f ( u ) ) . Sampel penolakan f relatif terhadap exp ( 1 ) g akan menyebabkan sekitar 2/3 dari semua penarikan uji coba ditolak, tiga kali lipat upaya: masih tidak buruk. Ekor kanan ( u > 10 atau x > 10 3 / 2 ~ 30log(exp(1)g(u)) log(f(u)) f exp(1)g u>10 x>103/2∼30 ) akan kurang terwakili dalam sampel penolakan (karena tidak lagi mendominasi f di sana), tetapi ekor itu kurang dari exp ( - 20 ) ∼ 10 - 9 dari total probabilitas.exp(1)g f exp(−20)∼10−9
Untuk meringkas, setelah upaya awal untuk menghitung mode dan mengevaluasi istilah kuadrat dari rangkaian daya sekitar mode - upaya yang paling banyak membutuhkan beberapa evaluasi fungsi - Anda dapat menggunakan sampel penolakan di biaya yang diharapkan antara 1 dan 3 (atau lebih) evaluasi per varian. Pengganda biaya dengan cepat turun menjadi 1 karena k = c d meningkat melebihi 5.f(u) k=cd
Bahkan ketika hanya satu gambar dari diperlukan, metode ini masuk akal. Ia muncul dengan sendirinya ketika banyak undian independen diperlukan untuk nilai k yang sama , karena kemudian perhitungan awal diamortisasi selama banyak undian.f k
Tambahan
@ Cardinal telah meminta, cukup masuk akal, untuk mendukung beberapa analisis melambaikan tangan di masa depan. Secara khusus, mengapa harus transformasi make distribusi sekitar Normal?x=u3/2
Mengingat teori transformasi Box-Cox , adalah wajar untuk mencari beberapa transformasi kekuatan dari bentuk (untuk α yang konstan , semoga tidak terlalu berbeda dari persatuan) yang akan membuat distribusi "lebih" normal. Ingatlah bahwa semua distribusi Normal hanya ditandai: logaritma pdf mereka murni kuadratik, dengan nol istilah linear dan tanpa syarat pemesanan lebih tinggi. Oleh karena itu kita dapat mengambil pdf apa pun dan membandingkannya dengan distribusi normal dengan memperluas logaritma sebagai rangkaian daya di sekitar puncaknya (tertinggi). Kami mencari nilai α yang membuat (setidaknya) yang ketigax=uα α α kekuatan lenyap, setidaknya kira-kira: itulah yang paling bisa kita harapkan bahwa satu koefisien bebas akan tercapai. Seringkali ini bekerja dengan baik.
Tetapi bagaimana cara menangani distribusi khusus ini? Setelah melakukan transformasi kekuatan, pdf-nya adalah
Ambil logaritma dan menggunakan ekspansi asimtotik Stirling dari :log(Γ)
(untuk nilai , yang tidak konstan). Ini berfungsi asalkan α positif, yang akan kita anggap sebagai kasus (karena kalau tidak kita tidak dapat mengabaikan sisa ekspansi).c α
Hitung turunan ketiganya (yang bila dibagi , akan menjadi koefisien kekuatan ketiga u dalam seri daya) dan manfaatkan fakta bahwa pada puncaknya, turunan pertama harus nol. Ini sangat menyederhanakan turunan ketiga, memberi (kira-kira, karena kita mengabaikan turunan c )3! u c
Ketika tidak terlalu kecil, kamu memang akan besar di puncak. Karena α positif, istilah dominan dalam ungkapan ini adalah kekuatan 2 α , yang dapat kita atur menjadi nol dengan membuat koefisiennya menghilang:k u α 2α
Itu sebabnya karya dengan baik: dengan pilihan ini, koefisien istilah kubik sekitar berperilaku puncak seperti u - 3 , yang dekat dengan exp ( - 2 k ) . Begitu k melebihi 10 atau lebih, Anda bisa melupakannya, dan itu cukup kecil bahkan untuk k turun ke 2. Kekuatan yang lebih tinggi, mulai dari yang keempat, memainkan peran yang semakin sedikit ketika k bertambah besar, karena koefisien mereka tumbuh secara proporsional lebih kecil juga. Kebetulan, perhitungan yang sama (berdasarkan turunan kedua dari l o g ( fα=3/2 u−3 exp(−2k) k k k pada puncaknya) menunjukkan standar deviasi dari perkiraan Normal ini sedikit kurang dari 2log(f(u)) , dengan error sebanding denganexp(-k/2).23exp(k/6) exp(−k/2)
sumber
Saya sangat suka jawaban @ whuber; sepertinya sangat efisien dan memiliki analisis yang indah. Tapi itu membutuhkan beberapa wawasan yang mendalam sehubungan dengan distribusi khusus ini. Untuk situasi di mana Anda tidak memiliki wawasan tersebut (jadi untuk distribusi yang berbeda), saya juga menyukai pendekatan berikut yang berfungsi untuk semua distribusi di mana PDF dua kali dapat dibedakan dan turunan kedua memiliki banyak akar. Ini membutuhkan sedikit kerja untuk menyiapkan, tetapi kemudian setelah itu Anda memiliki mesin yang berfungsi untuk sebagian besar distribusi yang dapat Anda gunakan.
Pada dasarnya, idenya adalah menggunakan batas atas linear piecewise untuk PDF yang Anda adaptasi saat Anda melakukan rejection sampling. Pada saat yang sama Anda memiliki linear piecewise lebih rendahterikat untuk PDF yang mencegah Anda dari harus mengevaluasi PDF terlalu sering. Batas atas dan bawah diberikan oleh akor dan garis singgung ke grafik PDF. Pembagian awal ke dalam interval adalah sedemikian rupa sehingga pada setiap interval, PDF adalah semua cekung atau semua cembung; setiap kali Anda harus menolak suatu titik (x, y) Anda membagi interval itu di x. (Anda juga dapat melakukan subdivisi tambahan di x jika Anda harus menghitung PDF karena batas bawahnya benar-benar buruk.) perkiraan PDF Anda pada dasarnya gratis. Rinciannya sedikit rumit untuk mendapatkan hak, tapi saya sudah mencoba untuk menjelaskan sebagian besar dari mereka dalam seri dari blog posts - terutamayang terakhir .
Posting-posting itu tidak membahas apa yang harus dilakukan jika PDF tidak dibatasi baik dalam domain maupun dalam nilai; Saya akan merekomendasikan solusi yang agak jelas baik melakukan transformasi yang membuat mereka terbatas (yang akan sulit untuk diotomatisasi) atau menggunakan cutoff. Saya akan memilih cutoff tergantung pada jumlah total poin yang Anda harapkan untuk menghasilkan, katakan N , dan pilih cutoff sehingga bagian yang dihapus memiliki probabilitas kurang dari . (Ini cukup mudah jika Anda memiliki formulir tertutup untuk CDF; jika tidak, mungkin juga rumit.)1 / ( 10 N)
Metode ini diimplementasikan dalam Maple sebagai metode default untuk distribusi kontinu yang ditentukan pengguna. (Pengungkapan penuh - Saya bekerja untuk Maplesoft.)
Saya melakukan contoh menjalankan, menghasilkan 10 ^ 4 poin untuk c = 2, d = 3, menentukan [1, 100] sebagai rentang awal untuk nilai-nilai:
Ada 23 penolakan (merah), 51 poin "dalam masa percobaan" yang pada saat itu berada di antara batas bawah dan PDF yang sebenarnya, dan 9949 poin yang diterima setelah memeriksa hanya ketidaksetaraan linear. Itu 74 evaluasi dari total PDF, atau sekitar satu evaluasi PDF per 135 poin. Rasio akan menjadi lebih baik karena Anda menghasilkan lebih banyak poin, karena perkiraannya menjadi lebih baik dan lebih baik (dan sebaliknya, jika Anda hanya menghasilkan beberapa poin, rasionya lebih buruk).
sumber
You could do it by numerically executing the inversion method, which says that if you plug uniform(0,1) random variables in the inverse CDF, you get a draw from the distribution. I've included some R code below that does this, and from the few checks I've done, it is working well, but it is a bit sloppy and I'm sure you could optimize it.
If you're not familiar with R, lgamma() is the log of the gamma function; integrate() calculates a definite 1-D integral; uniroot() calculates a root of a function using 1-D bisection.
The main arbitrary thing I do here is assuming that(1,10000) is a sufficient bracket for the bisection - I was lazy about this and there might be a more efficient way to choose this bracket. For very large values, the numerical calculation of the CDF (say, >100000 ) fails, so the bracket must be below this. The CDF is effectively equal to 1 at those points (unless c,d are very large), so something could probably be included that would prevent miscalculation of the CDF for very large input values.
Edit: Whencd is very large, a numerical problem occurs with this method. As whuber points out in the comments, once this has occurred, the distribution is essentially degenerate at it's mode, making it a trivial sampling problem.
sumber