12

我已经阅读了有关此模块(和 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 测试应该用于拟合优度测试,我不得不假设有一些方法可以直接使用 kstest 进行测试。你怎么做到这一点?

4

2 回答 2

19

一些例子可以说明如何使用scipy.stats.kstest. 让我们首先设置一些测试数据,例如正态分布,均值为 5,标准差为 10:

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

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

>>> 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)
于 2013-07-27T23:02:13.747 回答
4

至于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%),这意味着您不能拒绝两个样本分布相同的空假设。

于 2013-10-06T07:27:20.803 回答