単純なR lmモデルから対数尤度を再計算する


10

私は単純にdnorm()を使用して、lmモデル(R)からのlogLik関数によって提供される対数尤度を再計算しようとしています。

大量のデータ(n = 1000など)でも(ほぼ完全に)機能します。

> n <- 1000
> x <- 1:n
> set.seed(1)
> y <- 10 + 2*x + rnorm(n, 0, 2)
> mod <- glm(y ~ x, family = gaussian)
> logLik(mod)
'log Lik.' -2145.562 (df=3)
> sigma <- sqrt(summary(mod)$dispersion)
> sum(log(dnorm(x = y, mean = predict(mod), sd = sigma)))
[1] -2145.563
> sum(log(dnorm(x = resid(mod), mean = 0, sd = sigma)))
[1] -2145.563

しかし、小さなデータセットには明確な違いがあります:

> n <- 5
> x <- 1:n
> set.seed(1)
> y <- 10 + 2*x + rnorm(n, 0, 2)
> 
> mod <- glm(y ~ x, family = gaussian)
> logLik(mod)
'log Lik.' -8.915768 (df=3)
> sigma <- sqrt(summary(mod)$dispersion)
> sum(log(dnorm(x = y, mean = predict(mod), sd = sigma)))
[1] -9.192832
> sum(log(dnorm(x = resid(mod), mean = 0, sd = sigma)))
[1] -9.192832

データセットの影響が小さいため、lmとglmの間の残差分散推定の違いが原因であると考えましたが、lmを使用すると、glmと同じ結果が得られます。

> modlm <- lm(y ~ x)
> logLik(modlm)
'log Lik.' -8.915768 (df=3)
> 
> sigma <- summary(modlm)$sigma
> sum(log(dnorm(x = y, mean = predict(modlm), sd = sigma)))
[1] -9.192832
> sum(log(dnorm(x = resid(modlm), mean = 0, sd = sigma)))
[1] -9.192832

どこが間違っているのですか?


2
ではlm()、代わりに使用しています。σ^σ^
ステファン・ローラン

修正してくれたStéphaneに感謝しますが、うまくいかないようです
Gilles

ソースコードを見てみてください:stats:::logLik.glm
assumednormal

私はこれを行いましたが、この関数はログの可能性を見つけるためにglmオブジェクトからaicスロットを逆にします。そして、私はglm関数でaicについて何も見ません...
Gilles

これは、3つのパラメータ(勾配、切片、分散/残差の標準誤差)が推定されていると仮定して、LogLikとAIC(ヒップで結合されている)と関係があるのではないかと思いますが、分散/残差の標準誤差は2つのパラメーターが推定されます(勾配と切片)。
トム

回答:


12

このlogLik()関数は、未知のパラメーターの値をパラメーターのML推定値に置き換えることにより、対数尤度の評価を提供します。これで、回帰パラメーターの最尤推定値(のの)は最小二乗推定値と一致しますが、 ML推定値は、これはを使用していますが、これは不偏の平方根です推定。βjXβσϵ^i2nσ^=ϵ^i2n2σ2

>  n <- 5
>  x <- 1:n
>  set.seed(1)
>  y <- 10 + 2*x + rnorm(n, 0, 2)
>  modlm <- lm(y ~ x)
>  sigma <- summary(modlm)$sigma
> 
>  # value of the likelihood with the "classical" sigma hat
>  sum(log(dnorm(x = y, mean = predict(modlm), sd = sigma)))
[1] -9.192832
> 
>  # value of the likelihood with the ML sigma hat
>  sigma.ML <- sigma*sqrt((n-dim(model.matrix(modlm))[2])/n) 
>  sum(log(dnorm(x = y, mean = predict(modlm), sd = sigma.ML)))
[1] -8.915768
>  logLik(modlm)
'log Lik.' -8.915768 (df=3)

ところで、lme / lmerモデルのREML / MLオプションについても同様に注意する必要があります。
ステファン・ローラン

(+1)それはn-1 ですか、それとも分母のn-2 ですか?σ^
Patrick Coulombe 2013年

@PatrickCoulombe番号:インターセプト+スロープ
ステファン・ローラン

わかりました、今は完全に晴れています。どうもありがとう !しかし、REML / MLとはどういう意味ですか(おそらく、GuRに関する私の最後の投稿と関係があります)?説明してください(多分あります)。学びたい!
Gilles

混合モデルの分散コンポーネントのREML推定は、「バイアスを補正した」ML推定に似ています。私はまだGURにあなたのポストを見ていない:)
ステファン・ローラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.