Por que o lrtest () não corresponde ao anova (test = "LRT")


15

Eu estava procurando maneiras de fazer um teste de razão de verossimilhança em R para comparar os ajustes do modelo. Eu primeiro o codifiquei, depois encontrei a anova()função padrão e também lrtest()no lmtestpacote. Quando verifiquei, no entanto, anova()sempre produz um valor p ligeiramente diferente dos outros dois, embora o parâmetro 'test' esteja definido como "LRT". anova()Realmente está realizando algum teste sutilmente diferente ou não estou entendendo alguma coisa?

Plataforma: R 3.2.0 em execução no Linux Mint 17, lmtestversão 0.9-33

Código de amostra:

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)

Quando eu executo, anova()dá um valor de p de 0,6071, enquanto os outros dois dão 0,60599. Uma pequena diferença, mas consistente e grande demais para ser imprecisa na maneira como os números de ponto flutuante são armazenados. Alguém pode explicar por que anova()dá uma resposta diferente?

Respostas:


7

As estatísticas de teste são derivadas de maneira diferente. anova.lmlistusa a diferença escalada da soma residual dos quadrados:

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

Como mencionado na resposta anterior, a diferença se resume a uma diferença no dimensionamento, ou seja, estimadores diferentes para o desvio padrão dos erros. As fontes para a diferença são (1) dimensionamento porn-k (o estimador OLS imparcial) vs. escala por n (o estimador enviesado de ML) e (2) usando o estimador sob a hipótese nula ou alternativa.

O teste da razão de verossimilhança implementado lrtest()usa o estimador ML para cada modelo separadamente, enquanto anova(..., test = "LRT")usa o estimador OLS sob a alternativa.

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

Então a estatística que lrtest()calcula é

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 outro lado, usa

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

Sob a hipótese nula, ambos são assintoticamente equivalentes, é claro, mas em amostras finitas há uma pequena diferença.


1
Obrigado pela resposta. Então, podemos dizer que uma variante é melhor que a outra? Posso usar o teste anova sem preocupações?
Julian

1
Não conheço nenhum resultado teórico referente a essa questão, mas não ficaria surpreso se a variante OLS tivesse um desempenho um pouco melhor em pequenas amostras com erros gaussianos. Mas já em amostras moderadamente grandes, as diferenças devem ser desprezíveis.
Achim Zeileis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.