1

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

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

该函数将五个模型参数的向量作为其第一个参数(μ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。我的功能哪里出错了?

4

1 回答 1

3

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

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

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

于 2020-02-11T12:19:02.347 回答