我想用 Kolmogorov-Smirnov (KS) 和 Anderson-Darling (AD) 测试来比较一对样本。对于此,我分别使用了
在相同的样本和非常不同的样本(没有重叠)的情况下,
以下是说明这些发现的代码:
分别返回:
分别返回:
scipy. stats.ks_2samp
和 scipy.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
k-1
添加回该值(k
将是传递给测试的单独样本数),并自行执行关于临界值的外推。 您需要使用几个较小样本大小的引导程序,但这是一个相对廉价的计算,因此我认为即使在较小的数据上进行50或100次重复计算也是可以的。 确保您还跨引导聚合了临界值本身(平均值 可能 是可以的,但如果您需要某种顺序统计量,则应进行检查)。 - elyscipy
,但在版本1.1.0
中,AD 测试不会崩溃,而是返回:Anderson_ksampResult(statistic=202.74793118968645, critical_values=array([0.325, 1.226, 1.961, 2.718, 3.752]), significance_level=inf)
。在1.2.0
版本中,这似乎已经被修改了,最大 p 值为 1。 - Gabriel