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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于k样本的scipy Anderson-Darling检验中的数学溢出错误相关的知识,希望对你有一定的参考价值。

我想用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
答案

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

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

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

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

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

以上是关于对于k样本的scipy Anderson-Darling检验中的数学溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

python Scipy - 一个样本t检验

Python Scipy 中的两个样本 Kolmogorov-Smirnov 测试

Scipy t-test统计中的一个样本?

用KNN算法判断知识掌握程度高低

K-近邻算法简介

使用 scipy.signal 在 Python 中进行卷积和反卷积