k-样本的scipy Anderson-Darling检验中的数学溢出误差



我想将成对的样本与柯尔莫哥罗夫-斯米尔诺夫(KS)和安德森-达林(AD)测试进行比较。我分别用scipy.stats.ks_2sampscipy.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 个样本,您会看到检验统计量(对于normal1normal2)开始大大大于最大临界值,这意味着显著性的外推可以自由增长(巨大,作为从polyfit开始的凸向上二次函数的指数)向无穷大增长。所以是的,对于一个大的样本量,你将计算一些巨大数字的指数并溢出。换句话说,您的数据显然不是来自同一分布,以至于显著性外推溢出。在这种情况下,您可以从实际数据中引导较小的数据集,以避免溢出(或引导几次并平均统计数据)。

另一方面,当排序的数据集相同时,看起来公式的某些步骤允许负值的可能性。从本质上讲,这意味着统计数据位于临界值的左侧,表示完全匹配。

同样,显著性是通过外推法计算的,但这次它从检验统计量外推到最小的临界值,而不是从最大的临界值外推到检验统计量,就像不匹配的情况一样。由于左侧统计数据的相对大小恰好相对于最小临界值(约 0.3)较小(我看到使用相同样本的统计数据约为 -1.3),因此您会得到一个"仅"与 140% 左右一样大的外推,而不是指数级大数字爆炸......但是,仍然看到显著性值为 1.4 是一个信号,表明数据刚刚超出测试的相关范围。

这很可能是因为上面的链接线k - 1其中从计算的检验统计量中减去"自由度"。在两个样本案例中,这意味着减去 1。因此,如果我们在你看到的检验统计量中加 1,它会让你在 0.31 的范围内,这几乎完全等于最低临界值(这是你对完全相同数据的预期,这意味着你不能在最弱的显著性水平上拒绝原假设)。因此,可能是自由度调整将其置于光谱的负端,然后它被基于二次曲线的p值外推放大。

最新更新