Scipy的ks_2samp函数给出了很好的D_statistic,但是p_value是错误的。

问题描述 投票:1回答:1

我试图进行两个样本的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)

在scipy版本大于1.3的情况下,我得到以下结果: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后,"精确 "模式被发布,并且是小样本的默认模式(len(x), len(y) <=10000,这是我的情况)。然而,如果我把模式从'exact'改成'asymp',我得到的结果和我从最早的scipy版本得到的结果是一样的。

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

是'exact'模式在计算p_value时有问题,还是我错过了什么?

谢谢你的帮助,h1t5uj1

python-3.x kolmogorov-smirnov scipy.stats
1个回答
1
投票

对于那些将面临和我一样的问题的人。这是一个bug,当样本量超过几千的时候就会出现(归功于pvanmulbregt,他解决了这个问题。https:/github.comscipyscipyissues11184)。). 这个问题应该会在scipy的1.5.0版本中解决。同时你可以把模式从'精确'改成'非对称',或者你可以直接降级你的scipy版本。

希望对你有所帮助,H1t5uj1

© www.soinside.com 2019 - 2024. All rights reserved.