You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何lmtest::bptest()与check_heteroskedasticity()的BP检验结果存在差异?

Breusch-Pagan检验:performance::check_heteroscedasticity()与lmtest::bptest()结果不一致的原因

在对线性模型执行异方差检验时,我使用了两个R函数实现Breusch-Pagan检验:lmtest::bptest()和performance::check_heteroskedasticity()。根据check_heteroskedasticity的文档说明,它所做的正是Breusch-Pagan(1979)的(非)恒定误差方差检验,但实际运行后两个函数给出的p值存在差异——仅check_heteroskedasticity的p值小于0.05。我想确认是否因对函数的理解或应用有误导致了这一现象,以下是复现该差异的示例:

m <- lm(mpg ~ hp + cyl, data = mtcars)

performance::check_heteroscedasticity(m)
lmtest::bptest(m, studentize = TRUE)
lmtest::bptest(m, studentize = FALSE)

运行结果:

> performance::check_heteroscedasticity(m)
Warning: Heteroscedasticity (non-constant error variance) detected (p = 0.041).

> lmtest::bptest(m, studentize = TRUE)

    studentized Breusch-Pagan test

data:  m
BP = 5.5086, df = 2, p-value = 0.06365

> lmtest::bptest(m, studentize = FALSE)

    Breusch-Pagan test

data:  m
BP = 4.4698, df = 2, p-value = 0.107

结果差异的核心原因

两个函数的Breusch-Pagan检验实现细节存在关键差别:

  • performance::check_heteroscedasticity()默认使用学生化残差,并采用基于残差平方对原模型自变量回归的F检验计算p值。F检验在小样本(如mtcars的32个观测)下的统计表现通常比卡方检验更稳健。
  • lmtest::bptest()默认使用原始残差+卡方检验;即使设置studentize=TRUE启用学生化残差,它仍然基于卡方统计量计算p值,而非F检验。

可以手动复现performance包的检验逻辑验证:

# 手动计算performance的检验结果
resid_sq <- residuals(m)^2
model_resid <- lm(resid_sq ~ hp + cyl, data = mtcars)
anova(model_resid)$Pr[1] # 输出约0.041,与check_heteroscedasticity结果一致

而lmtest::bptest(m, studentize=TRUE)的卡方统计量为5.5086,对应卡方(2)分布的p值为1-pchisq(5.5086,2)=0.06365,与输出结果匹配。

总结

两个函数均属于Breusch-Pagan检验的变体,差异并非使用错误,而是检验统计量的选择(F vs 卡方)和残差处理逻辑的细微差别导致:

  • 若样本量较小,performance::check_heteroscedasticity()的F检验结果更可靠;
  • 若需要严格匹配经典Breusch-Pagan检验的卡方统计量标准,选择lmtest::bptest()即可。

内容的提问来源于stack exchange,提问作者etrowbridge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:40:08