使用 R 计算从两个正态分布的混合样本中采样的一组观察值的对数似然

Calculating the log-likelihood of a set of observations sampled from a mixture of two normal distributions using R

我编写了一个函数来计算从两个正态分布的混合样本中抽取的一组观察值的对数似然。这个函数没有给我正确的答案。

我不知道任何给定样本来自两个分布中的哪一个,因此该函数需要对各种可能性求和。

此函数将五个模型参数的向量作为其第一个参数(μ1、σ1 、μ2 、σ2 和 p),其中 μi 和 σi 是第 i 个分布的均值和标准差,p是样本来自第一个分布的概率。对于第二个参数,该函数采用观察向量。

我写了下面的函数:

mixloglik <- function(p, v) {
    sum(log(dnorm(v, p[1], p[2])*p[5] + dnorm(v,p[3],p[4]))*p[5])
}

我可以创建测试数据,我知道解决方案应该是~-854.6359:

set.seed(42)
v<- c(rnorm(100), rnorm(200, 8, 2))
p <- c(0, 1, 6, 2, 0.5)

当我在测试数据上测试这个函数时,我没有得到正确的解决方案

> mixloglik(p, v)
[1] -356.7194

我知道解决方案应该是 ~ -854.6359。我的功能哪里出错了?

对数似然的正确表达式如下。

mixloglik <- function(p, v) {
  sum(log(p[5]*dnorm(v, p[1], p[2]) + (1 - p[5])*dnorm(v, p[3], p[4])))
}

现在试试看:

set.seed(42)
v<- c(rnorm(100), rnorm(200, 8, 2))
p <- c(0, 1, 6, 2, 0.5)
mixloglik(p, v)
#[1] -854.6359

在这种情况下,解决错误的最佳方法是通过在纸上重写表达式并重新编码来重新启动。