Bingung dengan variasi MCMC Metropolis-Hastings: Random-Walk, Non-Random-Walk, Independent, Metropolis

15

Selama beberapa minggu terakhir saya telah mencoba memahami MCMC dan algoritma Metropolis-Hastings. Setiap kali saya pikir saya memahaminya, saya menyadari bahwa saya salah. Sebagian besar contoh kode yang saya temukan on-line mengimplementasikan sesuatu yang tidak konsisten dengan deskripsi. yaitu: Mereka mengatakan mereka menerapkan Metropolis-Hastings tetapi mereka benar-benar menerapkan metropolis berjalan acak. Yang lain (hampir selalu) secara diam-diam mengabaikan penerapan rasio koreksi Hastings karena mereka menggunakan distribusi proposal simetris. Sebenarnya, saya belum menemukan satu contoh sederhana yang menghitung rasio sejauh ini. Itu membuat saya semakin bingung. Dapatkah seseorang memberi saya contoh kode (dalam bahasa apa pun) berikut ini:

  • Vanilla Non-Random Walk Algoritma Metropolis-Hastings dengan perhitungan rasio koreksi Hastings (bahkan jika ini akan menjadi 1 ketika menggunakan distribusi proposal simetris).
  • Algoritma Vanilla Random Walk Metropolis-Hastings.
  • Algoritma Vanilla Independent Metropolis-Hastings.

Tidak perlu menyediakan algoritma Metropolis karena jika saya tidak salah satu-satunya perbedaan antara Metropolis dan Metropolis-Hastings adalah bahwa yang pertama selalu sampel dari distribusi simetris dan dengan demikian mereka tidak memiliki rasio koreksi Hastings. Tidak perlu memberikan penjelasan rinci tentang algoritma. Saya mengerti dasar-dasarnya tetapi saya agak bingung dengan semua nama yang berbeda untuk variasi yang berbeda dari algoritma Metropolis-Hastings tetapi juga dengan bagaimana Anda menerapkan rasio koreksi Hastings pada Vanilla non-random-walk MH. Tolong jangan menyalin tautan tempel yang sebagian menjawab pertanyaan saya karena kemungkinan besar saya sudah melihatnya. Tautan itu membuat saya kebingungan. Terima kasih.

AstrOne
sumber

Jawaban:

10

Ini dia - tiga contoh. Saya telah membuat kode jauh lebih efisien daripada yang ada di aplikasi nyata untuk membuat logika lebih jelas (saya harap.)

# We'll assume estimation of a Poisson mean as a function of x
x <- runif(100)
y <- rpois(100,5*x)  # beta = 5 where mean(y[i]) = beta*x[i]

# Prior distribution on log(beta): t(5) with mean 2 
# (Very spread out on original scale; median = 7.4, roughly)
log_prior <- function(log_beta) dt(log_beta-2, 5, log=TRUE)

# Log likelihood
log_lik <- function(log_beta, y, x) sum(dpois(y, exp(log_beta)*x, log=TRUE))

# Random Walk Metropolis-Hastings 
# Proposal is centered at the current value of the parameter

rw_proposal <- function(current) rnorm(1, current, 0.25)
rw_p_proposal_given_current <- function(proposal, current) dnorm(proposal, current, 0.25, log=TRUE)
rw_p_current_given_proposal <- function(current, proposal) dnorm(current, proposal, 0.25, log=TRUE)

rw_alpha <- function(proposal, current) {
   # Due to the structure of the rw proposal distribution, the rw_p_proposal_given_current and
   # rw_p_current_given_proposal terms cancel out, so we don't need to include them - although
   # logically they are still there:  p(prop|curr) = p(curr|prop) for all curr, prop
   exp(log_lik(proposal, y, x) + log_prior(proposal) - log_lik(current, y, x) - log_prior(current))
}

# Independent Metropolis-Hastings
# Note: the proposal is independent of the current value (hence the name), but I maintain the
# parameterization of the functions anyway.  The proposal is not ignorable any more
# when calculation the acceptance probability, as p(curr|prop) != p(prop|curr) in general.

ind_proposal <- function(current) rnorm(1, 2, 1) 
ind_p_proposal_given_current <- function(proposal, current) dnorm(proposal, 2, 1, log=TRUE)
ind_p_current_given_proposal <- function(current, proposal) dnorm(current, 2, 1, log=TRUE)

ind_alpha <- function(proposal, current) {
   exp(log_lik(proposal, y, x)  + log_prior(proposal) + ind_p_current_given_proposal(current, proposal) 
       - log_lik(current, y, x) - log_prior(current) - ind_p_proposal_given_current(proposal, current))
}

# Vanilla Metropolis-Hastings - the independence sampler would do here, but I'll add something
# else for the proposal distribution; a Normal(current, 0.1+abs(current)/5) - symmetric but with a different
# scale depending upon location, so can't ignore the proposal distribution when calculating alpha as
# p(prop|curr) != p(curr|prop) in general

