Karışık birkaç şey var. Teori, önceki dağılımdan örnekler değil, önceki dağılımın ve olasılığın çoğalmasından bahseder. Ayrıca neyin öncekine sahip olduğunuz belli değil, bu bir şeyin anlamı üzerinde bir önceki midir? veya başka bir şey?
O zaman muhtemelen tersine çevrilmiş şeyleriniz vardır, gözlemleriniz ortalama ve standart sapma olarak önceki çekilişler veya bilinen sabit sabitlerle x olmalıdır. Ve o zaman bile, her bir gözleminizle x ve aynı ortalama ve standart sapma ile dnorm için 4 çağrının ürünü olurdu.
Gerçekten net olmayan şey, ne yapmaya çalıştığınızdır. Sorun nedir? hangi parametrelerle ilgileniyorsun? bu parametreler hakkında önceden ne var? başka parametreler var mı? bunlar için öncelikleriniz veya sabit değerleriniz var mı?
Şu anda olduğu gibi bir şeyler yapmaya çalışmak, sadece sorunuzun tam olarak ne olduğunu ve oradan çalışana kadar sizi daha fazla karıştırır.
Orijinal sorunun düzenlenmesinden sonra aşağıdaki süre eklenir.
Hala bazı parçaları kaçırıyorsunuz ve muhtemelen her şeyi anlamıyorsunuz, ancak bulunduğunuz yerden başlayabiliriz.
Bence birkaç kavramı karıştırıyorsunuz. Veri ve parametreler arasındaki ilişkiyi gösteren olasılık vardır, 2 parametreye sahip olan normal, ortalama ve standart sapma (veya varyans veya kesinlik) kullanıyorsunuz. Daha sonra parametreler üzerinde önceki dağılımlar vardır, ortalama 0 ve sd 1 ile normal bir öncelik belirttiniz, ancak bu ortalama ve standart sapma, olasılığın ortalama ve standart sapmasından tamamen farklıdır. Eksiksiz olmak için, ya olasılık bilmeniz ya da olasılık bir öncelik vermeniz gerekir, basitlik (ancak daha az gerçek) için, SD'nin (çalışma dışında başka bir nedeni yok ) olduğunu bildiğimizi varsayacağım . 1).12
Böylece yaptığınız şeye benzer şekilde başlayabilir ve öncekilerden üretebiliriz:
> obs <- c(0.4, 0.5, 0.8, 0.1)
> pri <- rnorm(10000, 0, 1)
Şimdi olasılıkları hesaplamamız gerekiyor, bu, ortalamanın önceki çizimlerine, verilerle olasılığa ve SD'nin bilinen değerine dayanıyor. Dnorm fonksiyonu bize tek bir nokta olasılığını verecektir, ancak her gözlem için değerleri çarpmamız gerekir, işte bunu yapmak için bir fonksiyon:
> likfun <- function(theta) {
+ sapply( theta, function(t) prod( dnorm(obs, t, 0.5) ) )
+ }
Şimdi her çekiliş olasılığını, önceki için ortalamadan hesaplayabiliriz
> tmp <- likfun(pri)
Şimdi posterior elde etmek için yeni bir çekiliş türü yapmamız gerekiyor, reddetme örneklemesine benzer bir yaklaşım, önceki her çekiliş olasılığına orantılı olarak önceki ortalama çekimlerden örneklemektir (bu, çarptığınız çarpma adımına en yakın olanıdır. hakkında soruyor):
> post <- sample( pri, 100000, replace=TRUE, prob=tmp )
Şimdi posterior çekimlerin sonuçlarına bakabiliriz:
> mean(post)
[1] 0.4205842
> sd(post)
[1] 0.2421079
>
> hist(post)
> abline(v=mean(post), col='green')
ve yukarıdaki sonuçları teoriden kapalı form değerleri ile karşılaştırın
> (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
Kötü bir yaklaşım değil, ancak posteriordan çizmek için yerleşik bir McMC aracı kullanmak daha iyi olurdu. Bu araçların çoğu, yukarıdaki gibi gruplar halinde değil, her seferinde bir nokta örnekler.
Daha gerçekçi olarak, olasılığın SD'sini bilmezdik ve bunun için de bir önceliğe ihtiyacımız olurdu (genellikle varyansın önceliği bir veya gamadır), ancak daha sonra hesaplamak daha karmaşıktır (McMC kullanışlı olur) ) ile karşılaştırılacak kapalı bir form yoktur.χ2
Genel çözüm WinBugs veya OpenBugs (R'deki BRugs, R ve Bugs arasında bir arayüz verir) veya R'deki LearnBayes gibi paketler gibi McMC hesaplamaları yapmak için mevcut araçları kullanmaktır.