Scipy 的 ks_2samp 函数给出了好的 D_statistic 但错误的 p_value

Scipy's ks_2samp function gives good D_statistic but wrong p_value

我正在尝试执行两个样本的 Kolmogorov-Smirnov 检验,以检查两个样本是否来自同一总体。这是重现我的问题的代码:

from scipy.stats import ks_2samp
import numpy as np

x = list(np.random.normal(10, 1, 3000))
y = list(np.random.normal(12, 1, 2000))
d_statistic, p_value = ks_2samp(x, y)

对于早于 1.3 的 scipy 版本,我得到以下结果: d_statistic = 0.67317 和 p_value = 0.0

然而 scipy 版本 >= 1.3: d_statistic = 0.6705 和 p_value = 0.9904774590824749

两者给出的 d_statistic 几乎相同,但 scipy 的最新版本似乎给了我一个错误的 p_value,我不明白为什么。实际上 x 和 y 显然是两个不来自同一总体的样本。

我做了一些研究,自从 scipy==1.3 发布 'exact' 模式并且是小样本的默认模式 (len(x), len(y) <= 10000 which是我的情况)。但是,如果我将模式从 'exact' 更改为 'asymp',我得到的结果与我从最旧的 scipy 版本获得的结果相同。

d_statistic, p_value = ks_2samp(x, y, mode='asymp')

计算 p_value 时 'exact' 模式是否有问题,或者我是否遗漏了什么?

感谢您的帮助, h1t5uj1

对于那些将面临与我相同的问题的人。 这是一个错误,当样本量超过几千时出现(归功于 pvanmulbregt 解决了这个问题:https://github.com/scipy/scipy/issues/11184)。 scipy的1.5.0版本应该已经解决了。同时,您可以将模式从 'exact' 更改为 'asymp',或者您可以降级 scipy 版本。

希望这对您有所帮助, H1t5uj1