Robiąc MCMC: użyj jags / stan lub sam go zaimplementuj


13

Jestem nowy w badaniach Bayesian Statistics. Słyszałem od badaczy, że badacze bayesowscy lepiej wdrażają MCMC samodzielnie, niż używając narzędzi takich jak JAGS / Stan. Czy mogę zapytać, jaka jest korzyść z samodzielnego wdrażania algorytmu MCMC (w „niezbyt szybkich” językach, takich jak R), z wyjątkiem celu uczenia się?


Ponieważ wtedy możesz sam wybrać rozkład propozycji, powinieneś wybrać taki, aby Łańcuch Markowa wynikający z niego zbiegał się jak najszybciej do tylnej części ciała.

dzięki! Czy to jedyny powód?
user112758

4
Jeśli jesteś badaczem stosowanym, który chce dowiedzieć się więcej o Bayesie, używając go do aplikacji, poleciłbym zacząć od JAGS lub Stan, a następnie przejść do pisania własnego MCMC, jeśli uznasz to za konieczne. Pamiętaj, że JAGS i Stan mają nieco inne mocne strony i ograniczenia.
conjugateprior

dzięki! Tak, prowadzę badania stosowane. Opowiedz mi więcej o ograniczeniach JAGS i Stana. Najpierw wypróbowałem Stana, ale właśnie odkryłem, że nie ma funkcji „monitorowania online” ani „próbkowania, aż do konwergencji” lub dodatków --- to denerwujące, mogę teraz wypróbować JAGS.
user112758,

Odpowiedzi:


26

Ogólnie rzecz biorąc, zdecydowanie sugerowałbym, aby nie kodować własnego MCMC dla prawdziwej zastosowanej analizy bayesowskiej. Jest to zarówno praca, jak i czas, i bardzo prawdopodobne, że wprowadzą błędy w kodzie. Próbniki Blackbox, takie jak Stan, już używają bardzo wyrafinowanych samplerów. Zaufaj mi, nie kodujesz próbnika tego kalibru tylko dla jednej analizy!

Istnieją szczególne przypadki, w których nie będzie to wystarczające. Na przykład, gdybyś musiał przeprowadzić analizę w czasie rzeczywistym (tj. Decyzja komputera na podstawie przychodzących danych), te programy nie byłyby dobrym pomysłem. Wynika to z faktu, że Stan wymaga skompilowania kodu C ++, co może zająć znacznie więcej czasu niż uruchomienie już przygotowanego samplera dla stosunkowo prostych modeli. W takim przypadku możesz napisać własny kod. Ponadto uważam, że istnieją specjalne przypadki, w których pakiety takie jak Stan bardzo źle sobie radzą, takie jak niegaussowskie modele przestrzeni państwowej (pełne ujawnienie: wierzę , że Stan źle sobie radzi w tym przypadku, ale nie wiem). W takim przypadku warto wdrożyć niestandardową MCMC. Ale to wyjątek, nie reguła!

Szczerze mówiąc, myślę, że większość badaczy, którzy piszą samplery do pojedynczej analizy (a tak się dzieje, widziałem to), robi to, ponieważ lubią pisać własne samplery. Przynajmniej mogę powiedzieć, że należę do tej kategorii (tzn. Jestem rozczarowany, że pisanie własnego samplera nie jest najlepszym sposobem na robienie rzeczy).

Ponadto, chociaż nie ma sensu pisać własnego samplera do pojedynczej analizy , warto napisać własny kod dla klasy analiz. Ponieważ JAG, Stan itp. Są samplerami z czarnej skrzynki, zawsze możesz przyspieszyć, specjalizując się w danym modelu, chociaż ilość ulepszeń zależy od modelu. Ale napisanie od podstaw niezwykle wydajnego samplera to może 10–1 000 godzin pracy, w zależności od doświadczenia, złożoności modelu itp. Jeśli prowadzisz badania w metodach bayesowskich lub piszesz oprogramowanie statystyczne, to w porządku; to twoja praca. Ale jeśli twój szef powie „Hej, możesz przeanalizować zestaw danych z powtarzanymi pomiarami?” i spędzasz 250 godzin na pisaniu wydajnego samplera, twój szef prawdopodobnie będzie zdenerwowany. W przeciwieństwie do tego, mogłeś napisać ten model w Stanie, powiedzmy, w 2 godziny i miałeś 2 minuty czasu pracy zamiast 1 minuty czasu pracy osiągniętego przez wydajny sampler.


