lrtest ()가 anova (test =“LRT”)와 일치하지 않는 이유


15

모형 적합을 비교하기 위해 R에서 우도 비 검정을 수행하는 방법을 찾고있었습니다. 내가 먼저 나 자신을 코딩, 디폴트 모두 발견 anova()기능도 lrtest()lmtest패키지로 제공된다. 그러나 검사 할 때 anova()'test'매개 변수가 "LRT"로 설정되어 있어도 항상 다른 두 값과 약간 다른 p- 값이 생성됩니다. anova()실제로 미묘하게 다른 테스트를 수행하고 있습니까 , 아니면 무언가를 이해하지 못합니까?

플랫폼 : Linux Mint 17, lmtest버전 0.9-33 에서 실행되는 R 3.2.0

샘플 코드 :

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) 귀무 가설 또는 대안 하에서 추정기를 사용하는 것입니다.nnkn

구현 된 우도 비 테스트 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
답변 해주셔서 감사합니다. 그렇다면 한 변종이 다른 변종보다 낫다고 말할 수 있습니까? 걱정없이 anova-test를 사용할 수 있습니까?
Julian

1
나는이 질문에 관한 이론적 인 결과를 모르지만 가우스 오류가있는 작은 샘플에서 OLS 변형이 약간 더 나은 성능을 보더라도 놀라지 않을 것입니다. 그러나 이미 약간 큰 표본에서는 차이를 무시할 수 있어야합니다.
Achim Zeileis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.