了解多个 KS 测试

机器算法验证 p 值 Python kolmogorov-smirnov 测试
2022-03-19 17:06:55

我已经阅读了这两个问题为什么在原假设下 p 值是均匀分布的?了解 scipy Kolmogorov-Smirnov 测试

这启发了我进行以下实验。

我考虑从均匀分布中抽取的(100)个随机样本,每个样本有 10000 个数字:

import numpy as np
from scipy.stats import kstest

np.random.seed(1)
data = np.random.rand(1e6).reshape(100, -1) # Retrieve 100 samples of 10000 random numbers
pvals = np.array([kstest(data[i, :], 'uniform')[1] for i in range(100)]) # Use KS test to determine the p-value that they are drawn from a uniform distribution

p 值应均匀分布在 0 和 1 之间,因为每个样本均来自均匀分布的原假设为真。在代码中,pvals包含 p 值,并且应该在 0 和 1 之间均匀分布。如何测试它们是否均匀分布?好吧,对 p 值本身进行另一个KS 测试。的确:

kstest(pvals, 'uniform') # gives (0.066826050153764194, 0.78391523133790764)

我的问题是:一个样本在其单独的 KS 测试中失败的程度如何,因为 p 值分布不均匀?也就是说,导致第二次KS测试也失败?让我们注入几个失败的测试,看看结果:

for i in range(100):
    pvals[i] = 1.e-1000000000000000000
    print(i+1, kstest(pvals, 'uniform'))

1 (0.076826050153764203, 0.58422275090933029)
2 (0.076826050153764203, 0.58422275090933029)
3 (0.086826050153764212, 0.41822788102030262)
4 (0.08849630728801916, 0.39396788117495984)
5 (0.098496307288019169, 0.26906188301811063)
6 (0.10849630728801915, 0.1764729585550886)
7 (0.11849630728801916, 0.11114480850529129)
8 (0.12849630728801917, 0.067209484059870706)
9 (0.13849630728801915, 0.039015977679199176)
10 (0.14849630728801916, 0.021740018916014403)
11 (0.15849630728801917, 0.011625520543988133)
[...]

这告诉我,要让第二个 KS 检验承认 p 值分布不均匀,置信度为 0.99,我必须注入 11 个失败的检验,每个检验都与 p-value = 1.e-1000000000000000000 一样糟糕。

然而,直觉上,我预计 100 个 p 值中的一个小于或等于 1.e-1000000000000000000 的概率由下式给出:

100!1!99!p(1p)99

其中这个表达式的顺序是 1.e-999999999999999998,或者用外行的话(就像我一样)不太可能。我的直觉哪里错了?p=101000000000000000000

1个回答

Kolmogorov Smirnov 统计量使用了一种相当通用的非均匀性度量——它对分布可能不均匀的每一种方式都不是特别敏感。特别是,它对您正在查看的特定类型的不均匀性并不是特别敏感。

KS 检验统计量着眼于 cdf 和 ecdf 之间的最大距离。

承认 p 值分布不均匀,置信度为 0.99

这不是假设检验的工作方式。你没有“0.99 的信心”。我想你的意思是你正在做你的测试α=0.01

时,临界值为n=1001%0.163

您输入的每个小值都会将接近 0 的 ecdf 向上移动大约 0.01(如果分布接近均匀,则移动大约一半的距离接近 0.5)。如果 ecdf 以前非常接近统一,您可能会期望它需要大约 16 个值才能达到该临界值。

然而,在实践中,由于典型样本的其余部分存在自然随机变化,因此需要少于 16 个;它在制服上摇摆不定:

在此处输入图像描述

左侧是来自实际制服的 100 个值样本的 ECDF。由于随机变化,中心存在一些偏差,但远不足以达到 1% 的显着性水平。右侧是同一样本的 ECDF,其中前 11 个值(不是最小的 11 个,只是从样本开始的 11 个值)被正好替换为 0*。在这种情况下,这足以通过统计数据的 1% 临界值。(在这种情况下,少于 11 个就足够了,但通常需要多于 11 个。)

*(即使给定这样一个值的单个实例,其他一些测试也可以毫无困难地识别非正态性)

因此,如果您想通过插入小值来使接近统一的东西看起来与 KS 测试不统一,则需要插入很多值。如果您想要一个对“太多非常小的值”特别敏感的测试,那么有许多比 KS 测试更好的选择。Anderson-Darling 检验是一个对您在此处构建的特定类型的偏差更敏感的检验示例。