【问题标题】:How can you perform one-tailed two-sample Kolmogorov–Smirnov Test in Python?如何在 Python 中执行单尾二样本 Kolmogorov–Smirnov 检验?
【发布时间】:2020-02-05 18:53:01
【问题描述】:

我正在尝试在 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测试?

另外,我怎样才能找出距离最大的位置? (x 轴值)。

【问题讨论】:

    标签: python python-3.x statistics


    【解决方案1】:

    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 值,您可以使用此功能(主要是从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]
    

    【讨论】:

    • 谢谢!! ks_2samp 的任何功能可以告诉我们最大差异发生的位置?
    • 没有。这与测试无关。你的意思也不明显。 [0, 1] 中的两个 cdf 值,其中确定了 KS 统计量,即样本之间的最大差异?
    • 正确;它与测试无关,而只是我想从测试中获得的信息。您提到的 KS 统计量是 d-stat(表示为 statistic)。我想知道的是statistic 出现在x 轴的哪个位置。例如,如果statistic 是 0.05,我想找出分布中 0.05 的最大差异发生在哪里。
    • 对不起,我看到你已经在你的问题中提到了它。请参阅我上面的编辑(并请赞成:))
    猜你喜欢
    • 2022-01-16
    • 2015-03-25
    • 2014-09-21
    • 2014-12-30
    • 1970-01-01
    • 2020-08-06
    • 2021-06-18
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多