Пересчитать логарифмическое правдоподобие из простой модели R lm

10

Я просто пытаюсь пересчитать с помощью dnorm () логарифмическую вероятность, обеспечиваемую функцией logLik из модели lm (в R).

Это работает (почти идеально) для большого количества данных (например, 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()σ^σ^
Спасибо Стефану за исправление, но оно все еще не работает
Жиль
попробуйте взглянуть на исходный код:stats:::logLik.glm
принято нормальным
Я сделал это, но эта функция просто перевернула aic-слот из объекта glm, чтобы найти правдоподобие. И я не вижу ничего об aic в функции glm ...
Жиль
Я подозреваю, что это как-то связано с LogLik и AIC (которые связаны вместе на бедре), если предположить, что оцениваются три параметра (наклон, пересечение и дисперсия / остаточная стандартная ошибка), тогда как дисперсия / остаточная стандартная ошибка рассчитывается в предположении оцениваются два параметра (наклон и перехват).
Том

Ответы:

12

logLik()β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)
Стефан Лоран
источник
Кстати, вы должны быть осторожны с опцией REML / ML для моделей lme / lmer.
Стефан Лоран
(+1) Это n-1 или действительно n-2 в знаменателе ? σ^
Патрик Куломб
@PatrickCoulombe Нет: перехватить + склон
Стефан Лоран
Хорошо, теперь все ясно. Большое спасибо ! Но что вы имеете в виду под REML / ML (я думаю, что-то связанное с моим последним постом о GuR)? Пожалуйста, объясните (может быть). Я хочу учиться !
Жиль
Оценки REML компонент дисперсии в смешанных моделях подобны оценкам ML с «поправкой на смещение». Я еще не видел ваш пост на GuR :)
Стефан Лоран