Чому 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()дає р-значення 0,6071, тоді як інші два дають 0,6599. Невелика різниця, але послідовна і занадто велика, щоб бути неточним у тому, як зберігаються номери з плаваючою комою. Чи може хтось пояснити, чому 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

nkn

Тест коефіцієнта ймовірності, реалізований у 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
Дякую за відповідь. Отже, чи можна сказати, що один варіант кращий за інший? Чи можу я користуватися тестом anova без проблем?
Джуліан

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