R中存在结时如何获取Wilcoxon配对检验的精确p值
存在结时Wilcoxon配对检验精确p值获取方案
当配对样本存在结(ties)时,R内置的wilcox.test()函数会自动放弃精确p值计算,转而使用正态近似法返回结果,同时抛出以下警告:
1: In wilcox.test.default(x = c3a0, y = c3a1, alternative = c("two.sided", : cannot compute exact p-value with ties 2: In wilcox.test.default(x = c3a0, y = c3a1, alternative = c("two.sided", : cannot compute exact confidence interval with ties
出现这个问题的核心原因是:基础包wilcox.test()的精确p值计算逻辑仅适配无结、无零差值的场景,结的存在会改变检验统计量的零分布,内置算法没有覆盖这种场景的精确分布推导。
可以通过以下两种方法获取带结场景下的精确p值:
- 使用
exactRankTests包的wilcox.exact()函数
该函数内置了带结、带零差值场景下的精确分布计算逻辑,语法和基础包wilcox.test()几乎一致,学习成本极低。调用示例:# 首次使用请先运行安装命令:install.packages("exactRankTests") library(exactRankTests) # 执行配对Wilcoxon精确检验,替换为自己的样本变量即可 test_res <- wilcox.exact(x = c3a0, y = c3a1, paired = TRUE, alternative = "two.sided") # 提取精确p值 exact_p <- test_res$p.value - 使用
coin包的wilcoxsign_test()函数
该函数基于条件推断框架实现,除了精确p值计算外,还支持大样本下的蒙特卡洛近似计算,对中大型样本的适配性更好。调用示例:# 首次使用请先运行安装命令:install.packages("coin") library(coin) # 整理为长格式数据框 input_dat <- data.frame( val = c(c3a0, c3a1), grp = factor(rep(c("grp0", "grp1"), each = length(c3a0))), pair = rep(seq_along(c3a0), 2) ) # 指定distribution="exact"计算精确p值 test_res <- wilcoxsign_test(val ~ grp | pair, data = input_dat, distribution = "exact") # 提取精确p值 exact_p <- pvalue(test_res)
实用提示:如果样本量较大(比如单组样本量超过50),精确p值的计算耗时会明显上升,此时可以将分布参数调整为蒙特卡洛近似,比如设置
distribution = approximate(nresample = 10000),10000次重抽样得到的近似p值和精确p值差异极小,完全满足常规统计分析的精度要求。
内容的提问来源于stack exchange,提问作者user19315317
相关产品推荐
相关产品推荐

