你有几件事混淆了。该理论讨论了将先验分布和可能性相乘,而不是先验分布的样本。也不清楚你有什么先验,这是先验的意思吗?或者是其他东西?
然后,您的情况可能会发生逆转,您的观察结果应该是 x,之前的平局或已知的固定常数作为均值和标准差。即便如此,它实际上是 4 次调用 dnorm 的产物,您的每个观察结果都为 x 以及相同的均值和标准差。
真正不清楚的是您要做什么。你的问题是什么?您对哪些参数感兴趣?你对这些参数有什么先验?还有其他参数吗?你有这些的先验或固定值吗?
试图以你现在的方式去做事情只会让你更加困惑,直到你弄清楚你的问题是什么并从那里开始工作。
以下是在编辑原始问题后添加的。
您仍然缺少一些部分,并且可能不了解所有内容,但我们可以从您所在的位置开始。
我认为您混淆了一些概念。有可能显示数据和参数之间的关系,您使用的是具有 2 个参数的法线,即均值和标准差(或方差或精度)。然后是参数的先验分布,您已经指定了一个均值为 0 和 sd 1 的正态先验,但该均值和标准差与似然的均值和标准差完全不同。为了完整起见,您需要知道似然 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)
现在为了得到后验,我们需要做一种新的抽奖,一种类似于拒绝抽样的方法是从先前的平均抽奖中抽样,与每次抽奖的可能性成正比(这是最接近你的乘法步骤询问):
> 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 工具从后部绘制可能会更好。大多数这些工具一次采样一个点,而不是像上面那样分批采样。
更现实地说,我们不知道可能性的 SD,并且也需要先验(通常方差的先验是或 gamma),但是计算起来更复杂(McMC 派上用场) 并且没有可比较的封闭形式。χ2
一般的解决方案是使用现有的工具进行 McMC 计算,例如 WinBugs 或 OpenBugs(R 中的 BRugs 提供 R 和 Bugs 之间的接口)或 R 中的 LearnBayes 等软件包。