R函数`wilcox.test`中的伪中位数是什么?

机器算法验证 r 非参数 wilcoxon-mann-whitney 检验
2022-04-07 22:48:58

在我了解什么是伪中位数的过程中,我尝试使用wikipedia中的定义在 R 中手动计算它。根据我的数据计算,我发现报告的值与wilcox.test我计算为数据的成对平均值中位数的值完全不同(0.275 对 0.33,而置信区间为 0.330;0.345)。我想问我遗漏了什么,所以我尝试为这个 Q 创建一个可重现的示例,我发现报告的值与我生成的数据几乎相同:

set.seed(910401)
distr_data <- rgamma(100,0.1,1)

wilcox.test(distr_data, conf.int = T)
# 0.006787143

all_pairs <- t(combn(distr_data, 2))
all_pair_means <- (all_pairs[,1] + all_pairs[,2]) / 2
median(all_pair_means)
# 0.006970087

因此,在尝试了不同的样本大小和参数后,我对伽马分布进行了一些尝试,最终发现了一个也会产生完全不同的结果:

distr_data <- rgamma(100,0.1,1000)

wilcox.test(distr_data, conf.int = T)
# 6.533661e-05 
# CI 6.049175e-05 8.016369e-05

all_pairs <- t(combn(distr_data, 2))
all_pair_means <- (all_pairs[,1] + all_pairs[,2]) / 2
median(all_pair_means)
# 9.181717e-06

所以我的问题来了。伪中线到底是什么wilcox.testwilcox.test和维基百科伪媒体不同意时,这意味着什么?

1个回答

一个很好的线索是查看 wilcox.test 的实际代码:

https://github.com/SurajGupta/r-source/blob/master/src/library/stats/R/wilcox.test.R

具体来说,关于 1 个样本测试的伪中值估计的位是第 91-122 行:

x <- x + mu             # we want a conf.int for the median
alpha <- 1 - conf.level
diffs <- outer(x, x, "+") 
diffs <- sort(diffs[!lower.tri(diffs)]) / 2
...
ESTIMATE <- c("(pseudo)median" = median(diffs))

当您这样做时,您的代码通常会丢失成对的两次相同元素all_pairs <- t(combn(distr_data, 2))

而是尝试:

set.seed(910401)
distr_data <- rgamma(100,0.1,1000)
wilcox.test(distr_data, conf.int = T, exact = T)
# 6.788116e-06
all_pairs <- rbind(t(combn(distr_data, 2)),cbind(distr_data,distr_data)) 
all_pair_means <- (all_pairs[,1] + all_pairs[,2]) / 2
median(all_pair_means)
# 6.788116e-06

请注意,我还添加exact==T了您不想对大型数据集执行但在这种情况下实际上很重要的内容,否则您的估计会略有偏差。