5

我是否遗漏了一些明显的东西,或者 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.testfrom statspackage 和ks.bootfrom Matchingpackage:

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. 现在,使用相同的x1x2向量 R 给出p = 0.03968。预计非常准确的结果时,大约有 20% 的差异(n1*n2)/(n1 + n2) = 25

我失踪了,搞砸了什么吗?Matlab 的性能是否可能kstest2如示例所示那样糟糕?算法使用的是什么近似值kstest2?(我可以看到 kstest2 的实现代码,但是参考书籍或论文会更好地理解发生了什么。)

我正在使用 Matlab 2016a。


雷曼和达布雷拉 (1975)。非参数:基于等级的统计方法。第 1 版。施普林格。

4

1 回答 1

4

我认为与MATLAB 或 Octave 中的 R 进行比较的正确测试是:ks.testkolmogorov_smirnov_test_2

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];

kolmogorov_smirnov_test_2(sampleA, sampleB)

pval: 0.0878664

不同之处似乎在于ksvs的使用lambda,即

ks   = sqrt (n) * d;
pval = 1 - kolmogorov_smirnov_cdf (ks);

相对

lambda =  max((sqrt(n) + 0.12 + 0.11/sqrt(n)) * d , 0);
pval = 1 - kolmogorov_smirnov_cdf (lambda);

我认为不同的测试统计数据是由这两个函数引用的研究论文的差异引起的。如果您想更深入地了解统计理论,您可能需要联系 CrossValidated

于 2016-08-13T16:42:03.537 回答