Pemilihan model Bayesian di PyMC3

11

Saya menggunakan PyMC3 untuk menjalankan model Bayesian pada data saya.

Saya baru untuk pemodelan Bayesian tetapi menurut beberapa posting blog , Wikipedia dan QA dari situs ini, tampaknya menjadi pendekatan yang valid untuk menggunakan faktor Bayes dan kriteria BIC untuk dapat memilih model apa yang paling mewakili data saya (yang menghasilkan data saya).

Untuk menghitung faktor Bayes, saya memerlukan kemungkinan relatif untuk model yang ingin saya bandingkan. Mungkin agak membingungkan bagi saya, tetapi saya pikir ada dua cara untuk mendapatkan kemungkinan (koreksi saya jika saya salah):

  • cara aljabar ketika model sederhana: lihat contoh Wikipedia halaman faktor Bayes

  • cara numerik: inilah yang dilakukan PyMC3 dengan algoritma MCMC

Bagaimana saya bisa mengakses kemungkinan dan membandingkan model saya di PyMC3? Saya menemukan model.logpmetode yang menurut doc adalah "fungsi kepadatan probabilitas log". Bisakah saya menggunakannya untuk mendapatkan kemungkinan?

Pertanyaan bonus: ketika dua model dibandingkan rasio antara kedua kemungkinan dihitung. Apa yang terjadi jika Anda ingin membandingkan beberapa model?

Contoh nyata PyMC3 akan sangat membantu!

hadim
sumber

Jawaban:

15

Anda dapat menghitung kemungkinan model memang menggunakan model.logp (). Sebagai input, itu membutuhkan sebuah titik. Sebagai contoh, model TERBAIK dari direktori contoh yang bisa saya lakukan:

np.exp(model.logp({'group1_mean': 0.1, 
                   'group2_mean': 0.2, 
                   'group1_std_interval': 1., 
                   'group2_std_interval': 1.2, 
                   'nu_minus_one_log': 1}))

Perhatikan bahwa model ini menggunakan variabel yang diubah, jadi saya harus menyediakan ini. Anda kemudian dapat mengambil exp () dari itu dan menggunakannya di dalam integrator numerik, misalnya seperti yang disediakan oleh scipy.integrate. Masalahnya adalah bahwa bahkan dengan hanya 5 parameter, ini akan sangat lambat.

Bayes Factors umumnya sangat sulit untuk dihitung karena Anda harus berintegrasi dengan ruang parameter yang lengkap. Ada beberapa ide untuk menggunakan sampel MCMC untuk itu. Lihat posting ini, dan khususnya bagian komentar untuk informasi lebih lanjut: https://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-metlo-ever / Kasus untuk BIC sayangnya serupa.

Jika Anda benar-benar ingin menghitung Faktor Bayes, Anda juga dapat melihat tes Savage Dickey Ratio (lihat misalnya http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf ), tetapi aplikasinya terbatas.

Saya kira Anda mencoba melakukan perbandingan model yang merupakan bidang dengan banyak pendapat dan solusi (beberapa sulit diimplementasikan, seperti BFs). Salah satu ukuran yang sangat mudah dihitung adalah Kriteria Informasi Penyimpangan. Ini memiliki kelemahan, meskipun beberapa dari mereka dapat diatasi (lihat http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract ). Sayangnya kami belum mem-porting kode pymc3, tetapi itu akan cukup mudah (lihat di sini untuk implementasi pymc2: https://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 ).

Kruschke mendukung pendekatan untuk hanya membangun model lengkap dan membiarkannya memberi tahu Anda parameter mana yang penting. Anda juga bisa membuat pemilihan variabel ke dalam model itu sendiri (lihat misalnya http://arxiv.org/pdf/math/0505633.pdf ).

Akhirnya, untuk perawatan yang lebih lengkap, lihat posting blog terbaru ini: http://jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/

twiecki
sumber
1
Membuka masalah untuk menambahkan DIC ke pymc3: github.com/pymc-devs/pymc3/issues/797
twiecki