Почему lrtest () не соответствует anova (test = «LRT»)


15

Я искал способы сделать тест отношения правдоподобия в 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()дает другой ответ?

Ответы:


7

Статистика теста выводится по-разному. anova.lmlistиспользует масштабированную разницу остаточной суммы квадратов:

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

Как упоминалось в предыдущем ответе, разница сводится к разнице в масштабировании, то есть к различным оценкам для стандартного отклонения ошибок. Источники для различия: (1) масштабирование по (объективная оценка OLS) в сравнении с масштабированием по (смещенная оценка ML), и (2) использование оценки по нулевой гипотезе или альтернативе.nnkn

Тест отношения правдоподобия, реализованный в, lrtest()использует оценщик ML для каждой модели отдельно, в то время anova(..., test = "LRT")как оценщик OLS использует альтернативу.

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

Тогда статистика, которая lrtest()вычисляет

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") с другой стороны использует

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

При нулевой гипотезе оба асимптотически эквивалентны, конечно, но в конечных выборках есть небольшая разница.


1
Спасибо за ответ. Итак, можем ли мы сказать, что один вариант лучше другого? Могу ли я использовать анова-тест без проблем?
Джулиан,

1
Я не знаю никаких теоретических результатов по этому вопросу, но я не удивлюсь, если вариант OLS работает немного лучше в небольших выборках с ошибками Гаусса. Но уже в умеренно больших выборках различия должны быть незначительными.
Ахим Цейлейс,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.