如何从先验和可能性计算后验密度估计?

机器算法验证 贝叶斯 模拟 计算统计
2022-03-03 16:43:28

我试图了解如何使用贝叶斯定理来计算后验,但我陷入了计算方法的困境,例如,在以下情况下,我不清楚如何取先验和似然的乘积,然后计算后面:

对于这个例子,我有兴趣计算 \mu 的后验概率,上使用标准正态先验,但我想知道如何从上的先验计算后验,所以我将使用 1000 个样本作为我的起点。μμ 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个回答

你有几件事混淆了。该理论讨论了将先验分布和可能性相乘,而不是先验分布的样本。也不清楚你有什么先验,这是先验的意思吗?或者是其他东西?

然后,您的情况可能会发生逆转,您的观察结果应该是 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 等软件包。