Próbowałem zrozumieć algorytm Metropolis-Hastings, aby napisać kod do oszacowania parametrów modelu (tj. ). Według bibliografii algorytm Metropolis-Hastings ma następujące kroki:
- Wygeneruj
gdzie
Jak chciałbym zadać kilka pytań:
- Bibliografia stwierdza, że jeśli jest rozkładem symetrycznym, stosunek wynosi 1, a algorytm nazywa się Metropolis. Czy to jest poprawne? Jedyną różnicą między Metropolis i Metropolis-Hastings jest to, że w pierwszej zastosowano rozkład symetryczny? A co z Metropolis „Random Walk” (-Hastings)? Czym różni się od pozostałych dwóch?
- Większość przykładowego kodu, który znajduję on-line, wykorzystuje rozkład propozycji Gaussa a zatem gdzie to współczynnik prawdopodobieństwa. Co jeśli rozkład propozycji jest rozkładem Poissona? Wydaje mi się, że rozumiem racjonalnie, dlaczego ten stosunek nie staje się 1, gdy stosuje się rozkład asymetryczny, ale nie jestem pewien, czy rozumiem go matematycznie lub jak zaimplementować go za pomocą kodu. Czy ktoś mógłby mi podać prosty kod (C, python, R, pseudo-kod lub cokolwiek innego) przykład algorytmu Metropolis-Hastings wykorzystujący niesymetryczny rozkład propozycji?
mcmc
metropolis-hastings
AstrOne
źródło
źródło
Odpowiedzi:
Tak, to jest poprawne. Algorytm Metropolis jest szczególnym przypadkiem algorytmu MH.
W przypadkowym spacerze rozkład propozycji jest ponownie wyśrodkowany po każdym kroku na wartości ostatnio wygenerowanej przez łańcuch. Zasadniczo w przypadku chodzenia losowego rozkład propozycji jest gaussowski, w którym to przypadku chodzenie losowe spełnia wymóg symetrii, a algorytmem jest metropolia. Przypuszczam, że mógłbyś wykonać losowy „pseudo” spacer z asymetrycznym rozkładem, który spowodowałby, że propozycje zbyt dryfowałyby w przeciwnym kierunku przekosu (lewy rozkład pochyliłby propozycje w prawo). Nie jestem pewien, dlaczego to zrobiłeś, ale mógłbyś i byłby to algorytm pospieszny metropolii (tj. Wymagałby dodatkowego współczynnika proporcji).
W przypadku niepolotowego algorytmu chodzenia rozkłady propozycji są ustalone. W wariancie chodzenia losowego środek rozkładu propozycji zmienia się przy każdej iteracji.
Następnie musisz użyć MH zamiast zwykłej metropolii. Przypuszczalnie byłoby to próbkowanie dystrybucji dyskretnej, w przeciwnym razie nie chcesz używać funkcji dyskretnej do generowania swoich propozycji.
W każdym razie, jeśli rozkład próbkowania jest obcięty lub masz wcześniejszą wiedzę na temat jego pochylenia, prawdopodobnie chcesz zastosować asymetryczny rozkład próbkowania, a zatem musisz użyć metropolii.
Oto metropolia:
Spróbujmy użyć tego do próbkowania rozkładu bimodalnego. Po pierwsze, zobaczmy, co się stanie, jeśli użyjemy przypadkowego spaceru do naszego rekwizytu:
Teraz spróbujmy próbkować przy użyciu ustalonego rozkładu propozycji i zobaczmy, co się stanie:
Na początku wygląda to dobrze, ale jeśli spojrzymy na gęstość tylnej ...
zobaczymy, że jest całkowicie zablokowane na lokalnym maksimum. Nie jest to całkowicie zaskakujące, ponieważ właściwie skoncentrowaliśmy tam naszą dystrybucję propozycji. To samo stanie się, jeśli skoncentrujemy to na innym trybie:
Możemy spróbować upuścić naszą propozycję między dwoma trybami, ale musimy ustawić naprawdę dużą wariancję, aby mieć szansę na zbadanie jednego z nich
Zauważ, że wybór centrum dystrybucji naszego wniosku ma znaczący wpływ na wskaźnik akceptacji naszego próbnika.
My nadal utknąć w bliżej z dwóch trybów. Spróbujmy upuścić to bezpośrednio między dwoma trybami.
Wreszcie zbliżamy się do tego, czego szukaliśmy. Teoretycznie, jeśli pozwolimy, aby próbnik działał wystarczająco długo, możemy pobrać reprezentatywną próbkę z dowolnego z tych rozkładów propozycji, ale losowy spacer bardzo szybko wytworzył użyteczną próbkę i musieliśmy skorzystać z naszej wiedzy o tym, jak przypuszczano, że tył aby dostroić ustalone rozkłady próbkowania w celu uzyskania użytecznego wyniku (który, prawdę mówiąc, jeszcze nie mamy
y_trace4
).Później postaram się zaktualizować o przykład przyspieszenia metropolii. Powinieneś być w stanie dość łatwo zobaczyć, jak zmodyfikować powyższy kod, aby uzyskać algorytm przyspieszenia metropolii (wskazówka: wystarczy dodać dodatkowy współczynnik do
logR
obliczeń).źródło
R=exp(logR)
:R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))
zarówno dla losowego, jak i nieprzypadkowego chodzenia MH. Czy to jest poprawne?