私は単純に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
どこが間違っているのですか?
修正してくれたStéphaneに感謝しますが、うまくいかないようです
—
Gilles
ソースコードを見てみてください:
—
assumednormal
stats:::logLik.glm
私はこれを行いましたが、この関数はログの可能性を見つけるためにglmオブジェクトからaicスロットを逆にします。そして、私はglm関数でaicについて何も見ません...
—
Gilles
これは、3つのパラメータ(勾配、切片、分散/残差の標準誤差)が推定されていると仮定して、LogLikとAIC(ヒップで結合されている)と関係があるのではないかと思いますが、分散/残差の標準誤差は2つのパラメーターが推定されます(勾配と切片)。
—
トム
lm()
、代わりに使用しています。