为何bf.test(onewaytests)与leveneTest(center=median)的Brown-Forsythe检验结果不同?
关于Brown–Forsythe检验两种函数结果不一致的原因疑问
我使用glmertree包中的lmertree函数,分析三水平因子source(代表三种情境)对acceleration的影响。通过可视化检查发现存在异方差,因此对因变量acceleration进行对数变换。虽可视化显示异方差情况有所改善,但leveneTest仍检测到组间方差存在显著差异。同事建议改用Brown–Forsythe检验,但使用不同函数测试却得到矛盾结果:使用onewaytests包的bf.test函数未发现显著差异;使用指定center=median参数的leveneTest仍得出显著差异。想了解导致这两种检验结果不同的原因。
所用代码如下:
# 添加对数变换后的加速度列 CA_degrees_PT$log_acce_RHwri_norm_mean <- log(CA_degrees_PT$acce_RHwri_norm_mean) # 拟合lmertree模型 log_acce_RHwri_norm_mean_lmertree <- lmertree(log_acce_RHwri_norm_mean ~ 1|duration_nFrames + (1|participant)|source , data = CA_degrees_PT) plot(log_acce_RHwri_norm_mean_lmertree, which = "tree", gp = gpar(cex = .9)) # 残差诊断 hist(residuals(log_acce_RHwri_norm_mean_lmertree)) qqnorm(residuals(log_acce_RHwri_norm_mean_lmertree)) qqline(residuals(log_acce_RHwri_norm_mean_lmertree)) resids_log_acce <- residuals(log_acce_RHwri_norm_mean_lmertree) preds_log_acce <- predict(log_acce_RHwri_norm_mean_lmertree) plot(CA_degrees_PT$source, resids_log_acce) # 方差齐性检验 leveneTest(resids_log_acce ~ groups, center = median) bf.test(resids_log_acce ~ groups, data = CA_degrees_PT)
结果差异的可能原因
- 计算逻辑的细节差异:
Brown–Forsythe检验核心是计算每个观测值与组中位数的绝对偏差,但car::leveneTest(center=median)和onewaytests::bf.test在偏差计算、统计量推导上存在细微区别。比如前者可能对偏差做了额外方差调整,或采用近似F统计量计算,而后者严格遵循Brown–Forsythe检验的原始公式,导致统计量数值不同。 - 数据输入的匹配问题:
代码中leveneTest使用提取出的残差resids_log_acce和groups变量,而bf.test直接调用数据框中的分组。如果groups变量和CA_degrees_PT$source的分组不完全对应,或残差与groups的观测顺序不匹配,会直接导致检验结果偏差。 - 随机效应的考虑差异:
模型包含duration_nFrames和participant两个随机效应,leveneTest使用的是扣除随机效应影响后的模型残差,而bf.test可能直接对原始残差做分组计算,未考虑模型的嵌套结构,导致两者的分析基础数据本质不同。 - 自由度的计算区别:
不同包对检验的自由度处理不同。leveneTest会考虑模型拟合后剩余的自由度,而bf.test可能采用原始样本量的自由度计算,这会直接影响p值的大小。
内容的提问来源于stack exchange,提问作者Sébastien
相关产品推荐
相关产品推荐

