Ini adalah pertanyaan pemula tentang latihan dalam “Bayesian Computation with R” karya Jim Albert. Perhatikan bahwa sementara ini mungkin pekerjaan rumah, dalam kasus saya tidak, karena saya belajar metode Bayesian di R karena saya pikir saya mungkin menggunakannya dalam analisis masa depan saya.
Bagaimanapun, sementara ini adalah pertanyaan khusus, itu mungkin melibatkan pemahaman dasar metode Bayesian.
Jadi, dalam latihan 2.2, Jim Albert meminta kami untuk menganalisis percobaan lemparan sen. Lihat disini. Kita harus menggunakan histogram sebelumnya, yaitu, membagi ruang p
nilai yang mungkin dalam 10 interval panjang .1
dan menetapkan probabilitas sebelumnya untuk ini.
Karena saya tahu bahwa probabilitas yang sebenarnya adalah .5
, dan saya pikir sangat tidak mungkin bahwa alam semesta telah mengubah hukum probabilitas atau penny yang kasar, prioritas saya adalah:
prior <- c(1,5,20,100,5000,5000,100,20,5,1)
prior <- prior/sum(prior)
di sepanjang titik tengah interval
midpt <- seq(0.05, 0.95, by=0.1)
Sejauh ini bagus. Selanjutnya, kami memutar sen 20 kali dan mencatat jumlah keberhasilan (kepala) dan kegagalan (ekor). Mudah dilakukan:
y <- rbinom(n=20,p=.5,size=1)
s <- sum(y==1)
f <- sum(y==0)
Di expeniment saya, s == 7
dan f == 13
. Berikutnya adalah bagian yang saya tidak mengerti:
Simulasi dari distribusi posterior dengan (1) menghitung kepadatan posterior p pada kisi nilai pada (0,1) dan (2) mengambil sampel simulasi dengan penggantian dari kisi. (Fungsi
histprior
dansample
sangat membantu dalam perhitungan ini). Bagaimana probabilitas interval berubah berdasarkan data Anda?
Beginilah caranya:
p <- seq(0,1, length=500)
post <- histprior(p,midpt,prior) * dbeta(p,s+1,f+1)
post <- post/sum(post)
ps <- sample(p, replace=TRUE, prob = post)
Tetapi mengapa kita melakukan itu ?
Kita dapat dengan mudah memperoleh kerapatan posterior dengan mengalikan yang sebelumnya dengan kemungkinan yang sesuai, seperti yang dilakukan pada baris dua dari blok di atas. Ini adalah sebidang distribusi posterior:
Ketika distribusi posterior dipesan, kita dapat memperoleh hasil untuk interval yang diperkenalkan dalam histogram sebelumnya dengan merangkum elemen-elemen kepadatan posterior:
post.vector <- vector()
post.vector[1] <- sum(post[p < 0.1])
post.vector[2] <- sum(post[p > 0.1 & p <= 0.2])
post.vector[3] <- sum(post[p > 0.2 & p <= 0.3])
post.vector[4] <- sum(post[p > 0.3 & p <= 0.4])
post.vector[5] <- sum(post[p > 0.4 & p <= 0.5])
post.vector[6] <- sum(post[p > 0.5 & p <= 0.6])
post.vector[7] <- sum(post[p > 0.6 & p <= 0.7])
post.vector[8] <- sum(post[p > 0.7 & p <= 0.8])
post.vector[9] <- sum(post[p > 0.8 & p <= 0.9])
post.vector[10] <- sum(post[p > 0.9 & p <= 1])
(Ahli R mungkin menemukan cara yang lebih baik untuk membuat vektor itu. Saya kira itu mungkin ada hubungannya dengan sweep
?)
round(cbind(midpt,prior,post.vector),3)
midpt prior post.vector
[1,] 0.05 0.000 0.000
[2,] 0.15 0.000 0.000
[3,] 0.25 0.002 0.003
[4,] 0.35 0.010 0.022
[5,] 0.45 0.488 0.737
[6,] 0.55 0.488 0.238
[7,] 0.65 0.010 0.001
[8,] 0.75 0.002 0.000
[9,] 0.85 0.000 0.000
[10,] 0.95 0.000 0.000
Selain itu, kami memiliki 500 undian dari distribusi posterior yang memberi tahu kami tidak ada yang berbeda. Berikut adalah plot kepadatan undian yang disimulasikan:
Sekarang kami menggunakan data yang disimulasikan untuk mendapatkan probabilitas untuk interval kami dengan menghitung proporsi simulasi dalam interval:
sim.vector <- vector()
sim.vector[1] <- length(ps[ps < 0.1])/length(ps)
sim.vector[2] <- length(ps[ps > 0.1 & ps <= 0.2])/length(ps)
sim.vector[3] <- length(ps[ps > 0.2 & ps <= 0.3])/length(ps)
sim.vector[4] <- length(ps[ps > 0.3 & ps <= 0.4])/length(ps)
sim.vector[5] <- length(ps[ps > 0.4 & ps <= 0.5])/length(ps)
sim.vector[6] <- length(ps[ps > 0.5 & ps <= 0.6])/length(ps)
sim.vector[7] <- length(ps[ps > 0.6 & ps <= 0.7])/length(ps)
sim.vector[8] <- length(ps[ps > 0.7 & ps <= 0.8])/length(ps)
sim.vector[9] <- length(ps[ps > 0.8 & ps <= 0.9])/length(ps)
sim.vector[10] <- length(ps[ps > 0.9 & ps <= 1])/length(ps)
(Lagi: Apakah ada cara yang lebih efisien untuk melakukan ini?)
Ringkas hasil:
round(cbind(midpt,prior,post.vector,sim.vector),3)
midpt prior post.vector sim.vector
[1,] 0.05 0.000 0.000 0.000
[2,] 0.15 0.000 0.000 0.000
[3,] 0.25 0.002 0.003 0.000
[4,] 0.35 0.010 0.022 0.026
[5,] 0.45 0.488 0.737 0.738
[6,] 0.55 0.488 0.238 0.236
[7,] 0.65 0.010 0.001 0.000
[8,] 0.75 0.002 0.000 0.000
[9,] 0.85 0.000 0.000 0.000
[10,] 0.95 0.000 0.000 0.000
Tidak mengherankan bahwa simultion tidak menghasilkan hasil lain selain posterior, yang menjadi basisnya. Jadi, mengapa kita menggambar simulasi itu sejak awal ?
sumber
ps <- sample(p, replace=TRUE, prob = post)
! Apakah saya benar dengan asumsi bahwa ini akan berubah untuk teknik simulasi yang lebih maju?Jawaban:
Untuk menjawab pertanyaan Anda: Bagaimana cara mengikuti yang lebih elegan?
Cara termudah untuk melakukannya menggunakan basis R adalah:
Perhatikan bahwa jeda mulai dari 0 hingga 1. Ini menghasilkan:
Dan kita mempunyai:
sumber
Pemahaman saya adalah bahwa karena kerapatan posterior yang diperoleh dari produk dengan kerapatan sebelumnya dan kemungkinan hanya merupakan PERKAYAAN dari kerapatan posterior, maka kami tidak dapat membuat kesimpulan EXACT dari itu secara langsung.
Akibatnya, kita perlu mengambil sampel acak dari itu, dan melakukan inferensi dari sampel, seperti metode simulasi untuk posterior dari keluarga beta.
sumber