正态分布检验


1、K-S检验

K-S检验基于累计分布函数,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同(即检验两总体分布是否存在显著差异)。

其原假设H0:两个数据分布一致或者数据符合理论分布(无显著差异)

计算 \mathrm{D}_{n}=\max \left\{\left|\mathrm{F}(\mathrm{x})-\mathrm{F}_{\mathrm{n}}(\mathrm{x})\right|\right\},当实际观测值D_{n}>D_{n}(α)则拒绝H0,否则则接受H0假设。(此处n为样本数,α为置信度)

F值公式
F_{n}(x)表示样本量为n的随机样本观察值的累计分布函数,且F_{n}(x)=i / n (i是等于或小于x的所有观察结果的数目,i=1, 2,...,n)。F(x)表示理论分布的累计概率分布函数。K-S单样本检验通过样本的累计分布函数F_{n}(x)和理论分布函数F(x)的比较来做拟合优度检验。检验统计量是F(x)F_{n}(x)间的最大偏差
\mathrm{D}_{n}=\max \left\{\left|\mathrm{F}(\mathrm{x})-\mathrm{F}_{\mathrm{n}}(\mathrm{x})\right|\right\}

若对每一个x值来说,F_{n}(x)F(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值的大小是不会变的。

一般如果D_n >D_{n}(0.05)。则认为有显著性差异

D_{n}(α)的计算方法
D_{n}(0.05)的经验算法:1.36/SQRT(N) 其中SQRT为平方根,N为样本数。D_{n}(0.01)经验算法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时,我们就没法拒绝原假设。

计算公式:W=\frac{\left(\sum_{i=1}^{n} a_{i} x_{i}\right)^{2}}{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}}

其中:

  • x_{i}用括号包含下标索引i的;不与x混淆,它是第i阶统计量,即样本中的第i个最小数
  • \bar{x}=\left(x_{1}+\cdots+x_{n}\right) / n是样本的平均值。
  • 常量 a_{i} 通过公式
    \left(a_{1}, \ldots, a_{n}\right)=\frac{m^{\top} V^{-1}}{\left(m^{\top} V^{-1} V^{-1} m\right)^{1 / 2}} ,其中m=\left(m_{1}, \ldots, m_{n}\right)^{\top}
  • 其中 m_{1},...,m_{n}是从一个标准的正态分布随机变量上采样的有序独立同分布的统计量的期望值。
  • 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的正态性检验
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342