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



我正在尝试计算将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换成类似random_variable_2 = st.norm.rvs(loc=1,scale=1, size=size)的东西
  2. 此外,在前两个(一个样本(和第三个(两个样本(测试之间,您正在执行两个不同的KS测试。在前两个步骤中,您将数据与固定的函数形式进行比较,以检查数据是否与该函数分布一致。由于第一种情况和第二种情况之间有相同的数据和分布,因此您希望输出是相同的。然而,在第三种情况下,您将测试两个独立的分布,看看它们是否彼此一致。由于cdf_data应该只是其他正态分布的数据点,您应该发现这两个分布是一致的,但它不一定会给您与前两种情况完全相同的答案,只是KS检验统计量和p值,表明这两个数据集来自相同的底层分布

最新更新