Ricalcola la verosimiglianza da un semplice modello Rlm


10

Sto semplicemente cercando di ricalcolare con dnorm () la verosimiglianza log fornita dalla funzione logLik da un modello lm (in R).

Funziona (quasi perfettamente) per un elevato numero di dati (ad es. 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

ma per piccoli set di dati ci sono chiare differenze:

> 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

A causa del piccolo effetto del set di dati ho pensato che potesse essere dovuto alle differenze nelle stime di varianza residua tra lm e glm, ma l'uso di lm fornisce lo stesso risultato di 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

Dove sbaglio?


2
Con lm(), stai usando invece di . σσ^σ^
Stéphane Laurent,

Grazie Stéphane per la correzione, ma non sembra funzionare ancora
Gilles,

prova a guardare il codice sorgente:stats:::logLik.glm
assunto normale

L'ho fatto ma questa funzione ha semplicemente invertito lo slot aic dall'oggetto glm per ritrovare la probabilità di log. E non vedo nulla di aic nella funzione glm ...
Gilles,

Ho il sospetto che ciò abbia a che fare con LogLik e AIC (che sono legati insieme all'anca) supponendo che siano stati stimati tre parametri (pendenza, intercettazione e errore standard residuo / dispersione) mentre l'errore dispersione / errore standard residuo è calcolato ipotizzando vengono stimati due parametri (pendenza e intercetta).
Tom,

Risposte:


12

La logLik()funzione fornisce la valutazione della probabilità logaritmica sostituendo le stime ML dei parametri con i valori dei parametri sconosciuti. Ora, le stime di massima verosimiglianza dei parametri di regressione (i in ) coincidono con le stime dei minimi quadrati, ma la stima ML di è , mentre stai usando , questa è la radice quadrata dell'imparziale stima di .β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)

A proposito, devi anche fare attenzione con l'opzione REML / ML per i modelli lme / lmer.
Stéphane Laurent,

(+1) È n-1 o è davvero n-2 nel denominatore di ? σ^
Patrick Coulombe,

@PatrickCoulombe No: intercetta + pendenza
Stéphane Laurent,

Ok, perfettamente chiaro ora. Molte grazie ! Ma cosa intendi con REML / ML (credo che abbia a che fare con il mio ultimo post su GuR)? Per favore, spiega (forse lì). Voglio imparare !
Gilles,

Le stime REML dei componenti della varianza in un modello misto sono come le stime ML "corrette per distorsione". Non ho ancora visto il tuo post su GuR :)
Stéphane Laurent,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.