Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python k样本scipy-Anderson-Darling检验中的数学溢出错误_Python_Scipy_Statistical Sampling - Fatal编程技术网

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

Python k样本scipy-Anderson-Darling检验中的数学溢出错误,python,scipy,statistical-sampling,Python,Scipy,Statistical Sampling,我想用Kolmogorov-Smirnov(KS)和Anderson-Darling(AD)测试对样本进行比较。我分别用scipy.stats.ks2amp和scipy.stats.anderson2amp实现了这一点。我希望相似样本的统计值较低(相同样本为0),而更多不同样本的统计值较高 在相同样本和非常不同的样本(无重叠)的情况下,ks_2samp提供预期的结果,而anderson_ksamp为相同样本提供负值,更重要的是,为非常不同的样本抛出错误(可能是由于以下示例中的样本大小:200)

我想用Kolmogorov-Smirnov(KS)和Anderson-Darling(AD)测试对样本进行比较。我分别用
scipy.stats.ks2amp
scipy.stats.anderson2amp
实现了这一点。我希望相似样本的统计值较低(相同样本为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)
# 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
在不同的样品上:

sstats.ks_2samp(normal1, normal2)
sstats.anderson_ksamp([normal1, normal2])
分别返回:

# 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)
# 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
#应为
Ks_2抽样结果(统计=1.0,pvalue=1.4175052453413253e-89)
#不期而至
---------------------------------------------------------------------------
溢出错误回溯(上次最近调用)
在()
---->1统计数据anderson_ksamp([normal1,normal2])
/anderson_ksamp中的usr/lib/python3.5/site-packages/scipy/stats/morestats.py(示例,midrank)
1694警告。警告(“近似p值将通过外推计算”)
1695
->1696 p=数学表达式(np.polyval(pf,A2))
1697返回Anderson_ksamplesult(A2,临界,p)
1698
溢出错误:数学范围错误

我认为这两件事实际上是有道理的。Anderson-Darling检验中的显著性水平或p值。检验统计量越向右下降,你就越能拒绝它们来自同一分布的无效假设

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

在光谱的另一端,当排序的数据集相同时,它看起来像是接受了负值的可能性。本质上,这意味着统计数据远位于临界值的左侧,表示完全匹配

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


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

这是一个漂亮的答案@ely!您对解决此问题的最有效/最优雅的方法有何建议?您提出了一个引导分析但是为了使其健壮,我相信我需要使用几个引导,这将是一个很大的障碍。负值呢?如果为负值,只需将其设置为0?也许最好创建一个github问题?对于负值,您可以将
k-1
添加回该值(
k
将是通过测试的单独样本数),然后自己对临界值进行外推w.r.t.。您需要使用几个样本量较小的引导,但这是一个相对便宜的计算,因此我认为即使在较小的数据上重复50或100次计算也可以。请确保您也在引导过程中聚合临界值本身s也是(平均值可能很好,但您应该检查是否需要某种类型的顺序统计)。我不知道OP使用的是哪个版本的
scipy
,但在版本
1.1.0
中,AD测试不会崩溃,而是返回:
Anderson_ksampleResult(统计=202.74793118968645,临界值=array)([0.325,1.226,1.961,2.718,3.752]),显著性_level=inf)
。在版本
1.2.0
中,这将返回最大p值1。