我已经阅读了有关此模块(和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),该函数需要一个分位数数组,并返回累积分布函数的相应值。如果我们重用cdfscipy.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)

关于python - 使用Scipy的stats.kstest模块进行拟合优度测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17901112/

10-09 19:07