Önceki ve olasılıktan posterior yoğunluk tahminini nasıl hesaplayabilirim?


9

Bir posterior hesaplamak için Bayes teoremini nasıl kullanacağımı anlamaya çalışıyorum, ancak hesaplama yaklaşımına takılı kalıyorum, örneğin, aşağıdaki durumda, önceki ve olasılığın ürününü nasıl alacağımı ve sonra posterior:

Bu örnekte, arka olasılığını hesaplamakla ilgileniyorum ve öncesinde standart bir normal kullanıyorum , ancak bilmek istiyorum MCMC zinciri tarafından temsil edilen bir önceki \ \ ' dan posterior nasıl hesaplanır , bu yüzden başlangıç ​​noktam olarak 1000 örnek kullanacağım.μμ p(μ)N(μ=0,σ=1)μ

  • önceki örnek 1000.

    set.seed(0)
    prior.mu      <- 0
    prior.sigma   <- 1
    prior.samples <- sort(rnorm(1000, prior.mu, prior.sigma))
    
  • bazı gözlemler yapın:

    observations <- c(0.4, 0.5, 0.8, 0.1)
    
  • ve olasılığı hesaplayın, örneğin p(y|μ,σ) :

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

tam olarak anlamadığım şey:

  1. öncekini ne zaman / nasıl çarpma olasılığı?
  2. posterior yoğunluk ne zaman / nasıl normalleştirilir?

lütfen aklınızda bulundurun: Analitik çözümü olmayan genelleştirilebilir problemler olabilecek genel hesaplama çözümüyle ilgileniyorum


1
Örneğinizde farklı dağılımların ne olduğu açık değildir. Lütfen önceki / koşullu dağıtımınızın ne olduğunu açıklayın. Çünkü karışık bir terminolojiniz olabilir.
Nick Sabbe

@Nick, haklısın. geri bildirim için teşekkürler. Açıklığa kavuşturmaya çalıştım.
Abe

Yanıtlar:


8

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.


Bunu biraz daha netleştirmeme yardımcı olduğunuz için teşekkür ederiz. Hala net olmasam da cevabımı güncelledim. Sorum 'en iyi tahmindir budur öncesinde ve verileri verilen?'; başka parametre yok. μ
Abe

bunu benim için bozduğun için teşekkür ederim; Zor bir zaman geçirdim ama bu yardımcı oluyor.
Abe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.