Dlaczego lrtest () nie pasuje do anova (test = „LRT”)

15

Szukałem sposobów przeprowadzenia testu współczynnika wiarygodności w R, aby porównać pasowania modeli. Po raz pierwszy zakodowany to sam, a następnie znaleźć zarówno domyślną anova()funkcją, a także lrtest()w lmtestpakiecie. Kiedy jednak sprawdziłem, anova()zawsze produkuje nieco inną wartość p od pozostałych dwóch, mimo że parametr „test” jest ustawiony na „LRT”. Czy anova()faktycznie wykonuje jakiś subtelnie inny test, czy też czegoś nie rozumiem?

Platforma: R 3.2.0 działająca na Linux Mint 17, lmtestwersja 0.9-33

Przykładowy kod:

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)

Kiedy go uruchamiam, anova()daje wartość p wynoszącą 0,6071, podczas gdy pozostałe dwa dają 0,60599. Mała różnica, ale spójna i zbyt duża, aby nieścisłości w przechowywaniu liczb zmiennoprzecinkowych. Czy ktoś może wyjaśnić, dlaczego anova()daje inną odpowiedź?

Jason
źródło

Odpowiedzi:

7

Statystyka testu jest uzyskiwana inaczej. anova.lmlistwykorzystuje skalowaną różnicę rezydualnej sumy kwadratów:

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
Roland
źródło
16

Jak wspomniano w poprzedniej odpowiedzi, różnica sprowadza się do różnicy w skalowaniu, tj. Różnych estymatorów odchylenia standardowego błędów. Źródłami tej różnicy są (1) skalowanie według (obiektywny estymator OLS) vs. skalowanie przez (tendencyjny estymator ML) i (2) przy użyciu estymatora pod hipotezą zerową lub alternatywą.n-kn

Zaimplementowany test współczynnika wiarygodności lrtest()wykorzystuje estymator ML dla każdego modelu osobno, a anova(..., test = "LRT")alternatywnie wykorzystuje estymator OLS.

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

Następnie lrtest()jest obliczana statystyka

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") z drugiej strony używa

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

W ramach hipotezy zerowej oba są oczywiście asymptotycznie równoważne, ale w próbkach skończonych istnieje niewielka różnica.

Achim Zeileis
źródło
1
Dziękuję za odpowiedź. Czy możemy więc powiedzieć, że jeden wariant jest lepszy od drugiego? Czy mogę korzystać z testu anova bez obaw?
Julian
1
Nie znam żadnych wyników teoretycznych dotyczących tego pytania, ale nie zdziwiłbym się, gdyby wariant OLS działał nieco lepiej w małych próbkach z błędami Gaussa. Ale już w umiarkowanie dużych próbach różnice powinny być nieistotne.
Achim Zeileis,