我已经阅读了有关此模块(和Scipy文档)的现有文章,但是当您拥有数据集和可调用函数时,我仍然不清楚如何使用Scipy的kstest模块进行拟合优度测试。
我要针对其进行数据测试的PDF并不是标准的scipy.stats发行版之一,因此我不能仅使用以下方式进行调用:
kstest(mydata,'norm')
其中mydata是一个Numpy数组。相反,我想做类似的事情:
kstest(mydata,myfunc)
其中“ myfunc”是可调用函数。这是行不通的,这不足为奇,因为kstest无法知道“ mydata”数组的横坐标是什么,以便使用“
myfunc”生成相应的理论频率。假设“ mydata”中的频率对应于随机变量的值为数组“横坐标”。然后我想也许我可以使用stats.ks_2samp:
ks_2samp(mydata,myfunc(abscissa))
但我不知道这在统计上是否有效。(旁注:kstest和ks_2samp是否期望将频率阵列归一化,还是希望绝对频率?)
无论如何,由于应该将单样本KS测试用于拟合优度测试,因此我必须假设有某种方法可以直接通过kstest进行。你怎么做到这一点?
一些示例可能会阐明如何使用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)