Ich suchte nach Möglichkeiten, einen Likelihood-Ratio-Test in R durchzuführen, um Modellanpassungen zu vergleichen. Ich habe es zuerst selbst codiert, dann sowohl die Standardfunktion anova()
als auch lrtest()
das lmtest
Paket gefunden. Bei der Überprüfung wird jedoch anova()
immer ein geringfügig anderer p-Wert als bei den anderen beiden Werten erzeugt, obwohl der Parameter 'test' auf "LRT" gesetzt ist. Führt man anova()
tatsächlich einen subtil anderen Test durch oder verstehe ich etwas nicht?
Plattform: R 3.2.0 unter Linux Mint 17, lmtest
Version 0.9-33
Beispielcode:
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)
Wenn ich es ausführe, anova()
ergibt sich ein p-Wert von 0,6071, während die anderen beiden 0,60599 ergeben. Ein kleiner Unterschied, aber konsistent und zu groß, um die Speicherung von Gleitkommazahlen genau zu bestimmen. Kann jemand erklären, warum anova()
eine andere Antwort gibt?