Я искал способы сделать тест отношения правдоподобия в R, чтобы сравнить подгонки модели. Сначала я сам его кодировал, затем нашел и anova()
функцию по умолчанию, и также lrtest()
в lmtest
пакете. Когда я проверял, тем не менее, anova()
всегда выдает немного другое значение p, чем у двух других, даже если для параметра «test» установлено значение «LRT». На anova()
самом деле выполняет какой-то слегка другой тест или я чего-то не понимаю?
Платформа: R 3.2.0, работающая на Linux Mint 17, lmtest
версия 0.9-33
Образец кода:
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)
Когда я запускаю его, anova()
выдает p-значение 0,6071, тогда как два других дают 0,60599. Небольшая разница, но непротиворечивая и слишком большая, чтобы быть неточной в том, как хранятся числа с плавающей запятой. Может кто-нибудь объяснить, почему anova()
дает другой ответ?
источник