1、K-S检验
K-S检验基于累计分布函数,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同(即检验两总体分布是否存在显著差异)。
其原假设H0:两个数据分布一致或者数据符合理论分布(无显著差异)
计算 ,当实际观测值>则拒绝H0,否则则接受H0假设。(此处n为样本数,α为置信度)
F值公式
用表示样本量为n的随机样本观察值的累计分布函数,且 (i是等于或小于x的所有观察结果的数目,i=1, 2,...,n)。表示理论分布的累计概率分布函数。K-S单样本检验通过样本的累计分布函数和理论分布函数的比较来做拟合优度检验。检验统计量是与间的最大偏差
若对每一个x值来说,与都十分接近,则表明实际样本的分布函数与理论分布函数的拟合程度很高。
例:对于以下两组数据:
controlB={1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38}
treatmentB= {2.37, 2.16, 14.82, 1.73, 41.04, 0.23, 1.32, 2.91, 39.41, 0.11, 27.44, 4.51, 0.51, 4.50, 0.18, 14.68, 4.66, 1.30, 2.06, 1.19}
观察数据的累计分段函数
对controlB数据从小到大进行排序:
sorted controlB={0.08, 0.10, 0.15, 0.17, 0.24, 0.34, 0.38, 0.42, 0.49, 0.50, 0.70, 0.94, 0.95, 1.26, 1.37, 1.55, 1.75, 3.20, 6.98, 50.57}。
10%的数据(2/20)小于0.15,85%(17/20)的数据小于3。所以,对任何数x来说,其累计分段就是所有比x小的数在数据集中所占的比例。下图就是controlB数据集的累计分段图
可以看到大多数数据都几种在图片左侧(数据值比较小),这就是非正态分布的标志。为了更好的观测数据在x轴上的分布,可以对x轴的坐标进行非等分的划分。在数据都为正的时候有一个很好的方法就是对x轴进行log转换。下图就是上图做log转换以后的图:
将treatmentB的数据也做相同的图(如下),可以发现treatmentB和controlB的数据分布范围大致相同(0.1 - 50)。但是对于大部分x值,在controlB数据集中比x小的数据所占的比例比在treatmentB中要高,也就是说达到相同累计比例的值在treatment组中比control中要高。
KS检验使用的是两条累计分布曲线之间的最大垂直差作为D值(statistic D)作为描述两组数据之间的差异。在此图中这个D值出现在x=1附近,而D值为0.45(0.65-0.25)。
值得注意的是虽然累计分布曲线的性状会随着对数据做转换处理而改变(如log转换),但是D值的大小是不会变的。
一般如果 >。则认为有显著性差异
的计算方法:
的经验算法:1.36/SQRT(N) 其中SQRT为平方根,N为样本数。经验算法1.64/SQRT(N) 。当然最准确的办法还是去查KS检定表。不过大多数软件如CLAMPFIT,MINIANALYSIS统计出来的结果都是直接有P值。根据这个值(alpha=0.05)就可以断定有没有差异了。
K-S 检验优缺点:
优点:该检验不依赖于要测试的累积分布函数,相比于卡方拟合检验(卡方检验需要50个以上的样本),不需要大量的样本。缺点:易受异常值影响
在Python中有现成的包可以直接用于KS检验:
from scipy.stats import kstest
kstest(x,cdf = "norm")
# x表示待检验的样本集
# cdf用来指明要判断的已知分布类型,有:‘norm’,’expon’,’logistic’,’gumbel’,’gumbel_l’, gumbel_r’,‘extreme1’值可以选,其中norm表示正态分布检验。
# kstest会返回两个值:statistic → D值,pvalue → P值
# p值大于0.05,则不拒绝原假设,分布为正态分布
2、AD检验
AD检验是在KS基础上进行改造的,K-S检验只考虑了两个分布之间差值最大的那个点,但是这容易受异常值的影响。AD检验考虑了分布上每个点处的差值。
在Python中可以用如下代码:
##生成标准正态随机数
import numpy as np
np.random.seed(0)
data_norm = np.random.normal(0,1,100)
##用Anderson-Darling检验生成的数组是否服从正态分布
import scipy.stats as stats
stats.anderson(data_norm, dist='norm')
'''
原假设 H0:样本服从特定分布; 备择假设 H1:样本不服从特定分布
输出AndersonResult(statistic=0.18097695613924714,
critical_values=array([ 0.555, 0.632, 0.759, 0.885, 1.053]),
significance_level=array([ 15. , 10. , 5. , 2.5, 1. ]))
如果输出的统计量值statistic < critical_values,则表示在相应的significance_level下,
接受原假设,认为样本数据来自给定的正态分布。'''
3、W检验
W检验(Shapiro-Wilk的简称)主要检验研究对象是否符合正态分布。它是基于两个分布的相关性来进行判断,会得出一个类似于皮尔逊相关系数的值。值越大,说明两个分布越相关,越符合某个分布。
原假设H0: 一定样本量n(8<n<50)的研究对象总是符合正态分布。
将样本量为n的样本按照大小顺序编排,然后根据公式计算统计量W的值,该值越接近于1,且显著水平大于0.05时,我们就没法拒绝原假设。
计算公式:
其中:
- 用括号包含下标索引i的;不与混淆,它是第i阶统计量,即样本中的第i个最小数
- 是样本的平均值。
- 常量 通过公式
,其中 - 其中 是从一个标准的正态分布随机变量上采样的有序独立同分布的统计量的期望值。
- V是这些有序统计量的协方差。
解释:
这个统计检验的假设是样本来自于一个正态母体,
因此,一方面,如果p值小于选择的显著度水平(α值 通常0.05),那么在更大概率下我们应该拒绝零假设,数据的证据显示我们的样本不是来自一个正态分布母体。另一方面,如果p值比选择的显著度水平大,那么我们没有证据拒绝零假设,数据来自于一个正态分布。(举个栗子,如果p值是0.05,同时选择的显著度水平是0.05,那么应该拒绝零假设,数据来自与一个正态分布母体。)
和大多数统计学显著性测试一样,如果样本空间足够大,那么该检验可以发现零假设的每一个细节。(即虽然这里可能有统计显著性效用,但它实在太小而不可能是任何一个实际的统计显著性。)因此,通常建议做额外的效果因子调查,例如,这种情况下的一个Q-Q图。
W检验在Python中的实现代码如下:
from scipy.stats import shapiro
shapiro(x)
# 上面的代码会返回两个结果:W值和其对应的p_value
# shapiro是专门用于正态性检验的,所以不需要指明分布类型。且 shapiro 不适合做样本数>5000的正态性检验