我有兴趣检查样品A(n = 25)是否均匀分布。这是我在Python中检查的方式:
import scipy.stats as ss
A=[9,9,9,4,9,6,7,8,9,4,5,2,4,9,6,7,3,4,2,4,5,6,8,9,9]
ss.kstest(A,'uniform', args=(min(A),max(A)), N=25)
返回:(0.22222222222222221,0.14499771178796239),即p值为~0.15时,测试不能拒绝样本A来自均匀分布。
现在,我在R中计算相同的方式:
A=c(9,9,9,4,9,6,7,8,9,4,5,2,4,9,6,7,3,4,2,4,5,6,8,9,9)
ks.test(A,punif,min(A),max(A))
结果:D = 0.32,p值= 0.01195。对于R,应该在0.05(!!!)的通常显着性水平上拒绝原假设
如果我正确阅读文档,则两个函数都会默认执行双面测试。另外,我认为KS测试主要用于连续变量,但这可以解释Python和R产生的对比近似吗?或者,我是否在语法上犯了一些明目张胆的错误?
答案 0 :(得分:1)
scipy.stats中任何cdf的args都是位置和比例。对于均匀分布,这是loc = minimum x value,其中均匀密度为1,并且标度是均匀密度为1的区间的宽度。使用args =(min(A),max(A)-min(A ))在python中将给出由R给出的D值。
p值仍然不同。这是由于KS测试对重复值不稳健。它旨在用于连续分布,并且期望不会发生重复的y值。在存在重复数据的情况下,使用不同的算法来尝试估计p。如果您在另一个数据样本上重新运行代码而不重复,并将args设置为loc和scale,则应在R和Python中获得相同的p值。