在 Matlab 中执行不善的两样本 Kolmogorov-Smirnov 测试(kstest2)?
Posted
技术标签:
【中文标题】在 Matlab 中执行不善的两样本 Kolmogorov-Smirnov 测试(kstest2)?【英文标题】:Poorly implemented two-sample Kolmogorov-Smirnov test (kstest2) in Matlab? 【发布时间】:2016-12-20 09:07:55 【问题描述】:我是否遗漏了一些明显的东西,或者 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');
(n1*n2)/(n1 + n2) = 4
在这种情况下,所以 p 值应该相当准确。
Matlab 产生p = 0.0497
,而书中给出的解决方案是0.0870
。
为了验证解决方案,我使用了 R,我比 Matlab 更信任它,尤其是在统计方面。
使用来自stats
包的ks.test
和来自Matching
包的ks.boot
:
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)。 Nonparametrics: Statistical Methods Based on Ranks。第 1 版。斯普林格。
【问题讨论】:
您可能会在 CrossValidated 上得到更好的答案 @Hack-R 感谢您的建议。我将在 *** 上等待一段时间,如果没有收到答案,我将删除此问题并在 CrossValidated 上重新提问。 【参考方案1】:我认为在 MATLAB 或 Octave 中与 R 的 ks.test
比较的 correct test 将是 kolmogorov_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
区别似乎在于ks
与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。
【讨论】:
谢谢!很高兴看到 Octave 函数接近 R。测试统计ks2stat
(经验分布函数之间的最大差异)在所有函数中都是相同的。 Matlab 和 R 给出相同的ks2stat
值;但是,对应的p
值不同。所以我看不出是什么让kolmogorov_smirnov_test_2
正确和kstest2
不正确与ks.test
进行比较。
@Arpi 不客气。我所知道的 p 值的差异是等式的一部分,一个是 lambda,另一个是 sqrt(n)*d
。我认为不同的统计学家找到了偏爱其中一个的理由,一个包遵循原始公式,另一个包遵循不同的公式。这就是我必须建议去 CV 了解更多细节的部分,因为它比 SO 更属于他们的领域。您可能可以调查软件包引用的研究论文以找出答案。 lambda
包含 ks
作为它的一部分,所以它可能更新。以上是关于在 Matlab 中执行不善的两样本 Kolmogorov-Smirnov 测试(kstest2)?的主要内容,如果未能解决你的问题,请参考以下文章