使用Scipy的stats.kstest模块进行拟合优度检验

12

我已经阅读了关于这个模块的现有文章(以及Scipy文档),但是我仍然不清楚如何使用Scipy的kstest模块来进行拟合优度检验,当您有一个数据集和可调用函数时。

我想要测试我的数据的概率密度函数不是标准的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函数是否要求频率数组归一化为1,还是需要绝对频率?)

无论如何,既然单样本KS检验被认为是用于拟合优度测试的,我必须假设有一种直接使用kstest进行此操作的方法。您怎么做呢?

2个回答

19
一些示例可能有助于说明如何使用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)

如果我们有均匀分布的数据,手动构建累积分布函数很容易:

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

谢谢,现在运行得很好!但有些事情让我感到困惑。当我按照你的示例操作时,我得到了D = 0.08,p = 1.6e-14。在我的原始问题中,我提到了使用ks_2samp的“hack”解决方案:我使用直方图模块计算数据的观察频率,计算相同bin大小的理论频率,并在这两个数组上使用ks_2samp。这给了我D = 0.74,p = 0.017。我觉得这有点奇怪,为什么会产生如此截然不同的结果。你认为这两个计算应该更接近吗? - user2626148
等一下,我可能把自己搞混了:ks_2samp函数是使用两个数据集的经验累积分布函数还是直接使用这两个数据集本身? - user2626148
ks_2samp接受两个数据集本身作为参数。如果你的操作正确,我认为ks_2samp方法产生的p-values应该比kstest更高,不确定你所看到的差异是否太大... - Jaime
现在明白了。使用正确的输入,我可以通过从理论分布中取足够大的样本使得kstest和ks_2samp的p值收敛。感谢您的帮助!我希望我能为您的答案投票,但这得等到我有足够的声望才行。 - user2626148

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%),则意味着您无法拒绝零假设,即两个样本分布相同。


从ks_2samp文档中:如果K-S统计量很小或p值很高,则我们无法拒绝两个样本分布相同的假设。 - Volodimir Kopey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接