如何使用Python中的科学库执行卡方拟合优度测试?

2024-05-08 20:14:29 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一些经验数据:

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))

distribution and empirical data plot

计算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假设已经获得了期望值和DoF。

另外,我不想寻找一种“手动”执行测试的方法,而是想知道如何应用一个可用的库函数。


Tags: 数据方法fromimportsizeparamstatsnp
2条回答

为什么你需要“验证”它是指数型的?你确定你需要一个统计测试吗?我可以很好地保证,这并不是最终的指数级测试,如果您有足够的数据,那么测试将是非常重要的,这使得使用测试的逻辑变得相当强制。它可以帮助你阅读这篇简历的主题:Is normality testing 'essentially useless'?,或者我的答案:Testing for heteroscedasticity with many observations

通常最好使用qq图和/或pp图(取决于您是否关心分布的尾部或中间是否合适,请参阅我的答案:PP-plots vs. QQ-plots)。关于如何在Python SciPy中制作qq图的信息可以在这个SO线程中找到:Quantile-Quantile plot using SciPy

等概率箱的近似解:

  • 估计分布参数
  • 如果是scipy.stats.distribution,则使用逆cdf,ppf来获取常规概率网格的binedges,例如distribution.ppf(np.linspace(0, 1, n_bins + 1), *args)
  • 然后,使用np.histogram统计每个bin中的观察数

然后对频率进行chisquare检验。

另一种方法是从已排序数据的百分位数中查找bin边缘,并使用cdf来查找实际的概率。

这只是一个近似值,因为chisquare检验的理论假设参数是通过组合数据的最大似然估计的。我不确定基于数据的二边选择是否影响渐近分布。

我很久没调查过了。 如果近似解不够好,那么我建议您在stats.stackexchange上提问。

相关问题 更多 >