在Matlab中实施的两样本Kolmogorov-Smirnov测试(kstest2)效果不佳?

Arp*_*rpi 5 statistics matlab r hypothesis-test kolmogorov-smirnov

我是否遗漏了一些明显的东西,或者Matlab kstest2给出了非常差的p值?在非常贫困的情况下,我是说我怀疑它甚至被错误地实施。

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');
Run Code Online (Sandbox Code Playgroud)

(n1*n2)/(n1 + n2) = 4在这种情况下,p值应合理准确。

Matlab p = 0.0497给出了结果,而书中给出的解决方案是0.0870。为了验证该解决方案,我使用了R,我比Matlab更信任R,尤其是在统计方面。

使用ks.testfrom stats软件包和ks.bootfrom Matching软件包:

ks.test(sampleA, sampleB, alternative = "two.sided")
ks.boot(sampleA, sampleB, alternative = "two.sided")
Run Code Online (Sandbox Code Playgroud)

两者都给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);
Run Code Online (Sandbox Code Playgroud)

这产生了p = 0.0317。现在,使用R x1x2向量R给出p = 0.03968。当预期非常准确的结果时,相差约20%(n1*n2)/(n1 + n2) = 25

我想念东西吗?kstest2如示例所示,Matlab的性能是否有可能表现不佳?算法kstest2使用什么近似值?(我可以看到kstest2的实现代码,但是,参考书本或论文会更好地了解正在发生的情况。)

我正在使用Matlab 2016a。


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

Hac*_*k-R 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)
Run Code Online (Sandbox Code Playgroud)

p值:0.0878664

区别似乎在于ksvs的使用lambda,即

ks   = sqrt (n) * d;
pval = 1 - kolmogorov_smirnov_cdf (ks);
Run Code Online (Sandbox Code Playgroud)

相对

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

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