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σ^=∑ϵ^i2n−2σ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.