Un altro problema scoraggiante nelle statistiche. La domanda è vecchia, ma gli esempi introduttivi online sono difficili da trovare. Consentitemi quindi di semplificare due grandi esempi nel caso in cui qualcuno segua la passeggiata casuale Markov di PageRank atterra qui confuso da MCMC e pieno di aspettative per una risposta facile da seguire. Quanto probabile? Questa potrebbe essere una domanda di follow-up.
FIRST EXAMPLE:
N(0,1) codice dal post qui per comodità e per le annotazioni.
La difficoltà sta nel rendersi conto che dopo aver attraversato tutti i passaggi meccanici, c'è solo un trucco magico: la decisione binaria di accettare o rifiutare un valore proposto .
xmean
0sd
1rnorm(10000)
eps
ϵxixi+1runif(1, - eps, eps)
xi .
Ogni valore proposto differirebbe quindi dal valore precedente in modo casuale e entro i limiti di [- eps,+ eps]
.
ii+1
N(0,1)Xi + 1 ) con il precedente (valore già accettato), (Xio), proprio come questo:
E prendiamo il rapporto di entrambi i valori: min(1, dnorm(candidate_value)/dnorm(x))
. Poiché vogliamo una probabilità, il calcolo risultante non può andare oltre1, che si verifica ogni volta che il N( 0 , 1 ) p df a Xi + 1 (valore candidato) è maggiore di a Xio, equivalenti all'accettazione automatica del valore proposto e alla spiegazione della min(1, ...)
parte del codice. Altrimenti, più si avvicina il dnorm
valore di valore proposto si è vicino al valore precedente , maggiori sono le probabilità che venga accettato.
Quindi abbiamo una probabilità di accettazione, ma dobbiamo prendere una decisione binaria (accettare il nuovo valore proposto o rifiutarlo). E qui arriva il trucco magico: se la probabilità calcolata min(1, dnorm(candidate_value)/dnorm(x))
è maggiore di un runif(1)
pareggio uniforme da0 per 1(il più vicino possibile al lancio di una moneta per un valore continuo), accettiamo e compiliamo l' x[i+1]
ingresso della catena con il valore proposto ; altrimenti, lo riempiamo con una ripetizione del valore precedente , x[i]
... L'idea sarebbe, meglio due dello stesso di uno troppo lontano nelle code.
Facciamo questo migliaia di volte e noi raccogliamo tutti questi valori (solo i valori accettati e ripetuti), e quando tracciamo l'istogramma, otteniamo una bella curva normale con un sd
vicino1e centrato su 0.
Un ultimo punto: da dove iniziare? Probabilmente non rilevante, ma nella simulazione, inseriamo il primo valore come0, x = 0; vec[1] = x
prima di passare in rassegna tutto il resto delle iterazioni e lasciare che il processo segua il suo corso.
SECOND EXAMPLE:
Questo è più interessante e fa riferimento alla stima dei parametri di una curva di regressione lineare calcolando le probabilità di log per i parametri casuali dati un set di dati . Tuttavia, l'esegesi delle linee di codice è costruita nella simulazione condensata salvata qui , seguendo passaggi molto simili al primo esempio.