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.