我想用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
答案 0 :(得分:2)
我认为这两件事实际上是有道理的。 Anderson-Darling检验中的显着性水平或p值is extrapolated based on where the test statistic falls within the range of critical values。测试统计数据越往右,你就可以越多地拒绝它们来自同一分布的零假设。
请注意,对于使用示例分发参数的80-90个样本,您会看到测试统计信息(对于normal1
与normal2
)开始比最大临界值大得多,这意味着重要性的推断可以自由地增长(很大程度上,作为从polyfit
向无穷大的凸起二次函数的指数)。所以是的,对于大样本量,你将计算一些巨大数字的指数并且溢出。换句话说,您的数据显然不是来自相同的分布,即重要性外推溢出。在这种情况下,您可以从实际数据中引导一个较小的数据集,以避免溢出(或引导几次并平均统计数据)。
在频谱的另一端,当排序的数据集相同时,some steps的formula似乎承认负值的可能性。从本质上讲,这意味着统计数据远远超过临界值的左侧,表示完美匹配。
再次,通过外推法计算显着性,但这次它从检验统计量推断到最小临界值,而不是从最大临界值朝向检验统计量推断出不匹配的情况。由于相对于最小临界值(大约0.3),左侧统计量的相对大小恰好相对较小(我看到使用相同样本的统计值约为-1.3),因此得到的推断“仅仅” “大约140%左右,而不是爆炸成指数大的数字......但仍然看到1.4的显着性值是一个信号,表明数据只是超出了测试可能相关的范围。
这很可能是因为上面的链接线从计算的测试统计量中减去了k - 1
“自由度”。在两个样本的情况下,这意味着减去1.因此,如果我们将1加回到你看到的测试统计数据,它会使你在0.31的范围内,这几乎完全等于最低的临界值(这就是你期望完全相同的数据,这意味着即使是最弱的显着性水平,你也不能拒绝零假设)。因此,可能是自由度调整将其置于频谱的负端,然后通过基于哈希的二次型p值外推得到放大。