Confondu avec les variations de MCMC Metropolis-Hastings: Random-Walk, Non-Random-Walk, Independent, Metropolis

15

Au cours des dernières semaines, j'ai essayé de comprendre MCMC et les algorithmes de Metropolis-Hastings. Chaque fois que je pense le comprendre, je me rends compte que je me trompe. La plupart des exemples de code que je trouve en ligne implémentent quelque chose qui n'est pas cohérent avec la description. ie: Ils disent qu'ils implémentent Metropolis-Hastings mais ils implémentent en fait une métropole à marche aléatoire. D'autres (presque toujours) ignorent silencieusement la mise en œuvre du rapport de correction Hastings car ils utilisent une distribution de proposition symétrique. En fait, je n'ai pas trouvé un seul exemple simple qui calcule le rapport jusqu'à présent. Cela me rend encore plus confus. Quelqu'un peut-il me donner des exemples de code (dans n'importe quelle langue) des éléments suivants:

  • Vanilla Non-Random Walk Metropolis-Hastings Algorithm with Hastings correction ratio ratio (même si cela finira par être 1 lorsque vous utilisez une distribution de proposition symétrique).
  • Algorithme Vanilla Random Walk Metropolis-Hastings.
  • Algorithme Metropolis-Hastings indépendant de vanille.

Pas besoin de fournir les algorithmes de Metropolis car si je ne me trompe pas, la seule différence entre Metropolis et Metropolis-Hastings est que les premiers échantillonnent toujours à partir d'une distribution symétrique et qu'ils n'ont donc pas le rapport de correction de Hastings. Pas besoin de donner une explication détaillée des algorithmes. Je comprends les bases mais je suis un peu confus avec tous les différents noms pour les différentes variations de l'algorithme Metropolis-Hastings mais aussi avec la façon dont vous implémentez pratiquement le rapport de correction Hastings sur le MH à marche non aléatoire Vanilla. Veuillez ne pas copier / coller de liens qui répondent partiellement à mes questions, car je les ai probablement déjà vus. Ces liens m'ont conduit à cette confusion. Je vous remercie.

AstrOne
la source

Réponses:

10

Voilà, trois exemples. J'ai rendu le code beaucoup moins efficace qu'il ne le serait dans une application réelle afin de rendre la logique plus claire (j'espère.)

# 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)

Pour l'échantillonneur vanille, on obtient:

> 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 

ce qui est une faible probabilité d'acceptation, mais quand même ... régler la proposition aiderait ici, ou en adopter une autre. Voici les résultats de la proposition de marche aléatoire:

> 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 

Des résultats similaires, comme on pourrait l'espérer, et une meilleure probabilité d'acceptation (visant ~ 50% avec un paramètre.)

Et, pour être complet, l'échantillonneur d'indépendance:

> 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 

Parce qu'il ne "s'adapte" pas à la forme de la partie postérieure, il a tendance à avoir la probabilité d'acceptation la plus faible et est le plus difficile à régler correctement pour ce problème.

Notez que d'une manière générale, nous préférerions des propositions avec des queues plus grosses, mais c'est un tout autre sujet.

jbowman
la source
Q
1
@floyd - il est utile dans un certain nombre de situations, par exemple, si vous avez une idée décente de l'emplacement du centre de la distribution (par exemple, parce que vous avez calculé les estimations MLE ou MOM) et pouvez choisir une proposition détaillée distribution, ou si le temps de calcul par itération est très faible, auquel cas vous pouvez exécuter une chaîne très longue (ce qui compense les faibles taux d'acceptation) - vous permettant ainsi d'économiser du temps d'analyse et de programmation, qui pourrait être beaucoup plus important que même un temps d'exécution inefficace. Ce ne serait pas la proposition typique du premier essai, cependant, ce serait probablement la marche aléatoire.
jbowman
Qp(Xt+1|Xt)
1
p(Xt+1|Xt)=p(Xt+1)
1

Voir:

q()X

L' article de Wikipedia est une bonne lecture complémentaire. Comme vous pouvez le voir, le Metropolis a également un "rapport de correction" mais, comme mentionné ci-dessus, Hastings a introduit une modification qui permet des distributions de proposition non symétriques.

L'algorithme Metropolis est implémenté dans le package R mcmcsous la commande metrop().

Autres exemples de code:

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
la source
Merci pour votre réponse. Malheureusement, il ne répond à aucune de mes questions. Je ne vois que des métropoles à marche aléatoire, des métropoles à marche non aléatoire et des MH indépendants. Le rapport de correction Hastings dnorm(can,mu,sig)/dnorm(x,mu,sig)dans l'échantillonneur d'indépendance du premier lien n'est pas égal à 1. Je pensais qu'il était censé être égal à 1 lors de l'utilisation d'une distribution de proposition symétrique. Est-ce parce qu'il s'agit d'un échantillonneur indépendant et non d'un simple MH à marche non aléatoire? Si oui, quel est le ratio de Hastings pour un MH à marche non aléatoire simple?
AstrOne
p(courant|proposition)=p(proposition|courant)