R

為什麼 lrtest() 不匹配 anova(test=‘LRT’)

  • June 4, 2015

我正在尋找在 R 中進行似然比檢驗以比較模型擬合的方法。我首先自己編寫了代碼,然後在包中找到了默認anova()函數。但是,當我檢查時,即使“測試”參數設置為“LRT”,它總是會產生與其他兩個稍有不同的 p 值。實際上是在執行一些微妙不同的測試,還是我不理解某些東西?lrtest()``lmtest``anova()``anova()

平台:在 Linux Mint 17 上運行的 R 3.2.0,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,而其他兩個給出的 p 值為 0.60599。一個很小的差異,但一致,並且太大以至於浮點數的存儲方式不精確。有人可以解釋為什麼anova()給出不同的答案嗎?

測試統計數據的推導方式不同。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

引用自:https://stats.stackexchange.com/questions/155474

comments powered by Disqus