我是否遗漏了一些明显的东西,或者 Matlab 给出的pkstest2
值很差?在非常差的情况下,我的意思是我怀疑它甚至被错误地执行了。
kstest2
说明该函数计算渐近p值的帮助页面,尽管我没有找到任何关于准确使用哪种方法的参考。无论如何,描述进一步指出:
渐近p值对于大样本量变得非常准确,并且被认为对于样本量 n1 和 n2 相当准确,例如 (n1*n2)/(n1 + n2) ≥ 4
示例 1
让我们以 Lehman and D'Abrera (1975) 的示例 6 为例:
sampleA = [6.8, 3.1, 5.8, 4.5, 3.3, 4.7, 4.2, 4.9];
sampleB = [4.4, 2.5, 2.8, 2.1, 6.6, 0.0, 4.8, 2.3];
[h,p,ks2stat] = kstest2(sampleA, sampleB, 'Tail', 'unequal');
(n1*n2)/(n1 + n2) = 4
在这种情况下,p值应该是相当准确的。
Matlab 产生p = 0.0497
,而书中给出的解决方案是0.0870
. 为了验证解决方案,我使用了 R,我比 Matlab 更信任它,尤其是在统计方面。
使用ks.test
from stats
package 和ks.boot
from Matching
package:
ks.test(sampleA, sampleB, alternative = "two.sided")
ks.boot(sampleA, sampleB, alternative = "two.sided")
两者都给p = 0.0870
。
示例 2
让我们使用kstest2
自己的示例来比较更大样本量的 Matlab 和 R 结果:
rng(1); % For reproducibility
x1 = wblrnd(1,1,1,50);
x2 = wblrnd(1.2,2,1,50);
[h,p,ks2stat] = kstest2(x1,x2);
这产生p = 0.0317
. 现在,使用相同的x1
和x2
向量 R 给出p = 0.03968
。预计非常准确的结果时,大约有 20% 的差异(n1*n2)/(n1 + n2) = 25
。
我失踪了,搞砸了什么吗?Matlab 的性能是否可能kstest2
如示例所示那样糟糕?算法使用的是什么近似值kstest2
?(我可以看到 kstest2 的实现代码,但是参考书籍或论文会更好地理解发生了什么。)
我正在使用 Matlab 2016a。
雷曼和达布雷拉 (1975)。非参数:基于等级的统计方法。第 1 版。施普林格。