3
+1. Ponadto Stan nie zajmuje się bezpośrednio niektórymi problemami związanymi z dyskretnymi dystrybucjami, więc musisz wiedzieć wystarczająco dużo, aby je zintegrować, co samo w sobie nie jest proste, więc może to być przypadek, w którym może pomóc rozwinięcie własnego. Wierzę, że JAGS obsługuje takie przypadki bezpośrednio, więc jeśli możesz zachować odmienne filozofie BŁĘDÓW / JAGSÓW i Stana w swoim umyśle, najlepiej byłoby po prostu przełączać się między nimi.
Wayne

Co więcej, Stan może mieć problemy, gdy diagonalna metryka euklidesowa nie jest dobrze dopasowana do geometrii tylnej; dzieje się tak między innymi, gdy istnieje tylko wąski, dziwnie ukształtowany obszar tylnej części ciała, który ma duże prawdopodobieństwo. Rezultat jest taki, że próbkowanie z tyłu jest jak próba jazdy na rowerze wzdłuż krawędzi urwiska: możesz „spaść”, jeśli skręcisz źle!
Sycorax mówi Przywróć Monikę

2
+1. Moim ogólnym zaleceniem dla studentów jest kodowanie go w JAGS. Jeśli to nie działa dobrze, zakoduj to w Stanie. Jeśli to nie działa dobrze, zacznij pisać własny sampler. Istnieją również pewne modele, np. Modele przestrzenne, w których możesz chcieć użyć BŁĘDÓW. I niektóre modele, np. Niegaussowskie modele przestrzeni stanów, w których chcesz używać NIMBLE. Koszt alternatywny rozpoczęcia pisania własnego samplera jest po prostu zbyt wysoki.
jaradniemi

Nie rozumiem przypadku „w czasie rzeczywistym” - jeśli możliwe jest posiadanie „już przygotowanego” własnego samplera, dlaczego nie jest tak łatwe w użyciu już skompilowanego modelu Stana? Zastanawiam się także, czy jakieś MCMC jest wystarczająco szybkie do aplikacji w czasie rzeczywistym.
Juho Kokkala,

1
I nie jestem wystarczająco zaznajomiony ze Stanem, aby wiedzieć, co dokładnie wymaga skompilowania nowych modeli, ale nietrudno jest wyobrazić sobie, że bez względu na to ograniczenie istnieje model dynamiczny, który wraz z pojawieniem się nowych danych stałby się bardziej złożony i dlatego konieczna będzie ponowna kompilacja. Myślę, że metody nieparametryczne (w których przestrzeń parametrów rośnie wraz z rozmiarem próbki) pasowałyby do tych kryteriów? Ale mogą istnieć sprytne sposoby na obejście tego.
Cliff AB

6

To pytanie opiera się głównie na opiniach, ale myślę, że tutaj jest wystarczająco dużo, aby zapisać odpowiedź. Może istnieć wiele powodów, aby kodować własny sampler pod kątem problemu badawczego. Tutaj jest kilka z nich

  1. Propozycja: Jak sugeruje fcop w komentarzu, jeśli próbką jest MH, wówczas kodowanie własnego próbnika pozwala bawić się z rozkładami propozycji, aby uzyskać najlepszy próbnik miksowania.

  2. Elastyczność: Wbudowane programy mogą nie zapewniać pożądanej elastyczności. Możesz zacząć od określonej losowej wartości lub użyć określonej struktury początkowej.

  3. Zrozumienie: Kodowanie własnego próbnika pomaga zrozumieć jego zachowanie, dając wgląd w proces łańcucha Markowa. Jest to przydatne dla badacza pracującego nad problemem.

  4. Onus: Jeśli dane, na których dokonuję wszystkich wniosków Bayesa, pochodzą z programu, którego nie kodowałem, to ciężar wnioskowania nie jest już dla mnie. Jako badacz chciałbym wziąć pełną odpowiedzialność za metody / wyniki, które przedstawiam. Korzystanie z wbudowanych metod nie pozwala na to.

