2つの正規分布の混合からサンプリングされた一連の観測値の対数尤度を計算する関数を作成しました。この関数は私に正しい答えを与えていません。
特定のサンプルが2つの分布のどちらからのものかわからないため、関数は可能性を合計する必要があります。
この関数は、最初の引数として5つのモデルパラメーター(μ1、σ1、μ2、σ2、p)のベクトルを取ります。ここで、μiとσiはi番目の分布の平均と標準偏差であり、pはサンプルの確率です。最初のディストリビューションからです。2番目の引数の場合、関数は観測値のベクトルを取ります。
私は次の関数を書きました:
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
このような場合、エラーを解決する最善の方法は、式を紙に書き直して再コーディングすることから再開することです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加