如果两个样本来自同一分布,则进行非参数检验

机器算法验证 r 假设检验 非参数 wilcoxon-mann-whitney 检验 威尔克森符号秩
2022-02-09 14:49:15

我想检验两个样本来自同一个总体的假设,而不对样本或总体的分布做出任何假设。我该怎么做?

从 Wikipedia 来看,我的印象是 Mann Whitney U 测试应该是合适的,但在实践中它似乎对我不起作用。

具体而言,我创建了一个数据集,其中包含两个大样本(a,b)(n = 10000)并从两个非正态(双峰)总体中抽取,相似(均值相同),但不同(标准差围绕“驼峰”。)我正在寻找一种能够识别这些样本不是来自同一人群的测试。

直方图视图:

双峰样品

代码:

a <- tibble(group = "a",
            n = c(rnorm(1e4, mean=50, sd=10),
                  rnorm(1e4, mean=100, sd=10)))
b <- tibble(group = "b",
            n = c(rnorm(1e4, mean=50, sd=3),
                  rnorm(1e4, mean=100, sd=3)))
ggplot(rbind(a,b), aes(x=n, fill=group)) +
  geom_histogram(position='dodge', bins=100)

这是令人惊讶的 Mann Whitney 检验(?)未能拒绝样本来自同一总体的原假设:

> wilcox.test(n ~ group, rbind(a,b))

        Wilcoxon rank sum test with continuity correction

data:  n by group
W = 199990000, p-value = 0.9932
alternative hypothesis: true location shift is not equal to 0

帮助!我应该如何更新代码以检测不同的分布?(如果有的话,我特别想要一种基于通用随机化/重采样的方法。)

编辑:

谢谢大家的回答!我很兴奋地了解更多关于 Kolmogorov-Smirnov 似乎非常适合我的目的的信息。

我了解 KS 测试正在比较两个样本的这些 ECDF:

ECDF

在这里,我可以直观地看到三个有趣的功能。(1) 样本来自不同的分布。(2) A 在某些点明显高于 B。(3) 在某些其他点上,A 明显低于 B。

KS 检验似乎能够对这些特征中的每一个进行假设检查:

> ks.test(a$n, b$n)

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D = 0.1364, p-value < 2.2e-16
alternative hypothesis: two-sided

> ks.test(a$n, b$n, alternative="greater")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^+ = 0.1364, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y

> ks.test(a$n, b$n, alternative="less")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^- = 0.1322, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

这真的很整洁!我对这些特性中的每一个都有实际的兴趣,因此 KS 测试可以检查它们中的每一个是很棒的。

1个回答

Kolmogorov-Smirnov 检验是最常用的方法,但也有一些其他选择。

测试基于经验累积分布函数。基本程序是:

  • 选择一种方法来测量 ECDF 之间的距离。由于 ECDF 是函数,因此显而易见的候选者是Lp范数,用于测量函数空间中的距离。这个距离就是我们的检验统计量
  • 在样本来自相同分布的零假设下找出检验统计量的分布(幸运的是,人们已经为最常见的距离做到了这一点!)
  • 选择一个门槛,α, 对于您的假设,如果计算的检验统计量在α%点 2 的分布尾部。

对于 Kolmogorov-Smirnov 检验,检验统计量是两个经验 CDF 之间的最大距离(或者如果您想更专业一点L规范)。这在 R 中非常容易实现:

ks.test(a,b)

如果p-值小于您选择的阈值,我们拒绝样本来自同一分布的原假设。

另一种选择是 Cramer-von Mises 检验,它使用平方L2norm 作为测试统计量,并在dgof包中实现为cvm.test(). CVM 测试“更好”,因为距离度量考虑了两个 ECDF 的整体,而不是仅仅挑选出最大的距离。

编辑:

假设我们有大小样本nm,我们想要应用我们的假设检验。

要将其转换为采样类型的过程,我们可以执行以下操作:

  1. 生成大小样本nm来自相同的分布。对于 KS 测试(值得注意的是,IMO),只要分布在每次迭代中发生变化,只要nm保持原样。
  2. 计算样本的距离度量。对于 KS 测试,这只是最大值。经验 CDF 之间的差异。
  3. 存储结果并返回步骤 1。

最终,您将从零假设下的检验统计量分布中建立大量样本,您可以使用其分位数以您想要的任何显着性水平进行假设检验。对于 KS 检验统计量,此分布称为 Kolmogorov 分布。

请注意,对于 KS 检验,这只是浪费计算量,因为理论上分位数的特征非常简单,但该过程通常适用于任何假设检验。