我想检验两个样本来自同一个总体的假设,而不对样本或总体的分布做出任何假设。我该怎么做?
从 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:
在这里,我可以直观地看到三个有趣的功能。(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 测试可以检查它们中的每一个是很棒的。