Fare MCMC: usa jags / stan o implementalo da solo


13

Sono nuovo nella ricerca statistica bayesiana. Ho sentito dai ricercatori che i ricercatori bayesiani implementano meglio MCMC da soli piuttosto che usare strumenti come JAGS / Stan. Posso chiederti quali sono i vantaggi dell'implementazione dell'algoritmo MCMC da soli (in un linguaggio "non abbastanza veloce" come R), tranne per scopi di apprendimento?


Poiché quindi puoi scegliere tu stesso la distribuzione della tua proposta, dovresti sceglierla in modo tale che la catena di Markov risultante converga il più velocemente possibile verso la parte posteriore.

Grazie! È l'unica ragione?
user112758

4
Se sei un ricercatore applicato che vuole saperne di più su Bayes utilizzandolo per le applicazioni, ti consiglio di iniziare con JAGS o Stan e poi passare a scrivere il tuo MCMC se trovi che "ne hai bisogno". Ricorda che JAGS e Stan hanno punti di forza e limitazioni leggermente diversi.
conjugateprior

Grazie! Sì, sto facendo ricerche applicate. Mi diresti di più sui limiti di JAGS e Stan. Ho provato per la prima volta Stan, ma ho appena scoperto che non ha funzionalità di "monitoraggio online" o "campione fino a convergere" o componenti aggiuntivi --- questo è fastidioso, ora posso provare JAGS.
user112758

Risposte:


26

In generale, suggerirei vivamente di non codificare il proprio MCMC per una vera analisi bayesiana applicata. Questo è sia una buona dose di lavoro che di tempo e molto probabilmente introdurrà bug nel codice. I campionatori Blackbox, come Stan, usano già campionatori molto sofisticati. Fidati di me, non codificherai un campionatore di questo calibro solo per un'analisi!

Ci sono casi speciali in cui in questo non sarà sufficiente. Ad esempio, se fosse necessario eseguire un'analisi in tempo reale (ad esempio una decisione del computer basata sui dati in arrivo), questi programmi non sarebbero una buona idea. Questo perché Stan richiede la compilazione di codice C ++, che potrebbe richiedere molto più tempo rispetto al semplice esecuzione di un campionatore già preparato per modelli relativamente semplici. In tal caso, potresti voler scrivere il tuo codice. Inoltre, credo che ci siano casi speciali in cui pacchetti come Stan fanno molto male, come i modelli di spazio di stato non gaussiani (divulgazione completa: credo che Stan faccia male in questo caso, ma non lo so). In tal caso, può valere la pena implementare un MCMC personalizzato. Ma questa è l'eccezione, non la regola!

