R语言multcomp包多重比较校正置信区间的用法疑问
R multcomp包校正置信区间获取方法解答
核心结论
你在confint()中直接传入adjusted(type = 'foo')的写法是无效的,不会触发任何校正逻辑。
原因说明
multcomp针对glht类对象的confint()方法,根本没有定义接收多重比较校正类型的形参。你传入的adjusted(...)会被R的参数匹配规则归到未定义的...参数列表里直接忽略,所以既不会报错,也不会对计算过程产生任何影响。- 你观察到的不同校正参数下结果的微小差异,完全是包内计算分位数时用到的蒙特卡洛随机模拟过程带来的随机波动——哪怕你传
adjusted(type = "不存在的方法名"),只要不固定随机种子,跑出来的结果也会有类似的微小差别,和你指定的校正类型没有关系。 - 为什么
summary()里传test = adjusted(...)有用?因为summary.glht方法明确定义了test形参用来接收校正设置;但confint.glht没有对应参数,传了也白传。另外confint()的输出本来就不会标注所用的校正类型,要查看glht对象绑定的校正规则,直接查看对象的type和test属性即可。
正确用法
多重比较的校正方法需要在创建glht对象时就通过test参数指定,后续调用confint()时会自动继承对象里绑定的校正设置,不需要额外传参:
library(multcomp) set.seed(1234) df <- mtcars mod <- lm(formula = mpg ~ cyl + disp + hp + drat + wt + qsec + vs + gear, data = df) K <- length(coefficients(mod)) # 创建glht对象时直接指定需要的校正方法 modGLHT_none <- glht(model = mod, linfct = diag(K), test = adjusted(type = "none")) modGLHT_ss <- glht(model = mod, linfct = diag(K), test = adjusted(type = "single-step")) modGLHT_shaffer <- glht(model = mod, linfct = diag(K), test = adjusted(type = "Shaffer")) modGLHT_westfall <- glht(model = mod, linfct = diag(K), test = adjusted(type = "Westfall")) # 直接调用confint即可得到对应校正后的置信区间,无需额外传参 ci_list <- lapply( list(modGLHT_none, modGLHT_ss, modGLHT_shaffer, modGLHT_westfall), function(x) round(as.data.frame(confint(x)$confint)[6,], 3) ) # 结果对比 do.call(rbind, ci_list)
固定随机种子后重新运行你之前的错误写法代码就会发现,不管你在confint()里传什么校正类型,只要glht对象本身的设置没变,结果就完全一致,足以证明传参无效。
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

