繁体   English   中英

如何在 Python 中执行单尾双样本 Kolmogorov–Smirnov 检验?

[英]How can you perform one-tailed two-sample Kolmogorov–Smirnov Test in Python?

我正在尝试在 Python 3 中执行两个样本 KS 测试,以检测分布之间的任何显着差异。 为了方便起见,让ab的数据列为.csv 我想比较一下,我简单地跑了下面的“代码”:

from scipy.stats import ks_2samp
ks_2samp(a, b)

返回值包含最大距离 ( statistics ) 和 p 值 ( pvalue ):

Ks_2sampResult(statistic=0.0329418537762845, pvalue=0.000127997328482532)

我想知道的是,由于ks_2samp只处理双面双样本 KS 测试,有没有办法在 Python 中执行单面双样本 KS 测试?

另外,如何找出距离最大的position? (x 轴值)。

scipy.stats.ks_2samp已经支持你想要的了。 您只需要告诉您要测试的方向,即假设哪个样本大于或小于另一个。

但是,此选项设置alternative仅在 scipy 1.3.0 之后可用。

ks_2samp(a, b, alternative='less')     # get p-value for testing if a < b
ks_2samp(a, b, alternative='greater')  # get p-value for testing if a > b

编辑:要识别出现最大差异的 x 值,您可以使用此 function (主要从ks_2samp的源复制粘贴):

def ks_2samp_x(data1, data2, alternative="two-sided"):
    data1 = np.sort(data1)
    data2 = np.sort(data2)
    n1 = data1.shape[0]
    n2 = data2.shape[0]

    data_all = np.concatenate([data1, data2])
    # using searchsorted solves equal data problem
    cdf1 = np.searchsorted(data1, data_all, side='right') / n1
    cdf2 = np.searchsorted(data2, data_all, side='right') / n2
    cddiffs = cdf1 - cdf2
    minS = np.argmin(cddiffs)   # ks_2samp uses np.min or np.max respectively 
    maxS = np.argmax(cddiffs)   # now we get instead the index in data_all
    alt2Dvalue = {'less': minS, 'greater': maxS, 'two-sided': max(minS, maxS)}
    d_arg = alt2Dvalue[alternative]
    return data_all[d_arg]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM