Hit and run MCMC

16

J'essaie d'implémenter l'algorithme hit and run MCMC, mais j'ai un peu de mal à comprendre comment s'y prendre. L'idée générale est la suivante:

Pour générer un saut de proposition dans MH, nous:

  • Générer une direction partir d'une distribution à la surface de la sphère unitaire OdO
  • Générez une distance signée long de l'espace contraint.λ

Cependant, je n'ai aucune idée de la façon dont je devrais procéder pour l'implémenter dans R (ou tout autre langage).

Quelqu'un at-il un extrait de code qui me dirigerait dans la bonne direction?

BTW, je ne suis pas intéressé par une bibliothèque qui fait cette méthode, je veux essayer de la coder moi-même.

Merci beaucoup.

csgillespie
la source
1
Jamais entendu parler de cet algorithme auparavant, mais cela semble assez intéressant. Pourriez-vous fournir un lien vers une source explicative? Merci !
steffen
@steffen Voici un lien vers l' article original - enfin le rapport technique. Je n'ai jamais utilisé cette procédure non plus.
csgillespie
1
Quel est l'avantage du hit and run MCMC par rapport aux autres méthodes? Vitesse de convergence?
RockScience
@fRed: C'est pourquoi j'ai offert la prime. J'ai lu sur Hit and run, mais je ne sais pas dans quelles circonstances cela serait utile.
csgillespie
3
Le lien est maintenant rompu.
daknowles

Réponses:

11

Je n'ai pas regardé le papier que vous avez fourni, mais laissez-moi quand même essayer:

Si vous avez un espace de paramètres à dimensions, vous pouvez générer une direction aléatoire d uniformément répartie sur la surface de la sphère unitaire avecpd

x <- rnorm(p)
d <- x/sqrt(sum(x^2))

(cf Wiki ).

Ensuite, utilisez-le pour générer des propositions pour pour l'échantillonnage de rejet (en supposant que vous pouvez réellement évaluer la distribution pour d ).dd

En supposant que vous commencez en position et que vous avez accepté un d , générez une proposition y avecxdy

 lambda <- r<SOMEDISTRIBUTION>(foo, bar)
 y <- x + lambda * d

y

dd


Ajouté au profit de @ csgillespie:

D'après ce que j'ai pu rassembler par quelques google, le MCMC hit-and-run est utile principalement pour un mixage rapide si vous avez une cible (multivariée) qui a un support borné arbitrairement mais pas nécessairement connecté, car il vous permet de vous déplacer de n'importe quel point dans le soutien à tout autre en une seule étape. Plus ici et ici .

fabians
la source
1
Si cette réponse n'est pas satisfaisante, pourriez-vous expliquer pourquoi?
John Salvatier
Je ne suis pas sûr de @fred, mais quand j'ai offert la prime, je suppose que je voulais un peu plus d'informations sur le MCMC hit-and-run. Par exemple, pour quels types de problèmes conviendrait-il le mieux? Bien sûr, s'il n'y a pas d'autres réponses, cette question gagnerait la prime.
csgillespie
3
@csgillespie: J'ai modifié ma réponse pour mieux répondre à votre intérêt. Qu'on ne dise pas que je ne méritais pas la prime. ;)
fabians
2
Merci beaucoup pour le lien. L'une des raisons pour lesquelles j'ai placé la prime était que mes recherches sur Google ont révélé quelques discussions mathématiques sur la méthode, mais peu en termes d'applications pratiques. S'il vous plaît ne le prenez pas comme un léger si j'attends encore 48 heures avant d'attribuer la prime (c'est une prime particulièrement généreuse!)
csgillespie
4

Je suis tombé sur votre question lorsque je cherchais la référence d'origine pour Hit-and-Run. Merci pour ça! Je viens de mettre en place une implémentation de preuve de concept de hit-and-run pour PyMC à la fin de ce blog récent .

Abraham Flaxman
la source