Python麻烦与Kolmogorov-Smirnov测试非'规范'分布

时间:2015-10-12 13:09:50

标签: python statistics scipy

我确信答案很简单,但我无法弄清楚我做错了什么。

我想测试一下我的一些样本数据是否可以来自广义极值或皮尔逊类型3分布。

出于某种原因,我无法让kstest(t1, 'genextreme')合作。但是,当我将其更改为norm时,它可以正常工作。

请参阅下面的部分代码和错误:

from scipy.stats import kstest
from scipy.stats import ks_2samp
import numpy as np
import csv


In [7]: from scipy.stats import genextreme

In [8]: t1 = TP['flow']
...: test_GEV = kstest(t1, 'genextreme')
...: 
Traceback (most recent call last):

File "<ipython-input-8-ebc8faf10381>", line 2, in <module>
  test_GEV = kstest(t1, 'genextreme')

File "/Applications/anaconda/lib/python2.7/site-    packages/scipy/stats/stats.py", line 3585, in kstest
    cdfvals = cdf(vals, *args)

  File "/Applications/anaconda/lib/python2.7/site-packages/scipy/stats/_distn_infrastructure.py", line 1642, in cdf
args, loc, scale = self._parse_args(*args, **kwds)

TypeError: _parse_args() takes at least 2 arguments (1 given)


In [9]: t1 = TP['flow']
...: test_GEV = kstest(t1, 'norm')
...: 
In [10]: test_GEV
Out[10]: (0.99999925980208981, 0.0

因此它似乎适用于norm但不适用于genextreme ...除了kstest()之外,如何让norm为其他发行版工作?

由于

2 个答案:

答案 0 :(得分:0)

您必须传递 函数才能生成随机变量 - (kstest DocString)

所以对你的例子来说:

test_GEV = kstest(t1, scipy.stats.genextreme.rvs)

对于scipy_stats中的任何分发,请调用dist_name:

test_ks = kstest(your_array,scipy.stats.dist_name.rvs)

答案 1 :(得分:0)

genextreme具有形状参数c,因此您必须使用args kstest参数来完全定义分布。 genextreme还具有所有scipy单变量分布所具有的标准locscale参数。如果不使用args指定这些,则分别使用默认值0和1。您可以选择要对其c进行测试的loc分布的参数scalegenextremet1

要完全明确您正在使用的发行版,您应该使用类似的内容:

c = 1.0
loc = 0.0
scale = 1.0
test_GEV = kstest(t1, 'genextreme', args=(c, loc, scale))