您混淆了几件事。该理论讨论的是乘以先验分布和可能性,而不是乘以先验分布的样本。同样也不清楚您拥有什么先验,这是某种意义上的先验吗?或者是其他东西?
这样一来,事情的可能性就发生了逆转,您的观测值应该是x,具有先验值或已知的固定常数,即均值和标准差。即便如此,它实际上仍然是4次调用dnorm的乘积,您的每个观察结果均为x且均值和标准差相同。
真正不清楚的是您要做什么。你的问题是什么?您对哪些参数感兴趣?您对这些参数有什么先验?还有其他参数吗?您有那些先验或固定值吗?
尝试以当前的方式进行操作只会使您更加困惑,直到您弄清楚问题所在并从那里开始工作为止。
编辑完原始问题后,以下内容将添加。
您仍然缺少一些内容,可能无法理解所有内容,但是我们可以从您所处的位置开始。
我认为您会混淆一些概念。有可能显示数据与参数之间的关系,您使用的是具有2个参数的法线,即均值和标准差(或方差或精度)。然后在参数上存在先验分布,您指定了均值0和sd 1的正态先验,但均值和标准差与似然性的均值和标准差完全不同。为了完整起见,您需要知道似然度SD或在似然度SD上放置先验,为简单起见(但不太真实),我将假定我们知道似然度SD为(除了它可以工作之外没有其他充分的理由,并且不同于1)。1个2
因此,我们可以开始于您所做的工作,并从先前的工作中产生:
> 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,因此也需要先验(通常方差的先验是 χ2 或gamma),但计算起来更加复杂(McMC派上用场了),没有封闭的形式可以比较。
通用解决方案是使用现有的工具进行McMC计算,例如WinBugs或OpenBugs(R中的BRug提供R和Bug之间的接口)或软件包,例如R中的LearnBayes。