Python Kolmogorov-Smirnov (KS) 测试结果不一致

Posted

技术标签:

【中文标题】Python Kolmogorov-Smirnov (KS) 测试结果不一致【英文标题】:Python Kolmogorov-Smirnov (KS) Test Inconsistent Results 【发布时间】:2021-06-12 21:00:31 【问题描述】:

我正在尝试计算将 CDF 指定为数组的 KS 测试,但是,我遇到了意外的结果。经过进一步评估,我发现根据我是否将 CDF 指定为可调用、字符串或数组的不同结果。我的代码如下:

import scipy.stats as st

random_variables = st.norm.rvs(loc=1, scale=1,size=1000000)
cdf_data = st.norm.cdf(random_variables, loc=1,scale=1)
params = st.norm.fit(data=random_variables)
display(params)
print('\n')

#test 1
out = kstest(rvs=random_variables,cdf='norm',args=params)
display(out, out[0], out[1])
print('\n')

#test 2
out = kstest(rvs=random_variables,cdf=st.norm.cdf,args=params)
display(out, out[0], out[1])
print('\n')

#test 3
out = kstest(rvs=random_variables,cdf=cdf_data)
display(out, out[0], out[1])

这段代码的结果是:

(1.0004825310590526, 0.9996641807017618)


KstestResult(statistic=0.0007348981302804924, pvalue=0.6523439724424506)
0.0007348981302804924
0.6523439724424506


KstestResult(statistic=0.0007348981302804924, pvalue=0.6523439724424506)
0.0007348981302804924
0.6523439724424506


KstestResult(statistic=0.500165, pvalue=0.0)
0.500165
0.0

鉴于将大样本数据与其生成样本的确切分布进行比较,我预计无法拒绝零假设。这是测试 1 和 2 中的情况,但在测试 3 中并非如此。我希望能够使用“cdf”参数的数组参数来复制此测试。关于我在测试 3 中做错了什么的任何帮助都会非常有帮助。我的 numpy 是 1.19.2 版本,而 scipy 是 1.5.2。谢谢!

【问题讨论】:

【参考方案1】:

我认为有两件事可能会导致您的困惑。

    我认为您不想与cdf_data = st.norm.cdf(random_variables, loc=1,scale=1) 进行比较。这是在random-variables 的所有 x 值处返回累积分布函数的值。在 KS 测试中,您正在比较两个分布,而您的 cdf_datarandom_variable 是两个非常不同的分布,因此您希望得到的 p 值为 0。我建议您将 cdf_data 替换为 @987654326 之类的东西@ 此外,您正在前两个(一个样本)和第三个(两个样本)测试之间执行两个不同的 KS 测试。在前两个中,您将数据与固定的函数形式进行比较,以检查数据是否与该函数分布一致。由于您在案例一和案例二之间拥有相同的数据和分布,因此您会期望输出相同。但是,在第三种情况下,您正在测试两个独立的分布以查看它们是否彼此一致。由于cdf_data应该只是其他正态分布的数据点,你应该会发现这两个分布是一致的,但它不一定给你与前两种情况完全相同的答案,只是KS检验统计量和p值表明这两个数据集来自相同的底层分布。

【讨论】:

以上是关于Python Kolmogorov-Smirnov (KS) 测试结果不一致的主要内容,如果未能解决你的问题,请参考以下文章

LCG 在 Kolmogorov-Smirnov 测试中是不是像我的代码所暗示的那样严重失败?

3.5 样本分布K-S检验 ——python实战

KS(Kolmogorov-Smirnov)(转)

R语言Kolmogorov-Smirnov假设检验(正态性检验):检验数据的正态性

Kolmogorov-Smirnov 测试 MATLAB 中的正态性 - 数据归一化?

Kolmogorov-Smirnov 检验中的假设检验 - 无论是临界值还是 p 值