Kolmogorov Smirnov测试python中的拟合优度

时间:2018-07-12 11:59:05

标签: python statsmodels model-fitting kolmogorov-smirnov

我正在尝试调整分布。装修完成了,但是我需要测量,以选择最佳的型号。许多论文正在使用Kolomogorov-Smirnov(KS)测试。我试图实现这一点,但得到的p值却很低。

实现:

#Histigram plot

binwidth = np.arange(0,int(out_threshold1),1)    
n1, bins1, patches = plt.hist(h1, bins=binwidth, normed=1, facecolor='#023d6b', alpha=0.5, histtype='bar')

#Fitting

gevfit4 = gev.fit(h1)  
pdf_gev4 = gev.pdf(lnspc, *gevfit4)   
plt.plot(lnspc, pdf_gev4, label="GEV")

logfit4 = stats.lognorm.fit(h)  
pdf_lognorm4 = stats.lognorm.pdf(lnspc, *logfit4)  
plt.plot(lnspc, pdf_lognorm4, label="LogNormal")

weibfit4 = stats.weibull_min.fit(h1)  
pdf_weib4 = stats.weibull_min.pdf(lnspc, *weibfit4)  
plt.plot(lnspc, pdf_weib4, label="Weibull")

burr12fit4 = stats.burr12.fit(h1)  
pdf_burr124 = stats.burr12.pdf(lnspc, *burr12fit4)  
plt.plot(lnspc, pdf_burr124, label="Burr")

genparetofit4 = stats.genpareto.fit(h1)
pdf_genpareto4 = stats.genpareto.pdf(lnspc, *genparetofit4)
plt.plot(lnspc, pdf_genpareto4, label ="Gen-Pareto")

#KS-Test
print(stats.kstest(h1, lambda k : stats.genpareto.cdf(k, *genparetofit),args=(),N=len(h1),alternative ='two-sided', mode ='approx'))
print(stats.kstest(h1, lambda k : stats.lognorm.cdf(k, *logfit),args=(),N=len(h1),alternative ='two-sided', mode ='approx'))
print(stats.kstest(h1, lambda k : gev.cdf(k, *gevfit),args=(),N=len(h1),alternative ='two-sided', mode ='approx'))
print(stats.kstest(h1, lambda k : stats.weibull_min.cdf(k, *weibfit),args=(),N=len(h1),alternative ='two-sided', mode ='approx'))
print(stats.kstest(h1, lambda k : stats.burr12.cdf(k, *burr12fit),args=(),N=len(h1),alternative ='two-sided', mode ='approx'))

运行之后,我得到如下值:

KstestResult(statistic=0.065689774346523788, pvalue=2.3778862070128568e-20)
KstestResult(statistic=0.063434691987405312, pvalue=5.2567851875784095e-19)
KstestResult(statistic=0.065047355887551062, pvalue=5.8076254324909468e-20)
KstestResult(statistic=0.25249534411299968, pvalue=8.3670183092211739e-295)
KstestResult(statistic=0.068528435880779559, pvalue=4.1395594967775799e-22)

这些值合理吗?是否仍有可能选择最佳型号?是最佳拟合模型,还是统计值最小的模型?

Image of the fitted plots

编辑:

我绘制了两个拟合分布的CDF。 CDF

它们看起来非常合身。但是我仍然得到那些小的p值。

2 个答案:

答案 0 :(得分:0)

检查每种配合的AIC标准。其中最少的将是最合适的。从您的KS统计数据来看,Weibull最合适。尽管出于某些原因,人们不建议使用KS测试来评估根据样本计算出的参数。

答案 1 :(得分:0)

kstest的p值假定分布的参数是已知的。当估计参数时,它们不合适。但是,据我了解,在这种情况下,p值应该太大,而在这里它们很小。

从直方图上看,似乎有些区域与任何分布都不完全匹配。此外,数据可能会四舍五入,或在某些离散值处聚集。

如果样本量足够大,则与假设分布的任何小偏差都会导致拒绝该分布与数据匹配的假设。

要将ks-test用作选择标准,我们只需查看ks统计量或p值,然后选择最匹配的值(在这种情况下为对数正态)。我们将在测试的集合中获得最佳拟合分布,但是它与生成数据的“真实”分布有所不同。