scipy.stats.kstest与除了norm之外的发行版

时间:2012-08-27 04:28:37

标签: python scipy

我在scipy中使用Kolmogorov-Smirnov测试时遇到问题(scipy.stats.kstest)。在线文档(http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html)说它需要样本,cdf用于比较只是命名其中一个scipy的选项.stats发行版,cdf参数(和几个可选值)

只要选择的cdf不需要任何其他参数,所有都显示正常

teststat,pval=stats.kstest(sample,'norm')

(其中sample是值列表。) 但是,对于需要额外补偿的其他发行版,例如t,chisquared等,它对我不起作用。如果没有给出进一步的论据,它会正确抗议

teststat,pval=stats.kstest(sample,'t')

TypeError: _cdf() takes exactly 3 arguments (2 given)

如果给出了论证,

teststat,pval=stats.kstest(sample,'t',24)

抱怨

TypeError: cdf() argument after * must be a sequence, not int

现在我不确定这意味着什么,但似乎它不是int,24,而是一个int的序列,(24)。但是:

teststat,pval=stats.kstest(sample,'t',24)

TypeError: cdf() argument after * must be a sequence, not int

手动定义分布不会产生更好的结果,因为它不会觉得这是可调用的:

numargs = stats.t.numargs
[ df ] = [0.9,] * numargs
rv = stats.t(df)
teststat,pval=stats.kstest(sample,stats.t.cdf(numpy.linspace(0, numpy.minimum(rv.dist.b, 3)),df))

TypeError: 'numpy.ndarray' object is not callable

我该怎么做才能让它发挥作用? (Google搜索kstest函数或各种错误消息并没有提供任何有用的答案来回答这个问题。)

由于

1 个答案:

答案 0 :(得分:2)

看看这个错误:

TypeError: cdf() argument after * must be a sequence, not int

让我觉得你是对的,它想要一个序列,而不是一个整数。文档说

args : tuple, sequence
    distribution parameters, used if rvs or cdf are strings

这似乎有效:

>>> import scipy.stats
>>> sample = scipy.stats.t(1).rvs(size=10**6)
>>> scipy.stats.kstest(sample, 't', (1,))
(0.0006249662221899932, 0.82960203415652445)

或更明确地说:

>>> scipy.stats.kstest(sample, 't', args=(1,))
(0.0006249662221899932, 0.82960203415652445)