คำนวณความน่าจะเป็นบันทึกใหม่จากโมเดล R lm อย่างง่าย


10

ฉันเพียงแค่พยายามคำนวณใหม่ด้วย dnorm () ความน่าจะเป็นของล็อกจากฟังก์ชัน logLik จาก lm model (in R)

ใช้งานได้ (เกือบสมบูรณ์แบบ) สำหรับข้อมูลจำนวนมาก (เช่น n = 1,000):

> 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

แต่สำหรับชุดข้อมูลขนาดเล็กมีความแตกต่างที่ชัดเจน:

> 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

เนื่องจากชุดข้อมูลขนาดเล็กฉันคิดว่าอาจเป็นเพราะความแตกต่างในการประมาณค่าความแปรปรวนที่เหลือระหว่าง lm และ glm แต่การใช้ lm ให้ผลลัพธ์เหมือนกับ 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

ฉันผิดตรงไหน


2
lm()σ^σ^

ขอบคุณStéphaneสำหรับการแก้ไข แต่ดูเหมือนว่าจะไม่ทำงาน
Gilles

ลองดูซอร์สโค้ด:stats:::logLik.glm
สันนิษฐานว่าปกติ

ฉันทำสิ่งนี้ แต่ฟังก์ชั่นนี้เพียงแค่ย้อนกลับสล็อต aic จากวัตถุ glm เพื่อค้นหาโอกาสในการบันทึก และผมไม่เห็นอะไรเกี่ยวกับ AIC ในการทำงาน ... การ GLM
กิลส์

ฉันสงสัยว่าสิ่งนี้เกี่ยวข้องกับ LogLik และ AIC (ซึ่งเชื่อมโยงกันที่สะโพก) โดยสมมติว่ามีการประมาณสามพารามิเตอร์ (ความลาดชันการสกัดกั้นและการกระจายข้อผิดพลาดมาตรฐาน / ส่วนที่เหลือ) ในขณะที่การคำนวณข้อผิดพลาดมาตรฐานการกระจายตัว / ส่วนที่เหลือ มีการประมาณสองพารามิเตอร์ (ความชันและการสกัดกั้น)
ทอม

คำตอบ:


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)

โดยวิธีที่คุณต้องระมัดระวังในทำนองเดียวกันด้วยตัวเลือก REML / ML สำหรับรุ่น lme / lmer
Stéphane Laurent

(+1) มันคือ n-1 หรือเป็น n-2 จริง ๆ ในส่วนของ ? σ^
Patrick Coulombe

@PatrickCoulombe ไม่: สกัดกั้น + ลาด
Stéphane Laurent

ตกลงชัดเจนแล้วตอนนี้ ขอบคุณมาก ! แต่คุณหมายถึงอะไรกับ REML / ML (เกี่ยวกับโพสต์ล่าสุดของฉันบน GuR ฉันเดา) กรุณาอธิบาย (อาจจะ) ฉันต้องการที่จะเรียนรู้ !
Gilles

การประมาณ REML ขององค์ประกอบความแปรปรวนในโมเดลผสมเป็นเหมือน "การแก้ไข ML สำหรับอคติ" ฉันยังไม่เห็นโพสต์ของคุณใน GuR :)
Stéphane Laurent
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.