使用Scipy的stats.kstest模块进行拟合优度测试

2024-03-29 12:57:39 发布

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

我已经阅读了关于这个模块(和Scipy文档)的现有文章,但是我仍然不清楚如何使用Scipy的kstest模块在有数据集和可调用函数的情况下进行拟合优度测试。

我想测试我的数据所依据的PDF不是标准的scipy.stats发行版,所以我不能仅仅用如下方法调用它:

kstest(mydata,'norm')

其中mydata是一个Numpy数组。相反,我想做的是:

kstest(mydata,myfunc)

其中“myfunc”是可调用函数。这并不奇怪,因为kstest无法知道“mydata”数组的横坐标是什么,以便使用“myfunc”生成相应的理论频率。假设“mydata”中与随机变量值相对应的频率是数组“abscissa”。然后我想也许我可以使用stats.ksò2samp:

ks_2samp(mydata,myfunc(abscissa))

但我不知道这在统计上是否有效。(旁注:kstest和ksã2samp是否希望频率阵列被标准化为一个,或者他们是否希望绝对频率?)

无论如何,由于一个样本的KS测试应该用于拟合优度测试,我不得不假设有某种方法可以直接使用KS test来完成它。你怎么做到的?


Tags: 模块数据方法statsscipy数组myfunc频率
2条回答

一些例子可以帮助我们了解如何使用scipy.stats.kstest。首先设置一些测试数据,例如正态分布的平均值5和标准偏差10:

>>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,))

要在这些数据上运行kstest,我们需要一个函数f(x),它接受一个分位数数组,并返回累积分布函数的相应值。如果我们重用scipy.stats.normcdf功能,我们可以:

>>> scipy.stats.kstest(data, lambda x: scipy.stats.norm.cdf(x, loc=5, scale=10))
(0.019340993719575206, 0.84853828416694665)

以上通常以更方便的形式运行:

>>> scipy.stats.kstest(data, 'norm', args=(5, 10))
(0.019340993719575206, 0.84853828416694665)

如果我们有均匀分布的数据,很容易手工构建cdf:

>>> data = np.random.rand(1000)
>>> scipy.stats.kstest(data, lambda x: x)
(0.019145675289412523, 0.85699937276355065)

对于ks_2samp,它检验了两个样本都是从相同的概率分布中抽样的零假设。

例如,您可以执行以下操作:

>>> from scipy.stats import ks_2samp
>>> import numpy as np
>>> 

其中x,y是numpy.array的两个实例:

>>> ks_2samp(x, y)
(0.022999999999999909, 0.95189016804849658)

第一个值是测试统计,第二个值是p值。如果p值小于95(显著性水平为5%),这意味着您不能拒绝两个样本分布相同的无效假设。

相关问题 更多 >