事前密度と尤度から事後密度推定を計算するにはどうすればよいですか?


9

ベイズの定理を使用して事後を計算する方法を理解しようとしていますが、計算アプローチに行き詰まっています。たとえば、次のケースでは、事前確率と尤度の積を取得して計算する方法がわかりません。後部:

この例では、事後確率の計算に興味があり、で事前標準標準を使用しますが、知りたいですMCMCチェーンで表される事前分布から事後を計算する方法。したがって、開始点として1000サンプルを使用します。μ P μ N μ = 0 σ = 1 μμμ p(μ)N(μ=0,σ=1)μ

  • 以前からのサンプル1000。

    set.seed(0)
    prior.mu      <- 0
    prior.sigma   <- 1
    prior.samples <- sort(rnorm(1000, prior.mu, prior.sigma))
    
  • いくつかの観察をします:

    observations <- c(0.4, 0.5, 0.8, 0.1)
    
  • そして、尤度を計算します。例::p(y|μ,σ)

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

私がよく理解していないのは:

  1. いつ/どのように事前確率に尤度を掛けるか?
  2. いつ/どのように事後密度を正規化するのですか?

注意してください:私は、解析解がないと一般化可能な問題になる可能性がある一般的な計算解に興味があります


1
あなたの例で異なる分布が何であるかは明らかではありません。以前の/条件付き分布が何であるかを明確にしてください。いくつかの用語が混同されている可能性があるためです。
Nick Sabbe、2011

@ニックあなたは正しいです。フィードバックをありがとうございます。明確にしようとしました。
阿部

回答:


8

いくつかのことが混同されています。理論は、事前分布からのサンプルではなく、事前分布と尤度の乗算について話します。また、あなたが以前に何を持っているかは明確ではありません、これは何かの意味での事前ですか?または、他の何か?

次に、可能性が逆になったものを使用します。観測値は、事前描画または既知の固定定数を平均値および標準偏差としてxにする必要があります。そしてそれでも、それは実際には、各観測値をxとして、平均値と標準偏差が同じであるdnormへの4つの呼び出しの積になります。

本当にはっきりしないのは、あなたが何をしようとしているのかです。あなたの質問は何ですか?どのパラメータに興味がありますか?これらのパラメータについて、以前に何を持っていますか?他のパラメータはありますか?それらの事前値または固定値はありますか?

あなたが現在ある方法で物事に取り掛かろうとすると、あなたの質問が何であるかを正確に理解し、そこから作業するまで、さらに混乱するだけです。

以下は、元の質問を編集した後に追加される予定です。

あなたはまだいくつかの部分が欠けており、おそらくすべてを理解していませんが、私たちはあなたがいるところから始めることができます。

いくつかの概念を混乱させていると思います。データとパラメーターの関係を示す可能性があります。平均と標準偏差(または分散、または精度)の2つのパラメーターを持つ法線を使用しています。次に、パラメーターに事前分布があり、平均0とsd 1で正規事前分布を指定しましたが、その平均と標準偏差は、尤度の平均と標準偏差とは完全に異なります。完全にするために、可能性SDを知るか、可能性SDに事前確率を設定する必要があります。簡単にするために(ただし、現実性は低くなります)、可能性SDがことがわかっていると仮定し(それが機能すること以外に理由はなく、 1)。12

したがって、以前と同じように開始して生成できます。

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

次に、尤度を計算する必要があります。これは、平均の以前の描画、データの尤度、およびSDの既知の値に基づいています。dnorm関数は単一点の可能性を提供しますが、各観測値を一緒に乗算する必要があります。これを行う関数は次のとおりです。

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

これで、平均の以前からの各ドローの尤度を計算できます

> tmp <- likfun(pri)

次に、新しいタイプのドローを行う必要がある事後を取得するために、拒否サンプリングに類似した1つのアプローチは、以前の各ドローの尤度に比例する前の平均ドローからサンプリングすることです(これは、前の乗算ステップに最も近いものです)について尋ねる):

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

これで、事後描画の結果を確認できます。

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

上記の結果を理論の閉じた形の値と比較します

> (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

悪い近似ではありませんが、組み込みのMcMCツールを使用して後方から描画する方がおそらくうまくいきます。これらのツールのほとんどは、上記のようなバッチではなく、一度に1つのポイントをサンプリングします。

より現実的には、可能性のSDを知らず、そのための事前も必要になります(多くの場合、分散の事前はまたはガンマです)が、計算がより複雑です(McMCが便利です) )と比較する閉じたフォームはありません。χ2

一般的な解決策は、WinBugsやOpenBugs(RのBRugsはRとBugs間のインターフェースを提供します)などのMcMC計算を行うための既存のツール、またはRのLearnBayesなどのパッケージを使用することです。


これをもう少し明確にしてくれてありがとう。まだはっきりしていませんが、回答を更新しました。私の質問は、「事前およびデータを考慮した最良の推定値は何ですか?」です。他のパラメーターはありません。μ
阿部

これを分解してくれてありがとう。私はつらい時を過ごしてきましたが、これは助けになります。
阿部
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.