Lrtest () neden anova ile eşleşmiyor (test = “LRT”)


15

Model uyumlarını karşılaştırmak için R'de bir olasılık oranı testi yapmanın yollarını arıyordum. İlk kendim kodlu, varsayılan hem bulundu anova()fonksiyonu ve aynı zamanda lrtest()içinde lmtestpaketin. Ancak kontrol ettiğimde anova(), 'test' parametresi "LRT" olarak ayarlanmış olsa bile, her zaman diğer ikisinden biraz farklı bir p değeri üretir. Is anova()aslında bazı ustaca farklı testi, yoksa bir şey anlamak değil ben?

Platform: R 3.2.0 Linux Mint 17, lmtestsürüm 0.9-33 üzerinde çalışıyor

Basit kod:

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)

Çalıştırdığımda anova()0.6071'lik bir p değeri verirken, diğer ikisi 0.60599 verir. Küçük bir fark, ancak tutarlı ve kayan nokta sayılarının nasıl saklandığı konusunda belirsiz olamayacak kadar büyük. Birisi neden anova()farklı bir cevap verdiğini açıklayabilir mi?

Yanıtlar:


7

Test istatistikleri farklı türetilmiştir. anova.lmlistkalan kareler toplamının ölçeklenmiş farkını kullanır:

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

Uygulanan olabilirlik oranı testi alternatif olarak OLS tahmincisini kullanırken lrtest()her model için ML tahmincisini ayrı olarak anova(..., test = "LRT")kullanır.

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

Ardından istatistik lrtest()hesaplar olduğunu

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") Öte yandan kullanır

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

Sıfır hipotezi altında her ikisi de asimptotik olarak eşdeğerdir, ancak sonlu örneklerde küçük bir fark vardır.


1
Cevap için teşekkürler. Peki, bir varyantın diğerinden daha iyi olduğunu söyleyebilir miyiz? Anova testini endişe duymadan kullanabilir miyim?
Julian

1
Bu soru ile ilgili herhangi bir teorik sonuç bilmiyorum, ancak OLS varyantı Gauss hataları olan küçük örneklerde biraz daha iyi performans gösterirse şaşırmam. Ancak zaten orta büyüklükteki örneklerde, farklar göz ardı edilebilir olmalıdır.
Achim Zeileis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.