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

时间:2018-03-06 17:22:54

标签: python scipy

我想用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])

分别返回:

# 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

1 个答案:

答案 0 :(得分:2)

我认为这两件事实际上是有道理的。 Anderson-Darling检验中的显着性水平或p值is extrapolated based on where the test statistic falls within the range of critical values。测试统计数据越往右,你就可以越多地拒绝它们来自同一分布的零假设。

请注意,对于使用示例分发参数的80-90个样本,您会看到测试统计信息(对于normal1normal2)开始比最大临界值大得多,这意味着重要性的推断可以自由地增长(很大程度上,作为从polyfit向无穷大的凸起二次函数的指数)。所以是的,对于大样本量,你将计算一些巨大数字的指数并且溢出。换句话说,您的数据显然不是来自相同的分布,即重要性外推溢出。在这种情况下,您可以从实际数据中引导一个较小的数据集,以避免溢出(或引导几次并平均统计数据)。

在频谱的另一端,当排序的数据集相同时,some stepsformula似乎承认负值的可能性。从本质上讲,这意味着统计数据远远超过临界值的左侧,表示完美匹配。

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

这很可能是因为上面的链接线从计算的测试统计量中减去了k - 1“自由度”。在两个样本的情况下,这意味着减去1.因此,如果我们将1加回到你看到的测试统计数据,它会使你在0.31的范围内,这几乎完全等于最低的临界值(这就是你期望完全相同的数据,这意味着即使是最弱的显着性水平,你也不能拒绝零假设)。因此,可能是自由度调整将其置于频谱的负端,然后通过基于哈希的二次型p值外推得到放大。