Perché lrtest () non corrisponde ad anova (test = "LRT")


15

Stavo cercando modi per fare un test del rapporto di verosimiglianza in R per confrontare gli adattamenti del modello. L'ho prima codificato da solo, quindi ho trovato sia la anova()funzione predefinita che anche lrtest()nel lmtestpacchetto. Quando ho controllato, però, anova()produce sempre un valore p leggermente diverso dagli altri due anche se il parametro 'test' è impostato su "LRT". Sta anova()effettivamente eseguendo un test leggermente diverso o non capisco qualcosa?

Piattaforma: R 3.2.0 in esecuzione su Linux Mint 17, lmtestversione 0.9-33

Codice d'esempio:

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 lo anova()eseguo , dà un valore p di 0.6071, mentre gli altri due danno 0.60599. Una piccola differenza, ma coerente, e troppo grande per essere imprecisa nel modo in cui sono memorizzati i numeri in virgola mobile. Qualcuno può spiegare perché anova()dà una risposta diversa?

Risposte:


7

Le statistiche del test sono derivate in modo diverso. anova.lmlistusa la differenza in scala della somma residua dei quadrati:

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

Come menzionato nella risposta precedente, la differenza si riduce a una differenza nel ridimensionamento, ovvero diversi stimatori per la deviazione standard degli errori. Le fonti della differenza sono (1) il ridimensionamento di (lo stimatore OLS imparziale) rispetto al ridimensionamento di (lo stimatore ML di parte) e (2) usando lo stimatore sotto l'ipotesi nulla o alternativa.n-Kn

Il test del rapporto di verosimiglianza implementato in lrtest()utilizza lo stimatore ML per ciascun modello separatamente mentre anova(..., test = "LRT")usa lo stimatore OLS in alternativa.

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

Quindi la statistica che lrtest()calcola è

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'altra parte usa

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

Sotto l'ipotesi nulla, entrambi sono asintoticamente equivalenti, ovviamente, ma nei campioni finiti c'è una piccola differenza.


1
Grazie per la risposta. Quindi, possiamo dire che una variante è migliore dell'altra? Posso usare il test anova senza preoccupazioni?
Giuliano,

1
Non conosco alcun risultato teorico riguardo a questa domanda, ma non sarei sorpreso se la variante OLS avesse prestazioni leggermente migliori in piccoli campioni con errori gaussiani. Ma già in campioni moderatamente grandi le differenze dovrebbero essere trascurabili.
Achim Zeileis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.