いくつかのことが混同されています。理論は、事前分布からのサンプルではなく、事前分布と尤度の乗算について話します。また、あなたが以前に何を持っているかは明確ではありません、これは何かの意味での事前ですか?または、他の何か?
次に、可能性が逆になったものを使用します。観測値は、事前描画または既知の固定定数を平均値および標準偏差として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などのパッケージを使用することです。