ทำไม lrtest () ไม่ตรงกับ anova (test =“ LRT”)


15

ฉันกำลังมองหาวิธีที่จะทำการทดสอบอัตราส่วนความน่าจะเป็นใน R เพื่อเปรียบเทียบแบบจำลองที่พอดี ฉันเขียนมันเองก่อนจากนั้นก็พบว่าทั้งanova()ฟังก์ชั่นเริ่มต้นและlrtest()ในlmtestแพ็คเกจ เมื่อฉันตรวจสอบanova()จะสร้างค่า p ที่แตกต่างกันเล็กน้อยจากอีกสองเสมอแม้ว่าพารามิเตอร์ 'test' จะถูกตั้งค่าเป็น "LRT" มีการanova()ปฏิบัติจริงบางอย่างที่แตกต่างกันการทดสอบอย่างละเอียดหรือฉันไม่เข้าใจว่าอะไร?

แพลตฟอร์ม: R 3.2.0 ทำงานบน Linux Mint 17, lmtestรุ่น 0.9-33

รหัสตัวอย่าง:

set.seed(1) # Reproducibility
n=1000
y = runif(n, min=-1, max=1)
a = factor(sample(1:5, size=n, replace=T))
b = runif(n)

# Make y dependent on the other two variables
y = y + b * 0.1 + ifelse(a==1, 0.25, 0)
mydata = data.frame(y,a,b)

# Models
base = lm(y ~ a, data=mydata)
full = lm(y ~ a + b, data=mydata)

# Anova
anova(base, full, test="LRT")

# lrtest
library(lmtest)
lrtest(base, full)

# Homebrew log-likelihood test
like.diff = logLik(full) - logLik(base)
df.diff = base$df.residual - full$df.residual
pchisq(as.numeric(like.diff) * 2, df=df.diff, lower.tail=F)

เมื่อฉันรันมันanova()ให้ค่า p เป็น 0.6071 ในขณะที่อีกสองให้ 0.60599 ความแตกต่างเล็ก ๆ น้อย ๆ แต่คงที่และใหญ่เกินกว่าที่จะไม่แม่นยำในการจัดเก็บหมายเลขจุดลอยตัว บางคนสามารถอธิบายได้ว่าทำไมanova()ให้คำตอบที่ต่างออกไป

คำตอบ:


7

สถิติการทดสอบแตกต่างกัน anova.lmlistใช้ความแตกต่างที่ปรับสัดส่วนของผลรวมที่เหลือของกำลังสอง:

anova(base, full, test="LRT")
#  Res.Df    RSS Df Sum of Sq Pr(>Chi)
#1    995 330.29                      
#2    994 330.20  1   0.08786   0.6071

vals <- (sum(residuals(base)^2) - sum(residuals(full)^2))/sum(residuals(full)^2) * full$df.residual 
pchisq(vals, df.diff, lower.tail = FALSE)
#[1] 0.6070549

16

ดังที่กล่าวไว้ในคำตอบก่อนหน้านี้ความแตกต่างลดลงเป็นความแตกต่างในการปรับขนาดคือตัวประมาณที่แตกต่างกันสำหรับค่าเบี่ยงเบนมาตรฐานของข้อผิดพลาด แหล่งที่มาสำหรับความแตกต่างคือ (1) การขยายโดย (ตัวประมาณ OLS ที่ไม่ลำเอียง) กับการขยายโดย (ตัวประมาณค่า ML ที่เอนเอียง) และ (2) การใช้ตัวประมาณภายใต้สมมติฐานว่างหรือทางเลือกnkn

การทดสอบอัตราส่วนความน่าจะเป็นที่นำมาใช้ในการlrtest()ใช้ตัวประมาณค่า ML สำหรับแต่ละรุ่นแยกกันในขณะที่anova(..., test = "LRT")ใช้ตัวประมาณค่า OLS ภายใต้ตัวเลือกอื่น

sd_ols <- function(object) sqrt(sum(residuals(object)^2)/df.residual(object))
sd_mle <- function(object) sqrt(mean(residuals(object)^2))

จากนั้นสถิติที่lrtest()คำนวณคือ

ll <- function(object, sd) sum(dnorm(model.response(model.frame(object)),
  mean = fitted(object), sd = sd, log = TRUE))
-2 * (ll(base, sd_mle(base)) - ll(full, sd_mle(full)))
## [1] 0.266047

anova(..., test = "LRT") ในทางกลับกันใช้

-2 * (ll(base, sd_ols(full)) - ll(full, sd_ols(full)))
## [1] 0.2644859

ภายใต้สมมติฐานว่างทั้งสองจะเทียบเท่ากับเชิงเส้นกำกับแน่นอน แต่ในกลุ่มตัวอย่าง จำกัด มีความแตกต่างเล็กน้อย


1
ขอบคุณสำหรับคำตอบ. ดังนั้นเราสามารถพูดได้ว่าตัวแปรหนึ่งดีกว่าตัวแปรอื่นหรือไม่ ฉันสามารถใช้การทดสอบโนวาโดยไม่มีข้อกังวลได้หรือไม่?
Julian

1
ฉันไม่ทราบผลลัพธ์เชิงทฤษฎีเกี่ยวกับคำถามนี้ แต่ฉันจะไม่แปลกใจถ้าตัวแปร OLS ทำงานได้ดีขึ้นเล็กน้อยในกลุ่มตัวอย่างขนาดเล็กที่มีข้อผิดพลาดแบบเกาส์ แต่ในกลุ่มตัวอย่างที่มีขนาดใหญ่พอสมควรความแตกต่างควรเล็กน้อย
Achim Zeileis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.