如何在 Python 中进行单尾双样本 Kolmogorov-Smirnov 测试?



我正在尝试在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 轴值(。

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]

最新更新