Basit bir R lm modelinden günlük olasılığını yeniden hesaplayın


10

Ben sadece bir lm modelinden (R) logLik işlevi tarafından sağlanan log-olasılık dnorm () ile yeniden hesaplamak çalışıyorum.

Çok sayıda veri (örneğin n = 1000) için (neredeyse mükemmel) çalışır:

> 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

ancak küçük veri kümeleri için belirgin farklılıklar vardır:

> 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

Küçük veri kümesi etkisi nedeniyle bunun lm ve glm arasındaki artık varyans tahminlerindeki farklılıklardan kaynaklanabileceğini düşündüm, ancak lm kullanmak glm ile aynı sonucu veriyor:

> 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

Nerede yanılıyorum?


2
İle lm(), kullandığınız yerine . σ^σ^
Stéphane Laurent

Düzeltme için teşekkürler Stéphane ama hala işe yaramıyor gibi görünüyor
Gilles

kaynak koduna bakmayı deneyin:stats:::logLik.glm
varsayılan

Bunu yaptım ama bu fonksiyon sadece log olasılığını geri bulmak için glm nesnesinden aic yuvasını tersine çevirdi. Ve glm fonksiyonunda aic hakkında hiçbir şey görmüyorum ...
Gilles

Üç parametrenin (eğim, kesişim ve dağılım / artık standart hata) tahmin edildiğini varsayarak bunun LogLik ve AIC (kalçada birbirine bağlı) ile bir ilgisi olduğundan şüpheleniyorum, dağılım / artık standart hata iki parametre tahmin edilir (eğim ve kesişim).
Tom

Yanıtlar:


12

logLik()Fonksiyon tarafından log-olasılığının değerlendirilmesini sağlar parametrelerin ML tahminleri ikame bilinmeyen parametrelerin değerleri için. Şimdi, regresyon parametreleri maksimum olabilirlik tahmin ( 's en küçük kareler tahminleri ile) bir araya gelmesi ama ML tahmini isimli , . tahmini .β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)

Bu arada, benzer şekilde lme / lmer modelleri için REML / ML seçeneğine de dikkat etmelisiniz.
Stéphane Laurent

(+1) paydasında n-1 mi yoksa gerçekten n-2 mi? σ^
Patrick Coulombe

@PatrickCoulombe No: kesişim + eğim
Stéphane Laurent

Tamam, şimdi çok net. Çok teşekkürler ! Ama REML / ML ile ne demek istiyorsun (sanırım GuR'deki son yazımla ilgili bir şey)? Lütfen açıklayın (belki de var). Öğrenmek istiyorum !
Gilles

Karışık modellerde varyans bileşenlerinin REML tahminleri, "sapma için düzeltilmiş" ML tahminlerine benzer. Henüz GuR ile ilgili yazınızı görmedim :)
Stéphane Laurent
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.