scipy Anderson-Darling k 样本测试中的数学溢出错误

Math overflow error in scipy Anderson-Darling test for k-samples

我想将样本对与 Kolmogorov-Smirnov (KS) 和 Anderson-Darling (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])

Returns分别为:

# 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])

Returns分别为:

# 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

我觉得这两件事其实有些道理。 Anderson-Darling 检验 is extrapolated based on where the test statistic falls within the range of critical values 中的显着性水平或 p-value。检验统计量越靠右,您就越能拒绝原假设,即它们来自同一分布。

请注意,例如,对于使用示例分布参数的 80-90 个样本,您会看到测试统计量(normal1 对比 normal2)开始远远大于最大的临界值值,这意味着显着性的外推可以自由增长(极大地,作为 polyfit 的 convex-up 二次函数的指数)向无穷大。所以是的,对于大样本量,您将计算某个巨大数字的指数并溢出。换句话说,您的数据显然不是来自同一分布,以至于显着性外推溢出。在这种情况下,您可能 bootstrap 来自实际数据的较小数据集,只是为了避免溢出(或 bootstrap 几次并对统计数据进行平均)。

另一方面,当排序的数据集相同时,some steps of the formula 似乎承认了负值的可能性。从本质上讲,这意味着统计数据远 到临界值的左侧 ,表明完美匹配。

再一次,显着性是通过外推法计算的,但这次它是从检验统计量向最小临界值外推,而不是像不匹配情况那样从最大临界值向检验统计量外推。由于左侧统计量的相对大小恰好比最小临界值(约 0.3)小(我看到使用相同样本的统计量约为 -1.3),因此您得到的外推是 "merely" 大到 140% 左右,而不是呈指数级增长......但仍然看到 1.4 的显着性值是一个信号,表明数据刚好落在测试相关的范围之外。

这很可能是因为上面的链接线从计算的测试统计数据中减去 k - 1 "degrees of freedom"。在两个样本案例中,这意味着减去 1。因此,如果我们将 1 添加回您看到的测试统计数据,它会将您置于 0.31 的范围内,这几乎完全等于最低临界值(这就是您会期望完全相同的数据,这意味着即使在最弱的显着性水平上也不能拒绝零假设)。所以可能是自由度调整将其置于频谱的负端,然后它被 hacky quadratic-based p-value 外推法放大。