R
為什麼 lrtest() 不匹配 anova(test=‘LRT’)
我正在尋找在 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