van_proposal <- function(current) rnorm(1, current, 0.1+abs(current)/5)
van_p_proposal_given_current <- function(proposal, current) dnorm(proposal, current, 0.1+abs(current)/5, log=TRUE)
van_p_current_given_proposal <- function(current, proposal) dnorm(current, proposal, 0.1+abs(proposal)/5, log=TRUE)

van_alpha <- function(proposal, current) {
   exp(log_lik(proposal, y, x)  + log_prior(proposal) + ind_p_current_given_proposal(current, proposal) 
       - log_lik(current, y, x) - log_prior(current) - ind_p_proposal_given_current(proposal, current))
}


# Generate the chain
values <- rep(0, 10000) 
u <- runif(length(values))
naccept <- 0
current <- 1  # Initial value
propfunc <- van_proposal  # Substitute ind_proposal or rw_proposal here
alphafunc <- van_alpha    # Substitute ind_alpha or rw_alpha here
for (i in 1:length(values)) {
   proposal <- propfunc(current)
   alpha <- alphafunc(proposal, current)
   if (u[i] < alpha) {
      values[i] <- exp(proposal)
      current <- proposal
      naccept <- naccept + 1
   } else {
      values[i] <- exp(current)
   }
}
naccept / length(values)
summary(values)

Untuk vanilla sampler, kita mendapatkan:

> naccept / length(values)
[1] 0.1737
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.843   5.153   5.388   5.378   5.594   6.628 

yang merupakan kemungkinan penerimaan yang rendah, tetapi masih ... menyetel proposal akan membantu di sini, atau mengadopsi yang lain. Inilah hasil proposal jalan acak:

> naccept / length(values)
[1] 0.2902
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.718   5.147   5.369   5.370   5.584   6.781 

Hasil serupa, seperti yang diharapkan, dan probabilitas penerimaan yang lebih baik (bertujuan ~ 50% dengan satu parameter.)

Dan, untuk kelengkapan, sampler kemerdekaan:

> naccept / length(values)
[1] 0.0684
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.990   5.162   5.391   5.380   5.577   8.802 

Karena tidak "beradaptasi" dengan bentuk posterior, ia cenderung memiliki probabilitas penerimaan yang paling buruk dan paling sulit untuk disesuaikan dengan baik untuk masalah ini.

Perhatikan bahwa secara umum kami lebih suka proposal dengan ekor yang lebih gemuk, tapi itu topik lain.

Jbowman
sumber
Q
1
@ floyd - berguna dalam sejumlah situasi, misalnya, jika Anda memiliki gagasan yang layak tentang lokasi pusat distribusi (misalnya, karena Anda menghitung perkiraan MLE atau MOM) dan dapat memilih proposal berekor gemuk distribusi, atau jika waktu komputasi per iterasi sangat rendah dalam hal ini Anda dapat menjalankan rantai yang sangat panjang (yang menebus tingkat penerimaan rendah) - sehingga menghemat waktu analisis dan pemrograman Anda, yang mungkin jauh lebih besar daripada runtime yang bahkan tidak efisien. Akan tetapi, ini bukan proposal percobaan pertama yang khas, yang kemungkinan merupakan jalan acak.
jbowman
Qhal(xt+1|xt)
1
hal(xt+1|xt)=hal(xt+1)
1

Lihat:

q()x

The Artikel Wikipedia adalah membaca pelengkap yang baik. Seperti yang Anda lihat, Metropolis juga memiliki "rasio koreksi" tetapi, seperti yang disebutkan di atas, Hastings memperkenalkan modifikasi yang memungkinkan distribusi proposal yang tidak simetris.

Algoritma Metropolis diimplementasikan dalam paket R di mcmcbawah perintah metrop().

Contoh kode lainnya:

http://www.mas.ncl.ac.uk/~ndjw1/teaching/sim/metrop/

http://pcl.missouri.edu/jeff/node/322

http://darrenjw.wordpress.com/2010/08/15/metropolis-hastings-mcmc-algorithms/

Fritz Lang
sumber
Terimakasih atas balasan anda. Sayangnya itu tidak menjawab pertanyaan saya. Saya hanya melihat metropolis berjalan acak, metropolis berjalan non acak dan MH independen. Rasio koreksi Hastings dnorm(can,mu,sig)/dnorm(x,mu,sig)dalam sampler independensi dari tautan pertama tidak sama dengan 1. Saya pikir seharusnya sama dengan 1 ketika menggunakan distribusi proposal simetris. Apakah ini karena itu adalah sampler independene dan bukan MH Non-Random-Walk biasa? Jika ya, berapa rasio Hastings untuk MH Non-Random-walk Plain?
AstrOne
@ AstrOne - menggunakan distribusi proposal simetris tidak cukup untuk membuat proposal diabaikan ketika menghitung probabilitas penerimaan MH. Contoh Anda menunjukkan mengapa. Yang Anda butuhkan adalahhal(arus|usul)=hal(usul|arus)