Pourquoi lrtest () ne correspond pas à anova (test = “LRT”)

15

Je cherchais des moyens de faire un test de rapport de vraisemblance en R pour comparer les ajustements du modèle. Je l'ai d'abord codé moi-même, puis j'ai trouvé la anova()fonction par défaut et également lrtest()dans le lmtestpackage. Cependant, lorsque j'ai vérifié, anova()produit toujours une valeur de p légèrement différente des deux autres, même si le paramètre «test» est réglé sur «LRT». Effectue-t-il anova()réellement un test subtilement différent, ou est-ce que je ne comprends pas quelque chose?

Plate-forme: R 3.2.0 fonctionnant sous Linux Mint 17, lmtestversion 0.9-33

Exemple de code:

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)

Lorsque je l'exécute, anova()donne une valeur de p de 0,6071, tandis que les deux autres donnent 0,60599. Une petite différence, mais cohérente et trop grande pour être imprécise dans la façon dont les nombres à virgule flottante sont stockés. Quelqu'un peut-il expliquer pourquoi anova()donne une réponse différente?

Jason
la source

Réponses:

7

Les statistiques de test sont dérivées différemment. anova.lmlistutilise la différence échelonnée de la somme résiduelle des carrés:

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
la source
16

nkn

Le test du rapport de vraisemblance mis en œuvre dans lrtest()utilise l'estimateur ML pour chaque modèle séparément, tandis que anova(..., test = "LRT")l'estimateur OLS est utilisé dans l'alternative.

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

Ensuite, la statistique qui lrtest()calcule est

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") d'autre part utilise

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

Sous l'hypothèse nulle, les deux sont asymptotiquement équivalents, bien sûr, mais dans les échantillons finis, il y a une petite différence.

Achim Zeileis
la source
1
Merci d'avoir répondu. Alors, peut-on dire qu'une variante est meilleure que l'autre? Puis-je utiliser le test anova sans soucis?
Julian
1
Je ne connais aucun résultat théorique concernant cette question, mais je ne serais pas surpris si la variante OLS fonctionne légèrement mieux dans de petits échantillons avec des erreurs gaussiennes. Mais déjà dans des échantillons modérément grands, les différences devraient être négligeables.
Achim Zeileis