【发布时间】:2014-08-13 19:06:08
【问题描述】:
假设我有一些经验数据:
from scipy import stats
size = 10000
x = 10 * stats.expon.rvs(size=size) + 0.2 * np.random.uniform(size=size)
它呈指数分布(带有一些噪声),我想使用卡方拟合优度 (GoF) 测试来验证这一点。使用 Python 中的标准科学库(例如 scipy 或 statsmodels)以最少的手动步骤和假设来执行此操作的最简单方法是什么?
我可以为模型拟合:
param = stats.expon.fit(x)
plt.hist(x, normed=True, color='white', hatch='/')
plt.plot(grid, distr.pdf(np.linspace(0, 100, 10000), *param))
计算Kolmogorov-Smirnov test非常优雅。
>>> stats.kstest(x, lambda x : stats.expon.cdf(x, *param))
(0.0061000000000000004, 0.85077099515985011)
但是,我找不到计算卡方检验的好方法。
有一个chi-squared GoF function in statsmodel,但它假设一个离散分布(并且指数分布是连续的)。
official scipy.stats tutorial 仅涵盖自定义分布的情况,概率是通过摆弄许多表达式(npoints、npointsh、nbound、normbound)来构建的,所以我不太清楚如何为其他分布做这件事。 chisquare examples 假设已获得预期值和景深。
另外,我不是像already discussed here 那样寻找“手动”执行测试的方法,而是想知道如何应用其中一个可用的库函数。
【问题讨论】:
-
据我所知,没有用于卡方测试的“官方”python 库函数,其中包括用于连续分布的分箱。如果我没记错的话,我会推荐使用 Anderson-Darling,scipy 的 anderson,它应该有更好的能力。
-
好的,但据我所知,
andersonimplementation in SciPy 只支持 5 个发行版。 -
是的,但是安德森支持您正在使用的指数分布。如果您估计分布的参数并且希望它适用于任何分布,那么您将返回卡方分箱,或引导另一个 gof 测试。
-
您能否在答案中解释我将如何对我的示例执行分箱和卡方检验?我知道我需要使用
hstack并组合 bin 以获得 >5 个数据点,但我不知道如何获取这些 bin 的概率数组。我正在尝试找到一个可用于任意数据的通用工作流程,并且我宁愿不局限于与安德森实现一样的少数分布。 -
您使用 Kolmogorov-Smirnov 检验的方式在统计上是错误的,因为分布的参数是根据样本估计的。正确的做法是使用 Lilliefors 的测试:en.wikipedia.org/wiki/Lilliefors_test
标签: python scipy statsmodels goodness-of-fit