¿Por qué lrtest () no coincide con anova (test = "LRT")

15

Estaba buscando formas de hacer una prueba de razón de probabilidad en R para comparar los ajustes del modelo. Primero lo codifiqué yo mismo, luego encontré la anova()función predeterminada y también lrtest()en el lmtestpaquete. Sin embargo, cuando verifiqué, anova()siempre produce un valor p ligeramente diferente de los otros dos, aunque el parámetro 'prueba' está configurado en "LRT". ¿ anova()Realmente estoy realizando alguna prueba sutilmente diferente o no estoy entendiendo algo?

Plataforma: R 3.2.0 ejecutándose en Linux Mint 17, lmtestversión 0.9-33

Código de muestra:

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)

Cuando lo ejecuto, anova()da un valor p de 0.6071, mientras que los otros dos dan 0.60599. Una pequeña diferencia, pero consistente, y demasiado grande para ser imprecisa en cómo se almacenan los números de coma flotante. ¿Alguien puede explicar por qué anova()da una respuesta diferente?

Jason
fuente

Respuestas:

7

Las estadísticas de prueba se derivan de manera diferente. anova.lmlistusa la diferencia a escala de la suma residual de cuadrados:

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
fuente
16

Como se mencionó en la respuesta anterior, la diferencia se reduce a una diferencia en la escala, es decir, diferentes estimadores para la desviación estándar de los errores. Las fuentes de la diferencia son (1) escalar por (el estimador impar de OLS) versus escalar por (el estimador sesgado de ML), y (2) usar el estimador bajo la hipótesis nula o alternativa.norte-knorte

La prueba de razón de probabilidad implementada en lrtest()usa el estimador ML para cada modelo por separado, mientras que anova(..., test = "LRT")usa el estimador OLS bajo la alternativa.

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

Entonces la estadística que lrtest()calcula es

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") por otro lado utiliza

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

Bajo la hipótesis nula, ambos son asintóticamente equivalentes, por supuesto, pero en muestras finitas hay una pequeña diferencia.

Achim Zeileis
fuente
1
Gracias por la respuesta. Entonces, ¿podemos decir que una variante es mejor que la otra? ¿Puedo usar el anova-test sin preocupaciones?
Juliano
1
No conozco ningún resultado teórico con respecto a esta pregunta, pero no me sorprendería si la variante OLS funciona un poco mejor en muestras pequeñas con errores gaussianos. Pero ya en muestras moderadamente grandes, las diferencias deberían ser insignificantes.
Achim Zeileis