为什么 lrtest() 不匹配 anova(test="LRT")

机器算法验证 r 方差分析 似然比
2022-01-30 02:17:33

我正在寻找在 R 中进行似然比检验以比较模型拟合的方法。我首先自己编写了代码,然后在包中找到了默认anova()函数但是,当我检查时,即使“测试”参数设置为“LRT”,它总是会产生与其他两个稍有不同的 p 值。实际上是在执行一些微妙不同的测试,还是我不理解某些东西?lrtest()lmtestanova()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()给出不同的答案吗?

2个回答

如上一个答案所述,差异归结为缩放比例的差异,即误差标准差的不同估计量。差异的来源是(1)按比例缩放nk(无偏 OLS 估计器)与缩放比例n(有偏的 ML 估计量),以及 (2) 在零假设或替代方案下使用估计量。

中实现的似然比检验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

当然,在原假设下,两者都是渐近等价的,但在有限样本中存在很小的差异。

测试统计数据的推导方式不同。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