Vuelva a calcular la probabilidad logarítmica de un modelo R lm simple

10

Simplemente estoy tratando de recalcular con dnorm () la probabilidad de registro proporcionada por la función logLik de un modelo lm (en R).

Funciona (casi perfectamente) para un gran número de datos (por ejemplo, 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

pero para pequeños conjuntos de datos hay claras diferencias:

> 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

Debido al pequeño efecto del conjunto de datos, pensé que podría deberse a las diferencias en las estimaciones de la varianza residual entre lm y glm, pero el uso de lm proporciona el mismo resultado que 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

Donde me equivoco

Gilles
fuente
2
lm()σ^σ^
Gracias Stéphane por la corrección, pero todavía no parece funcionar
Gilles
intente mirar el código fuente:stats:::logLik.glm
asumido el
Hice esto, pero esta función simplemente invierte la ranura aic del objeto glm para encontrar la probabilidad de registro. Y no veo nada sobre aic en la función glm ...
Gilles
Sospecho que esto tiene algo que ver con LogLik y AIC (que están unidos en la cadera) suponiendo que se estiman tres parámetros (la pendiente, la intersección y el error estándar de dispersión / residual) mientras que el error estándar de dispersión / residual se calcula suponiendo Se estiman dos parámetros (pendiente e intersección).
Tom

Respuestas:

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)
Stéphane Laurent
fuente
Por cierto, también debe tener cuidado con la opción REML / ML para los modelos lme / lmer.
Stéphane Laurent
(+1) ¿Es n-1 o de hecho es n-2 en el denominador de ? σ^
Patrick Coulombe
@PatrickCoulombe No: intercepción + pendiente
Stéphane Laurent
Ok, perfectamente claro ahora. Muchas gracias ! Pero, ¿qué quieres decir con REML / ML (algo que ver con mi última publicación en GuR, supongo)? Por favor explique (tal vez allí). Quiero aprender !
Gilles
Las estimaciones REML de los componentes de la varianza en un modelo mixto son como las estimaciones ML "corregidas por sesgo". Todavía no he visto tu publicación en GuR :)
Stéphane Laurent