Berechnen Sie die Log-Wahrscheinlichkeit anhand eines einfachen R lm-Modells neu

10

Ich versuche einfach, mit dnorm () die von der logLik-Funktion bereitgestellte Log-Wahrscheinlichkeit aus einem lm-Modell (in R) neu zu berechnen.

Es funktioniert (fast perfekt) für eine hohe Anzahl von Daten (z. B. 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

Bei kleinen Datensätzen gibt es jedoch deutliche Unterschiede:

> 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

Aufgrund des Effekts eines kleinen Datensatzes dachte ich, dass dies an den Unterschieden bei den Restvarianzschätzungen zwischen lm und glm liegen könnte, aber die Verwendung von lm liefert das gleiche Ergebnis wie 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

Wo irre ich mich

Gilles
quelle
2
lm()σ^σ^
Vielen Dank an Stéphane für die Korrektur, aber es scheint immer noch nicht zu funktionieren
Gilles
Versuchen Sie, den Quellcode zu betrachten:stats:::logLik.glm
normal
Ich habe dies getan, aber diese Funktion kehrt einfach den aic-Slot vom glm-Objekt um, um die Log-Wahrscheinlichkeit wiederzugewinnen. Und ich sehe nichts über aic in der glm-Funktion ...
Gilles
Ich vermute, dass dies etwas mit LogLik und AIC zu tun hat (die an der Hüfte miteinander verbunden sind), vorausgesetzt, dass drei Parameter geschätzt werden (Steigung, Achsenabschnitt und Dispersion / Reststandardfehler), während die Dispersion / Reststandardfehler unter der Annahme berechnet wird Es werden zwei Parameter geschätzt (Steigung und Achsenabschnitt).
Tom

Antworten:

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
quelle
Übrigens muss man bei der REML / ML-Option für lme / lmer-Modelle ebenfalls vorsichtig sein.
Stéphane Laurent
σ^
@PatrickCoulombe No: Intercept + Steigung
Stéphane Laurent
Ok, jetzt vollkommen klar. Danke vielmals ! Aber was meinst du mit REML / ML (was wohl mit meinem letzten Beitrag auf GuR zu tun hat)? Bitte erklären Sie (dort vielleicht). Ich will lernen !
Gilles
Die REML-Schätzungen der Varianzkomponenten in einem gemischten Modell entsprechen den ML-Schätzungen "korrigiert um Bias". Ich habe Ihren Beitrag auf GuR noch nicht gesehen :)
Stéphane Laurent