我已经阅读了有关此模块(以及Scipy文档)的现有帖子,但是当我有数据集和可调用函数时,我仍然不清楚如何使用Scipy的kstest模块进行拟合优度测试.
我想测试我的数据的PDF不是标准的scipy.stats发行版之一,所以我不能用以下内容调用它:
kstest(mydata,'norm')
Run Code Online (Sandbox Code Playgroud)
其中mydata是Numpy数组.相反,我想做的事情如下:
kstest(mydata,myfunc)
Run Code Online (Sandbox Code Playgroud)
其中'myfunc'是可调用函数.这不起作用 - 这并不令人惊讶,因为kstest无法知道'mydata'数组的横坐标是为了使用'myfunc'生成相应的理论频率.假设'mydata'中的频率对应于随机变量的值是数组'abscissa'.然后我想也许我可以使用stats.ks_2samp:
ks_2samp(mydata,myfunc(abscissa))
Run Code Online (Sandbox Code Playgroud)
但我不知道这是否在统计上有效.(旁注:做kstest和ks_2samp期望频率数组被归一化为1,或者他们想要绝对频率?)
在任何情况下,由于单样本KS测试应该用于拟合优度测试,我必须假设有一些方法可以直接用kstest来完成.你怎么做到这一点?
Jai*_*ime 13
一些例子可能会说明如何使用scipy.stats.kstest
.让我们首先设置一些测试数据,例如正态分布,平均值为5,标准差为10:
>>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,))
Run Code Online (Sandbox Code Playgroud)
要运行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)
Run Code Online (Sandbox Code Playgroud)
以上通常会以更方便的形式运行:
>>> scipy.stats.kstest(data, 'norm', args=(5, 10))
(0.019340993719575206, 0.84853828416694665)
Run Code Online (Sandbox Code Playgroud)
如果我们有统一分布的数据,很容易手工构建cdf:
>>> data = np.random.rand(1000)
>>> scipy.stats.kstest(data, lambda x: x)
(0.019145675289412523, 0.85699937276355065)
Run Code Online (Sandbox Code Playgroud)