我已经阅读了这两个问题为什么在原假设下 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 的概率由下式给出:
其中。这个表达式的顺序是 1.e-999999999999999998,或者用外行的话(就像我一样)不太可能。我的直觉哪里错了?
