Kolmogorov-Smirnov 检验统计量

问题描述

有人能解释一下为什么如果我手动计算 KS 测试统计量,结果与使用 scipy.stats.kstest 时的结果不同吗?

>>> sample = np.array([1000,2000,2500,3000,5000])
>>> ecdf = np.array([0.2,0.4,0.6,0.8,1. ])
>>> cdf = stats.weibull_min(0.3,100,4000).cdf(sample)
>>> abs(ecdf - cdf).max()
0.3454961536273503

>>> stats.kstest(rvs=sample,cdf=stats.weibull_min(0.3,4000).cdf)
KstestResult(statistic=0.4722995454382698,pvalue=0.1534647709785294)

解决方法

好的,我意识到我犯的错误,所以我会回答我自己的问题。由于 ECDF 的右连续性/左不连续性,无法将 KS-Statistic 计算为 abs(ecdf - cdf).max()。正确的做法是:

>>> sample = np.array([1000,2000,2500,3000,5000])
>>> ecdf = np.array([0,0.2,0.4,0.6,0.8,1. ])
>>> cdf = stats.weibull_min(0.3,100,4000).cdf(sample)
>>> max([(ecdf[1:] - cdf).max(),(cdf - ecdf[:-1]).max()])
0.4722995454382698