Bagaimana saya bisa menghitung estimasi kepadatan posterior dari sebelumnya dan kemungkinan?

9

Saya mencoba memahami bagaimana menggunakan teorema Bayes untuk menghitung posterior tetapi saya terjebak dengan pendekatan komputasi, misalnya, dalam kasus berikut ini tidak jelas bagi saya bagaimana mengambil produk dari yang sebelumnya dan kemungkinan kemudian menghitung belakang:

Untuk contoh ini, saya tertarik menghitung probabilitas posterior dari dan saya menggunakan standar normal sebelumnya pada , tetapi saya ingin tahu bagaimana menghitung posterior dari prior pada yang diwakili oleh rantai MCMC, jadi saya akan menggunakan 1000 sampel sebagai titik awal saya.μ p ( μ ) N ( μ = 0 , σ = 1 ) μμμ hal(μ)N(μ=0,σ=1)μ

  • sampel 1000 dari sebelumnya.

    set.seed(0)
    prior.mu      <- 0
    prior.sigma   <- 1
    prior.samples <- sort(rnorm(1000, prior.mu, prior.sigma))
    
  • buat beberapa pengamatan:

    observations <- c(0.4, 0.5, 0.8, 0.1)
    
  • dan menghitung kemungkinannya, misalnya :hal(y|μ,σ)

    likelihood <- prod(dnorm(observations, mean(prior.samplse), sd(prior.samples)))
    

yang tidak saya mengerti adalah:

  1. kapan / bagaimana mengalikan yang sebelumnya dengan kemungkinan?
  2. kapan / bagaimana cara menormalkan kepadatan posterior?

harap dicatat: Saya tertarik dengan solusi komputasi umum yang dapat digeneralisasikan tanpa solusi analitis

Abe
sumber
1
Tidak jelas apa distribusi yang berbeda dalam contoh Anda. Tolong jelaskan apa distribusi sebelum / kondisional Anda. Karena bisa jadi Anda memiliki beberapa terminologi yang campur aduk.
Nick Sabbe
@Nick kamu benar. Terima kasih atas masukannya. Saya telah berusaha mengklarifikasi.
Abe

Jawaban:

8

Anda memiliki beberapa hal yang membingungkan. Teori ini berbicara tentang mengalikan distribusi sebelumnya dan kemungkinan, bukan sampel dari distribusi sebelumnya. Juga tidak jelas apa yang Anda miliki sebelum, apakah ini prioritas atas sesuatu? atau sesuatu yang lain?

Maka Anda memiliki hal-hal yang terbalik dalam kemungkinan, pengamatan Anda harus x dengan baik penarikan sebelumnya atau konstanta tetap yang dikenal sebagai mean dan standar deviasi. Dan bahkan itu benar-benar akan menjadi produk dari 4 panggilan untuk mengalah dengan masing-masing pengamatan Anda sebagai x dan mean dan standar deviasi yang sama.

Yang benar-benar tidak jelas adalah apa yang Anda coba lakukan. Apa pertanyaan Anda? parameter mana yang Anda minati? sebelumnya apa yang Anda miliki pada parameter tersebut? apakah ada parameter lain? apakah Anda memiliki prior atau nilai tetap untuk itu?

Mencoba melakukan sesuatu dengan cara Anda saat ini hanya akan membingungkan Anda lebih banyak sampai Anda mengetahui apa pertanyaan Anda dan bekerja dari sana.

Di bawah ini ditambahkan karena setelah pengeditan pertanyaan asli.

Anda masih kehilangan beberapa bagian, dan mungkin tidak memahami segalanya, tetapi kita bisa mulai dari tempat Anda berada.

12

Jadi kita dapat mulai mirip dengan apa yang Anda lakukan dan hasilkan dari sebelumnya:

> obs <- c(0.4, 0.5, 0.8, 0.1)
> pri <- rnorm(10000, 0, 1)

Sekarang kita perlu menghitung kemungkinan, ini didasarkan pada gambar sebelumnya dari rata-rata, kemungkinan dengan data, dan nilai SD yang diketahui. Fungsi dnorm akan memberi kita kemungkinan satu titik, tetapi kita perlu mengalikan nilai-nilai untuk setiap pengamatan, berikut adalah fungsi untuk melakukan itu:

> likfun <- function(theta) {
+ sapply( theta, function(t) prod( dnorm(obs, t, 0.5) ) )
+ }

Sekarang kita dapat menghitung kemungkinan untuk setiap undian dari sebelumnya untuk rata-rata

> tmp <- likfun(pri)

Sekarang untuk mendapatkan posterior kita perlu melakukan jenis undian baru, salah satu pendekatan yang mirip dengan sampel penolakan adalah dengan mengambil sampel dari penarikan rata-rata sebelumnya sebanding dengan kemungkinan untuk setiap penarikan sebelumnya (ini adalah yang terdekat dengan langkah penggandaan yang Anda lakukan sebelumnya). bertanya tentang):

> post <- sample( pri, 100000, replace=TRUE, prob=tmp )

Sekarang kita bisa melihat hasil undian posterior:

> mean(post)
[1] 0.4205842
> sd(post)
[1] 0.2421079
> 
> hist(post)
> abline(v=mean(post), col='green')

dan membandingkan hasil di atas dengan nilai bentuk tertutup dari teori

> (1/1^2*mean(pri) + length(obs)/0.5^2 * mean(obs))/( 1/1^2 + length(obs)/0.5^2 )
[1] 0.4233263
> sqrt(1/(1+4*4))
[1] 0.2425356

Bukan perkiraan yang buruk, tetapi mungkin akan lebih baik menggunakan alat McMC bawaan untuk menggambar dari posterior. Sebagian besar alat sampel satu titik pada suatu waktu tidak dalam batch seperti di atas.

χ2

Solusi umum adalah dengan menggunakan alat yang ada untuk melakukan perhitungan McMC seperti WinBugs atau OpenBugs (BRugs in R memberikan antarmuka antara R dan Bug) atau paket seperti LearnBayes di R.

Greg Snow
sumber
μ
terima kasih telah memecahkan ini untuk saya; Saya telah mengalami waktu yang sulit tetapi ini membantu.
Abe