我在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函数或各种错误消息并没有提供任何有用的答案来回答这个问题。)
由于
答案 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)