Python Scipy中的双样本Kolmogorov-Smirnov检验

时间:2012-06-04 16:25:37

标签: python numpy scipy statistics distribution

我无法弄清楚如何在Scipy中进行双样本KS测试。

阅读文档scipy kstest

我可以看到如何测试分布与标准正态分布相同的位置

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
test_stat = kstest(x, 'norm')
#>>> test_stat
#(0.021080234718821145, 0.76584491300591395)

这意味着在p值为0.76时,我们不能拒绝两个分布相同的零假设。

但是,我想比较两个分布,看看我是否可以拒绝它们是相同的零假设,如:

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
z = np.random.normal(1.1,0.9, 1000)

并测试x和z是否相同

我尝试了天真:

test_stat = kstest(x, z)

并收到以下错误:

TypeError: 'numpy.ndarray' object is not callable

有没有办法在Python中进行双样本KS测试?如果是这样,我该怎么做?

提前感谢

2 个答案:

答案 0 :(得分:85)

您正在使用单样本KS测试。您可能需要ks_2samp

>>> from scipy.stats import ks_2samp
>>> import numpy as np
>>> 
>>> np.random.seed(12345678)
>>> x = np.random.normal(0, 1, 1000)
>>> y = np.random.normal(0, 1, 1000)
>>> z = np.random.normal(1.1, 0.9, 1000)
>>> 
>>> ks_2samp(x, y)
Ks_2sampResult(statistic=0.022999999999999909, pvalue=0.95189016804849647)
>>> ks_2samp(x, z)
Ks_2sampResult(statistic=0.41800000000000004, pvalue=3.7081494119242173e-77)

结果可以解释如下。 1.您可以根据样本大小将python给出的statistic值与KS-测试临界值表进行比较。当statistic值高于临界值时,两个分布是不同的。 您可以参考KS双样本临界值表,如此处http://sparky.rice.edu/astr360/kstest.pdf。 2.或者您可以将p-value与显着性水平 a 进行比较,通常a = 0.05或0.01(您决定,a越小,越重要)。如果p值低于 a ,那么两个分布很可能是不同的。  

答案 1 :(得分:1)

这就是scipy docs所说的:

  

如果K-S统计量很小或p值很高,那么我们就不能拒绝这两个样本的分布是相同的假设。

不能拒绝并不代表我们确认。