我想将成对的样本与柯尔莫哥罗夫-斯米尔诺夫(KS)和安德森-达林(AD)测试进行比较。我分别用scipy.stats.ks_2samp
和scipy.stats.anderson_ksamp
实现了这个。我预计相似样本的统计量较低(相同样本为 0),而更多不同样本的统计量较高。
在相同样本和非常不同的样本(无重叠)的情况下,ks_2samp
提供预期的结果,而anderson_ksamp
为相同的样本提供负值,更重要的是,为非常不同的样本抛出错误(可能是由于样本大小:以下示例中的样本大小为 200)。
以下是说明这些发现的代码:
import scipy.stats as stats
import numpy as np
normal1 = np.random.normal(loc=0.0, scale=1.0, size=200)
normal2 = np.random.normal(loc=100, scale=1.0, size=200)
在相同的样本上使用 KS 和 AD:
sstats.ks_2samp(normal1, normal1)
sstats.anderson_ksamp([normal1, normal1])
分别返回:
# Expected
Ks_2sampResult(statistic=0.0, pvalue=1.0)
# Not expected
Anderson_ksampResult(statistic=-1.3196852620954158, critical_values=array([ 0.325, 1.226, 1.961, 2.718, 3.752]), significance_level=1.4357209285296726)
在不同的样本上:
sstats.ks_2samp(normal1, normal2)
sstats.anderson_ksamp([normal1, normal2])
分别返回:
# Expected
Ks_2sampResult(statistic=1.0, pvalue=1.4175052453413253e-89)
# Not expected
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-757-e3914aaf909c> in <module>()
----> 1 stats.anderson_ksamp([normal1, normal2])
/usr/lib/python3.5/site-packages/scipy/stats/morestats.py in anderson_ksamp(samples, midrank)
1694 warnings.warn("approximate p-value will be computed by extrapolation")
1695
-> 1696 p = math.exp(np.polyval(pf, A2))
1697 return Anderson_ksampResult(A2, critical, p)
1698
OverflowError: math range error
我认为这两件事实际上是有道理的。安德森-达林检验中的显著性水平或 p 值是根据检验统计量落在临界值范围内的位置进行外推的。检验统计量落得越靠右,否定它们来自同一分布的原假设就越重要。
请注意,对于使用示例分布参数的 80-90 个样本,您会看到检验统计量(对于normal1
与normal2
)开始大大大于最大临界值,这意味着显著性的外推可以自由增长(巨大,作为从polyfit
开始的凸向上二次函数的指数)向无穷大增长。所以是的,对于一个大的样本量,你将计算一些巨大数字的指数并溢出。换句话说,您的数据显然不是来自同一分布,以至于显著性外推溢出。在这种情况下,您可以从实际数据中引导较小的数据集,以避免溢出(或引导几次并平均统计数据)。
另一方面,当排序的数据集相同时,看起来公式的某些步骤允许负值的可能性。从本质上讲,这意味着统计数据位于临界值的左侧,表示完全匹配。
同样,显著性是通过外推法计算的,但这次它从检验统计量外推到最小的临界值,而不是从最大的临界值外推到检验统计量,就像不匹配的情况一样。由于左侧统计数据的相对大小恰好相对于最小临界值(约 0.3)较小(我看到使用相同样本的统计数据约为 -1.3),因此您会得到一个"仅"与 140% 左右一样大的外推,而不是指数级大数字爆炸......但是,仍然看到显著性值为 1.4 是一个信号,表明数据刚刚超出测试的相关范围。
这很可能是因为上面的链接线k - 1
其中从计算的检验统计量中减去"自由度"。在两个样本案例中,这意味着减去 1。因此,如果我们在你看到的检验统计量中加 1,它会让你在 0.31 的范围内,这几乎完全等于最低临界值(这是你对完全相同数据的预期,这意味着你不能在最弱的显著性水平上拒绝原假设)。因此,可能是自由度调整将其置于光谱的负端,然后它被基于二次曲线的p值外推放大。