Ad essere onesti, penso che la maggior parte dei ricercatori che scrivono campionatori per una singola analisi (e questo accade, l'ho visto) lo fanno perché a loro piace scrivere i propri campionatori. Per lo meno, posso dire di rientrare in quella categoria (cioè sono deluso dal fatto che scrivere il mio campionatore non sia il modo migliore per fare le cose).

Inoltre, sebbene non abbia senso scrivere il proprio campionatore per una singola analisi , può avere molto senso scrivere il proprio codice per una classe di analisi. Dato che JAG, Stan, ecc. Sono campionatori a scatola nera, puoi sempre rendere le cose più veloci specializzandoti per un determinato modello, sebbene la quantità di miglioramento dipenda dal modello. Ma scrivere un campionatore estremamente efficiente da zero richiede forse 10-1000 ore di lavoro, a seconda dell'esperienza, della complessità del modello, ecc. Se stai facendo ricerche sui metodi bayesiani o scrivendo software statistico, va bene; è il tuo lavoro. Ma se il tuo capo dice "Ehi, puoi analizzare questo set di dati di misure ripetute?" e passi 250 ore a scrivere un campionatore efficiente, è probabile che il tuo capo sia arrabbiato. Al contrario, avresti potuto scrivere questo modello in Stan in, diciamo, 2 ore e avere 2 minuti di autonomia invece di 1 minuto di autonomia raggiunti dal campionatore efficiente.


3
+1. Inoltre, Stan non gestisce direttamente alcuni problemi che coinvolgono distribuzioni discrete, quindi devi sapere abbastanza per integrarli, il che non è di per sé semplice, quindi potrebbe essere un caso in cui il roll-up dei tuoi potrebbe aiutare. Credo che JAGS gestisca direttamente questi casi, quindi se puoi tenere separate le diverse filosofie di BUGS / JAGS e Stan nella tua mente, sarebbe meglio passare da una all'altra.
Wayne,

Inoltre, Stan può avere problemi in cui una metrica euclidea diagonale non è adatta alla geometria del posteriore; questo è il caso tra l'altro quando esiste solo una regione stretta, di forma stranamente posteriore, che ha molte probabilità. Il risultato è che campionare il posteriore è come provare a guidare una bici lungo il bordo di una scogliera: potresti "cadere" se fai una svolta sbagliata!
Sycorax dice di reintegrare Monica il

2
+1. La mia raccomandazione generale agli studenti è di codificarla in JAGS. Se il problema persiste, codificalo in Stan. Se il problema persiste, inizia a scrivere il tuo campionatore. Esistono anche alcuni modelli, ad esempio modelli spaziali, in cui potresti voler usare BUG. E alcuni modelli, ad esempio modelli di spazio di stato non gaussiani, in cui si desidera utilizzare NIMBLE. Il costo opportunità di iniziare scrivendo il proprio campionatore è troppo alto.
Jaradniemi,

Non capisco il caso "in tempo reale" - se è possibile avere un proprio campionatore "già preparato", perché non è così facile usare un modello Stan già compilato? Mi chiedo anche se qualsiasi MCMC è abbastanza veloce per applicazioni in tempo reale.
Juho Kokkala,

1
E non ho abbastanza familiarità con Stan per sapere cosa richiede esattamente la compilazione di nuovi modelli, ma non è difficile immaginare che qualunque sia la restrizione, esiste un modello dinamico tale che, man mano che arrivano nuovi dati, il modello diventerà più complesso e così sarebbe necessaria la ricompilazione. Penso che i metodi non parametrici (in cui lo spazio dei parametri cresce con la dimensione del campione) si adatteranno a quei criteri? Ma ci possono essere modi intelligenti per aggirare questo.
Cliff AB,

6

Questa domanda è principalmente basata sull'opinione, ma penso che ci sia abbastanza qui per scrivere una risposta. Potrebbero esserci molte ragioni per codificare il proprio campionatore per un problema di ricerca. Ecco qui alcuni di loro

  1. Proposta: come suggerito da fcop nel loro commento, se il campione è MH, la codifica del proprio campionatore consente di giocare con le distribuzioni della proposta per ottenere il miglior campionatore di missaggio.

  2. Flessibilità: nei programmi integrati potrebbe non darti la flessibilità che desideri. Potresti voler iniziare da un valore casuale specifico o utilizzare una struttura seme specifica.

  3. Comprensione: la codifica del proprio campionatore consente di comprendere il comportamento del campionatore, fornendo approfondimenti sul processo della catena Markov. Ciò è utile per un ricercatore che lavora al problema.

  4. Onus: se i dati su cui sto facendo tutta la mia deduzione bayesiana provengono da un programma che non ho codificato, allora l'onere dell'inferenza non è più su di me. Come ricercatore, vorrei assumermi la piena responsabilità dei metodi / risultati che presento. L'uso di metodi integrati non ti consente di farlo.

Probabilmente ci sono più motivi, ma questi sono i quattro che mi fanno codificare i miei campionatori.


6
Direi che la ragione della "fiducia" è discutibile: Stan è open-source e ha molti collaboratori, quindi più persone hanno esaminato il suo codice sorgente e quindi è improbabile che abbia gravi bug. D'altra parte, se lo fai da solo puoi sempre trascurare l'insetto che hai creato - e tutti fanno errori è solo una questione di numero di righe di codice che scrivi ...
Tim

@Tim sono d'accordo. Ho cambiato questo punto per riflettere ciò che stavo cercando di dire. Grazie.
Greenparker,

5
+1 per l'argomento Comprensione. Tuttavia, l'argomento Onus sembra un po 'sopravvalutato. Quasi tutto ciò che codifichi tu stesso dipenderà dal linguaggio statistico di qualcun altro, dalla biblioteca di algebra lineare, dal generatore di numeri casuali, ecc. Quindi "assumersi la responsabilità" è una questione di laurea.
conjugateprior

@conjugateprior Assolutamente d'accordo. Ecco perché la mia risposta è stata in prima persona. Questa era puramente la mia opinione.
Greenparker,

4

Ho dato un +1 alla risposta di Cliff AB. Per aggiungere un piccolo bocconcino, se si desidera lavorare a un livello inferiore ma non fino al livello di codice tutto-te stesso, è necessario cercare il pacchetto LaplacesDemon . L'autore originale è stato brillante, ma sembra essere uscito dalla griglia e il pacchetto è stato rilevato da qualcun altro. (Credo su Github.)

Implementa un numero impressionante di algoritmi utilizzati in MCMC e le vignette incluse valgono la lettura anche se non si utilizza il pacchetto. Praticamente qualsiasi tipo di campionatore di cui leggi, ha. Si codifica in modo diverso rispetto a BUGS / JAGS o Stan, ed è tutto in R, ma spesso a volte è così efficiente da essere competitivo.


1
Plug senza vergogna: puoi anche usare [nimble] (r-nimble.org) che ti consente di personalizzare il tuo MCMC (cioè usare un campionatore di sezioni per questo nodo, aggiornare i blocchi per quel gruppo di nodi, ecc.) Senza la necessità di riscrivere questo campionatori ogni volta. E puoi anche scrivere i tuoi campionatori per essere implementati direttamente! Divulgazione: lavoravo su questo progetto.
Cliff AB,

@CliffAB: sembra simile a LaplacesDemon, se hai familiarità con quello. Sono contento di sentire nimbleanche. Almeno lo scaricherò. (Anche se le vignette multiple di LaplacesDemon potrebbero valere il download anche se si utilizza agile.) ... Ohhh, sono appena andato alla pagina. Se il suo SMC è facile da usare, diventerò un grande fan. L'unico pacchetto R che ho visto che fa SMC è orribilmente complesso.
Wayne,

@CliffAB: Wow, dopo aver letto il nimblesito web, è piuttosto impressionante. Perché non ne ho mai sentito parlare? Sembra un'ottima opzione per le persone abituate al linguaggio di modellazione BUGS / JAGS. Certo, faranno i migliori confronti possibili sul sito Web, ma mi piace ancora finora. (Tranne che con rstanarme brms, che usano Stan sotto il cofano, il campione della facilità d'uso in-R sarebbe Stan.)
Wayne

è ancora molto nuovo: v0.1 è stato rilasciato, credo, poco più di 2 anni fa? E SMC è stato un grande motivatore per il progetto: il PI ha fatto un'enorme pubblicazione sui filtri antiparticolato e si è infastidito a scriverli ogni volta da zero. Ma ho lavorato un po 'con il lavoro attuale per stare al passo con lo stato attuale dei campionatori SMC; quando me ne sono andato (quasi due anni fa) ne avevamo appena creato uno molto primitivo.
Cliff AB,

1
Di 'solo questo articolo di arXiv che potrebbe interessarti.
Cliff AB,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.