Scipy与statsmodels的KS检验结果不一致,原因何在?
代码
from scipy import stats import statsmodels.api as sm data=[-0.032400000000000005,-0.0358,-0.035699999999999996,-0.029500000000000002,-0.0227,-0.0146,-0.0125,-0.0103,-0.0182,-0.0137,-0.021099999999999997,-0.0327,-0.0279,-0.0325,-0.0252,-0.015700000000000002,-0.0148,-0.013999999999999999,-0.0137,-0.013500000000000002,-0.0042,0.0044,0.0212,0.027999999999999997,0.036699999999999997,0.0447,0.0524,0.056100000000000004,0.0519,0.0571,0.0424,0.045899999999999996,0.0496,0.053,0.0594,0.0712,0.0949,0.09050000000000001,0.0907,0.0616,0.0235,0.011000000000000001,-0.0103,0.0075,0.018799999999999997,0.0268,0.0383,0.0392,0.0546,0.0565,0.06509999999999999,0.0681,0.0622,0.061900000000000004,0.056900000000000006,0.0583,0.0495,0.053099999999999994,0.0612,0.0572,0.0636,0.0599,0.0582,0.0559,0.051,0.0491,0.0423,0.0373,0.0331,0.0226,0.0159,0.0144,0.0072,0.0106,0.0139,0.0204,0.026600000000000002,0.0311,0.0351,0.0294,0.028399999999999998,0.0262,0.0273,0.0256,0.024700000000000003,0.009399999999999999,-0.004,-0.0087,-0.0097,-0.0008,0.0083,0.01,0.0107,0.0132,0.0112] print('scipy:') print(stats.ks_1samp(data, stats.norm.cdf)) print('statsmodels:') print(sm.stats.diagnostic.kstest_normal(data))
运行结果
scipy: KstestResult(statistic=0.48572091653418137, pvalue=3.628993889999382e-21) statsmodels: (0.0954414677540868, 0.039520654276486475)
差异原因
两者的核心区别在于对比的正态分布参数设置不同:
- Scipy的
stats.ks_1samp直接传入stats.norm.cdf,这是**标准正态分布(均值=0,标准差=1)**的累积分布函数。你的数据均值和标准差显然不是0和1,用标准正态分布拟合自然会得到差异极大的统计量和极小的p值。 - Statsmodels的
kstest_normal会自动根据输入样本计算均值和标准差,用这个拟合出来的正态分布做KS检验,这也是“样本是否服从正态分布”检验的常规做法——先估计分布参数,再做拟合优度检验。
如果要让Scipy得到和Statsmodels一致的结果,需要先估计数据的均值和标准差,再传入对应的正态分布CDF:
# 修正后的Scipy调用 mu, std = stats.norm.fit(data) print(stats.ks_1samp(data, lambda x: stats.norm.cdf(x, loc=mu, scale=std)))
内容的提问来源于stack exchange,提问作者mogcai
相关产品推荐
相关产品推荐

