Come posso calcolare una stima della densità posteriore da un precedente e una probabilità?


9

Sto cercando di capire come usare il teorema di Bayes per calcolare un posteriore, ma mi sto bloccando con l'approccio computazionale, ad esempio, nel caso seguente non mi è chiaro come prendere il prodotto del precedente e della probabilità e quindi calcolare il posteriore:

Per questo esempio, sono interessato a calcolare la probabilità posteriore di e utilizzo un normale normale precedente a p (\ mu) \ sim N (\ mu = 0, \ sigma = 1) , ma voglio sapere come calcolare il posteriore da un precedente \ mu che è rappresentato da una catena MCMC, quindi userò 1000 campioni come punto di partenza.μμμ p(μ)N(μ=0,σ=1)μ

  • campione 1000 dal precedente.

    set.seed(0)
    prior.mu      <- 0
    prior.sigma   <- 1
    prior.samples <- sort(rnorm(1000, prior.mu, prior.sigma))
    
  • fare alcune osservazioni:

    observations <- c(0.4, 0.5, 0.8, 0.1)
    
  • e calcola la probabilità, ad esempio p(y|μ,σ) :

    likelihood <- prod(dnorm(observations, mean(prior.samplse), sd(prior.samples)))
    

quello che non capisco bene è:

  1. quando / come moltiplicare il priore per la probabilità?
  2. quando / come normalizzare la densità posteriore?

nota: sono interessato alla soluzione computazionale generale che potrebbe essere problemi generalizzabili senza soluzione analitica


1
Non è chiaro quali siano le diverse distribuzioni nel tuo esempio. Si prega di chiarire quali sono le distribuzioni precedenti / condizionate. Perché è possibile che tu abbia un po 'di terminologia confusa.
Nick Sabbe,

@Nick hai ragione. Grazie per il feedback. Ho tentato di chiarire.
Abe,

Risposte:


8

Hai diverse cose confuse. La teoria parla di moltiplicare la distribuzione precedente e la probabilità, non i campioni della distribuzione precedente. Inoltre non è chiaro di cosa tu abbia il priore, è forse un priore sulla media di qualcosa? o qualcos'altro?

Quindi hai le cose invertite con verosimiglianza, le tue osservazioni dovrebbero essere x con disegni precedenti o costanti fisse conosciute come deviazione media e standard. E anche allora sarebbe davvero il prodotto di 4 chiamate a dnorm con ciascuna delle tue osservazioni come x e la stessa media e deviazione standard.

Ciò che non è davvero chiaro è quello che stai cercando di fare. Qual è la tua domanda? a quali parametri sei interessato? quali sono i precedenti su tali parametri? ci sono altri parametri? hai priori o valori fissi per quelli?

Cercare di fare le cose nel modo in cui ti trovi attualmente ti confonderà di più fino a quando non capirai esattamente quale sia la tua domanda e lavorerai da lì.

Di seguito è aggiunto dovuto dopo la modifica della domanda originale.

Ti mancano ancora alcuni pezzi e probabilmente non capisci tutto, ma possiamo iniziare da dove ti trovi.

Penso che tu stia confondendo alcuni concetti. C'è la probabilità che mostri la relazione tra i dati e i parametri, stai usando la normale che ha 2 parametri, la media e la deviazione standard (o varianza o precisione). Poi ci sono le distribuzioni precedenti sui parametri, hai specificato un precedente normale con media 0 e sd 1, ma la media e la deviazione standard sono completamente diverse dalla media e la deviazione standard della probabilità. Per essere completo devi conoscere la SD di probabilità o inserire un precedente sulla SD di probabilità, per semplicità (ma meno reale) Presumo che sappiamo che la SD di probabilità è (nessun buon motivo se non che funziona ed è diverso da 1).12

Quindi possiamo iniziare in modo simile a quello che hai fatto e generare dal precedente:

> obs <- c(0.4, 0.5, 0.8, 0.1)
> pri <- rnorm(10000, 0, 1)

Ora abbiamo bisogno di calcolare le probabilità, questo si basa sui precedenti disegni della media, la probabilità con i dati e il valore noto della SD. La funzione dnorm ci darà la probabilità di un singolo punto, ma dobbiamo moltiplicare i valori per ciascuna delle osservazioni, ecco una funzione per farlo:

> likfun <- function(theta) {
+ sapply( theta, function(t) prod( dnorm(obs, t, 0.5) ) )
+ }

Ora possiamo calcolare la probabilità per ogni sorteggio dal precedente per la media

> tmp <- likfun(pri)

Ora per ottenere il posteriore dobbiamo fare un nuovo tipo di disegno, un approccio simile al campionamento del rifiuto è quello di campionare dai disegni medi precedenti proporzionali alla probabilità per ciascun disegno precedente (questo è il più vicino al passo di moltiplicazione che eri chiedere di):

> post <- sample( pri, 100000, replace=TRUE, prob=tmp )

Ora possiamo guardare i risultati dei disegni posteriori:

> mean(post)
[1] 0.4205842
> sd(post)
[1] 0.2421079
> 
> hist(post)
> abline(v=mean(post), col='green')

e confrontare i risultati di cui sopra con i valori di forma chiusa della teoria

> (1/1^2*mean(pri) + length(obs)/0.5^2 * mean(obs))/( 1/1^2 + length(obs)/0.5^2 )
[1] 0.4233263
> sqrt(1/(1+4*4))
[1] 0.2425356

Non è una cattiva approssimazione, ma probabilmente sarebbe meglio usare uno strumento McMC integrato per disegnare dalla parte posteriore. La maggior parte di questi strumenti campiona un punto alla volta non in lotti come sopra.

Più realisticamente non conosceremmo la SD della probabilità e avremmo bisogno di un precedente anche per quello (spesso il precedente sulla varianza è un o gamma), ma poi è più complicato da calcolare (McMC è utile ) e non esiste un modulo chiuso da confrontare.χ2

La soluzione generale è utilizzare gli strumenti esistenti per eseguire i calcoli McMC come WinBugs o OpenBugs (BRugs in R fornisce un'interfaccia tra R e Bugs) o pacchetti come LearnBayes in R.


Grazie per avermi aiutato a chiarire ulteriormente questo aspetto. Ho aggiornato la mia risposta, anche se non sono ancora chiaro. La mia domanda è "qual è la migliore stima di dato il precedente e i dati?"; non ci sono altri parametri. μ
Abe,

grazie per avermi scomposto per me; Ho avuto dei momenti difficili ma questo aiuta.
Abe,
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.