Python 使用Scipy';用于拟合优度测试的s stats.kstest模块

Python 使用Scipy';用于拟合优度测试的s stats.kstest模块,python,statistics,scipy,Python,Statistics,Scipy,我已经阅读了关于这个模块(以及Scipy文档)的现有帖子,但我仍然不清楚当您有一个数据集和一个可调用函数时,如何使用Scipy的kstest模块进行拟合优度测试 我想测试数据的PDF不是标准的scipy.stats发行版,所以我不能用以下方式调用它: kstest(mydata,'norm') kstest(mydata,myfunc) 其中mydata是一个Numpy数组。相反,我想做如下事情: kstest(mydata,'norm') kstest(mydata,myfunc) 其

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

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

kstest(mydata,'norm')
kstest(mydata,myfunc)
其中mydata是一个Numpy数组。相反,我想做如下事情:

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

ks_2samp(mydata,myfunc(abscissa))
但我不知道这在统计上是否有效。(旁注:kstest和ks2samp是否希望频率阵列标准化为1,还是希望获得绝对频率?)


在任何情况下,由于单样本KS测试应该用于拟合优度测试,因此我必须假设有某种方法可以直接使用kstest进行测试。您是如何做到这一点的?

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

>>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,))
要对这些数据运行
kstest
,我们需要一个函数
f(x)
,它接受一个分位数数组,并返回累积分布函数的相应值。如果我们重用
scipy.stats.norm
cdf
函数,我们可以:

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

谢谢,现在效果很好!但有些事情让我困惑。按照你的例子,我得到D=0.08,p=1.6e-14。在我最初的问题中,我提到了使用ks_2samp的“hack”解决方案:我使用直方图模块计算数据的观测频率,计算相同箱子大小的理论频率,并在这两个阵列上使用ks_2samp。这给了我D=0.74,p=0.017。我觉得有点奇怪,这样会产生完全不同的结果。你认为这两个计算应该更接近吗?等等,我可能已经弄糊涂了:Ksu 2samp是采用这两个数据集的经验cdf,还是这两个数据集本身?
Ksu 2samp
采用这两个数据集本身。如果你做的很好,我认为你的
ks_2amp
方法会产生比
kstest
更高的
p值似乎是合理的,我不确定你看到的差异是否太大……现在明白了。使用正确的输入,通过从理论分布中选取足够大的样本,我可以使kstest和ks2samp的p值收敛。谢谢你的帮助!我希望我能投票支持你的答案,但那将不得不等到我有足够的代表来做。根据ks_2samp文档:如果K-S统计值很小或p值很高,那么我们不能拒绝两个样本的分布相同的假设。