scipy拟合优度测试的变化。
scikit-gof的Python项目详细描述
提供Kolmogorov Smirnov、Cramer von Mises和Anderson Darling的变体 完全指定连续分布的拟合优度检验。
示例
>>>fromscipy.statsimportnorm,uniform>>>fromskgofimportks_test,cvm_test,ad_test>>>ks_test((1,2,3),uniform(0,4))GofResult(statistic=0.25,pvalue=0.97...)>>>cvm_test((1,2,3),uniform(0,4))GofResult(statistic=0.04...,pvalue=0.95...)>>>data=norm(0,1).rvs(random_state=1,size=100)>>>ad_test(data,norm(0,1))GofResult(statistic=0.75...,pvalue=0.51...)>>>ad_test(data,norm(.3,1))GofResult(statistic=3.52...,pvalue=0.01...)
简单测试
scikit gof目前只提供三个非参数测试,让您 将样本与参考概率分布进行比较。这些是:
- ks_test()
- kolmogorov-smirnov上确界统计量;几乎与 scipy.stats.kstest()带有alternative='two-sided'但带有 (希望)更精确的p值计算;
- cvm_test() cramer von mises l2统计量,对 统计分布(但似乎是最好的可用分布);
- ad_test() DD> Anderson Darling统计量及其分布的公平逼近 与组合scipy.stats.anderson()不同的是,这个需要完全 指定的假设分布。
简单的测试函数使用公共接口,将 要比较的数据(示例),作为第二个参数冻结scipy.stats 分配。 它们返回一个带两个字段的命名元组:statistic和pvalue。
举个简单的例子,假设样本(.4,.1,.7)来自 来自[0,1]上的均匀分布:
ifks_test((.4,.1,.7),unif(0,1)).pvalue<.05:print("Hypothesis rejected with 5% significance.")
如果你的样品很大,而且你提前把它们分类,通过 assume_sorted=True以节省一些时间,而这些时间将浪费在诉诸上。
延伸
简单的测试包括两个阶段:计算测试统计和 确定结果值的可能性(根据假设)。 可通过提供新的统计计算程序或 统计的替代分布。
计算统计量的函数是对参考文献的评价 已排序数据的累积分布函数,预计返回 一个数字。 对于一个简单的测试,如果样本确实来自假设的(连续的) 分布,传递给函数的值应均匀分布 超过[0,1]。
下面是一个简单的统计函数示例:
defex_stat(data):returnabs(data.sum()-data.size/2)
提供的测试的统计函数,ks_stat(),cvm_stat(), 和ad_stat(),可以从skgof.ecdfgof导入。
统计分布应该从rv_continuous派生并实现 至少有一个抽象的_cdf()或_pdf()方法(您可以 还可以考虑直接编码_sf(),以提高结果的精度 接近1)。例如:
fromnumpyimportsqrtfromscipy.statsimportnorm,rv_continuousclassex_unif_gen(rv_continuous):def_cdf(self,statistic,samples):return1-2*norm.cdf(-statistic,scale=sqrt(samples/12))ex_unif=ex_unif_gen(a=0,name='ex-unif',shapes='samples')
提供的发行版分别位于单独的模块ksdist, cvmdist,和addist。
一旦你有了统计计算功能和统计分布 可以使用simple_test:
组合两部分fromfunctoolsimportpartialfromskgof.ecdfgofimportsimple_testex_test=partial(simple_test,stat=ex_stat,pdist=ex_unif)
exercise:示例测试有一个基本缺陷。你能指出吗?
安装
pip install scikit-gof
需要最新版本的python(>;3)、numpy(>;=1.10)和scipy。
请改正或指出你注意到的任何错误、不准确或打字错误。