Tại sao lrtest () không khớp với anova (test = phiên bản LRT)


15

Tôi đang tìm cách để thực hiện một thử nghiệm tỷ lệ khả năng trong R để so sánh sự phù hợp của mô hình. Trước tiên tôi tự mã hóa nó, sau đó tìm thấy cả anova()hàm mặc định và cả lrtest()trong lmtestgói. Tuy nhiên, khi tôi kiểm tra, anova()luôn tạo ra một giá trị p hơi khác so với hai giá trị kia mặc dù tham số 'test' được đặt thành "LRT". Là anova()thực sự thực hiện một số thử nghiệm tinh tế khác nhau, hoặc tôi không hiểu điều gì?

Nền tảng: R 3.2.0 chạy trên Linux Mint 17, lmtestphiên bản 0.9-33

Mã mẫu:

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)

Khi tôi chạy nó, anova()cho giá trị p là 0,6071, trong khi hai cái còn lại cho 0,60599. Một sự khác biệt nhỏ, nhưng nhất quán và quá lớn để không chính xác trong cách lưu trữ số dấu phẩy động. Ai đó có thể giải thích tại sao anova()đưa ra một câu trả lời khác nhau?

Câu trả lời:


7

Các thống kê kiểm tra có nguồn gốc khác nhau. anova.lmlistsử dụng sự khác biệt tỷ lệ của tổng bình phương còn lại:

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

n-kn

Thử nghiệm tỷ lệ khả năng được triển khai trong việc lrtest()sử dụng công cụ ước tính ML cho từng mô hình một cách riêng biệt trong khi anova(..., test = "LRT")sử dụng công cụ ước tính OLS theo phương án thay thế.

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

Sau đó, số liệu thống kê lrtest()tính toán là

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") mặt khác sử dụng

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

Tất nhiên, theo giả thuyết null, cả hai đều tương đương nhau, nhưng trong các mẫu hữu hạn có một sự khác biệt nhỏ.


1
Cảm ơn câu trả lời. Vì vậy, chúng ta có thể nói rằng một biến thể là tốt hơn so với biến thể khác? Tôi có thể sử dụng thử nghiệm anova mà không cần lo lắng không?
Julian

1
Tôi không biết bất kỳ kết quả lý thuyết nào liên quan đến câu hỏi này nhưng tôi sẽ không ngạc nhiên nếu biến thể OLS hoạt động tốt hơn một chút trong các mẫu nhỏ có lỗi Gaussian. Nhưng đã có trong các mẫu lớn vừa phải, sự khác biệt không đáng kể.
Achim Zeileis 7/10/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.