Prawdopodobnie jest więcej powodów, ale te cztery sprawiają, że koduję własne samplery.


6
Powiedziałbym, że powód „zaufania” jest dyskusyjny: Stan jest open source i ma wielu współpracowników, więc wiele osób spojrzało na jego kod źródłowy i dlatego jest mało prawdopodobne, aby zawierał poważne błędy. Z drugiej strony, jeśli zrobisz to sam, zawsze możesz przeoczyć błąd, który popełniłeś - i każdy popełnia błędy, to tylko kwestia liczby linii, które piszesz ...
Tim

@Tim Zgadzam się. Zmieniłem ten punkt, aby odzwierciedlić to, co próbowałem powiedzieć. Dzięki.
Greenparker,

5
+1 za argument Zrozumienie. Jednak argument Onus wydaje się nieco zawyżony. Prawie wszystko, co sam kodujesz, będzie polegać na czyimś języku statystycznym, bibliotece algebry liniowej, generatorze liczb losowych itp., Więc „wzięcie odpowiedzialności” jest kwestią stopnia.
conjugateprior

@conjugateprior Absolutnie zgodził się. Dlatego moja odpowiedź na to pytanie była w pierwszej osobie. To była wyłącznie moja opinia.
Greenparker

4

Dałem +1 odpowiedzi Cliff AB. Aby dodać jeden mały smakołyk, jeśli chcesz pracować na niższym poziomie, ale nie na poziomie kodu-wszystko-sam, powinieneś poszukać pakietu LaplacesDemon . Oryginalny autor był genialny, ale wydaje się, że spadł z planszy, a pakiet został przejęty przez kogoś innego. (Wydaje mi się, że jest na Githubie.)

Implementuje imponującą liczbę algorytmów używanych w MCMC, a dołączone winiety są warte przeczytania, nawet jeśli nie korzystasz z pakietu. Ma prawie każdy rodzaj samplera, o którym czytasz. Kodujesz w inny sposób niż BŁĘDY / JAGS lub Stan i wszystko jest w R, ale często jest tak wydajne, że jest konkurencyjne.


1
Bezwstydna wtyczka: możesz także użyć [nimble] (r-nimble.org), która pozwala dostosować MCMC (tj. Użyć próbnika wycinka dla tego węzła, zablokować aktualizator dla tej grupy węzłów itp.) Bez konieczności przepisywania to próbniki za każdym razem. Możesz także pisać własne samplery, które zostaną bezpośrednio zaimplementowane! Ujawnienie: Pracowałem nad tym projektem.
Cliff AB

@CliffAB: Brzmi podobnie LaplacesDemon, jeśli znasz się na tym. Miło mi to słyszeć nimble. Przynajmniej go pobiorę. (Chociaż wiele winiet LaplacesDemon może być warte pobrania, nawet jeśli używasz zwinnego.) ... Ohhh, po prostu poszedł na stronę. Jeśli jego SMC jest łatwy w użyciu, zostanę wielkim fanem. Jedyny pakiet R, który widziałem, który robi SMC, jest przerażająco złożony.
Wayne

@CliffAB: Wow, po przeczytaniu strony nimbleinternetowej robi wrażenie. Dlaczego nigdy o tym nie słyszałem? Wygląda to na świetną opcję dla osób przyzwyczajonych do języka modelowania BŁĘDY / JAGS. Oczywiście dokonają możliwie najlepszych porównań na stronie, ale do tej pory mi się podobało. (Z wyjątkiem tego, że z rstanarmi brms, którzy używają Stana pod maską, mistrzem łatwości użycia w R byłby Stan.)
Wayne

wciąż jest bardzo nowy: wydano v0.1 Myślę, że nieco ponad 2 lata temu? A SMC była ogromną motywacją dla tego projektu: PI dokonał znacznej publikacji na temat filtrów cząstek i denerwował się pisaniem ich od zera za każdym razem. Ale byłem trochę przy bieżącej pracy, aby nadążyć za obecnym stanem samplerów SMC; kiedy odszedłem (prawie dwa lata temu) właśnie stworzyliśmy bardzo prymitywny.
Cliff AB

1
Powiedz ten artykuł arXiv, który może Cię zainteresować.
Cliff AB
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.