正态性检验方法汇总

本文主要对正态性检验方法做了汇总,重点阐述了常用的正态性检验方法的使用场景及其在 R 或 Python 中的实现。

0.概述

正态分布在统计学中有着极为重要的地位,它是 χ 2 \chi^2 χ2分布、 t t t分布、 F F F分布的基础,也是许多统计方法的理论基础,故检验样本是否来自正态分布具有十分重要的意义。
正态性检验的方法有很多,以下列举了一些常见的方法:
图1 正态性检验常见方法
对于正态性检验,建议首先利用直方图或核密度估计得到样本数据的分布图,若分布严重偏态或尖峰,可认为其不是来自于正态分布;若根据直方图或核密估计分布不容易做出判断,再利用各检验方法对其检验。
注意:对于正态性检验,应该避免仅根据一种检验方法便轻易的做出决策,应该使用多种方法,综合评价。 source:参考文献[1]

另还有一些选择正态性检验的规定,仅供参考:

  • SPSS 规定:当样本含量 3≤n≤5000 时,结果以 Shapiro—Wilk(W 检验) 为准,当样本含量 n>5000 结果以 Kolmogorm —Smimov(D 检验,修正后的KS检验,即Lillie检验,见2.2.3) 为准。
  • SAS 规定:当样本含量 n≤2000 时,结果以 Shapim—Wilk(W 检验) 为准,当样本含量 n>2000 时,结果以 Kolmogorov—Smimov(D 检验,修正后的KS检验) 为准。

下文对直方图、Q-Q图以及Shapiro检验、KS检验的原理做一个较为详细的叙述,并给出对应方法在R语言和Python中的实现。另外,对其余方法做简要叙述。

本文内容中理论部分是作者阅读文献后整理得到

1.图示法

1.1 直方图

1.1.1 介绍

直方图(histogram)是用于展示分组数据分布的一种图形,它是用矩形的宽度和高度(即面积)来表示频数分布的。绘制该图时,在平面直角坐标系中,用横轴表示数据分组,纵轴表示频数或频率,这样就形成了一个矩形(即直方图)。
直方图与柱状图的区别:①直方图的高度与宽度都有意义。柱状图是用柱子的长度表示各类别频数的多少,其宽度(表示类别)固定;而直方图是用面积表示各组频数的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距;②由于分组数据具有连续性,直方图的各矩形通常是连续排列,而柱状图则是分开排列;③柱状图用于展示分类型数据,直方图用于展示数值型数据。source:参考文献[2]
直方图的具体绘制方法见参考文献[3] p 15 p_{15} p15

1.1.2 直方图初判

1.2 Q-Q图检验法(直线检验法)

1.2.1 Q-Q图性质

假设样本 X 1 , X 2 , . . . , X n X_1 ,X_2 ,...,X_n X1,X2,...,Xn来自正态总体 N ( µ , σ 2 ) N(µ,σ^2 ) N(µ,σ2). 将样本观测值按照由小到大的顺序排列, 得到次序统计量 x ( 1 ) ≤ x ( 2 ) ≤ ⋅ ⋅ ⋅ ≤ x ( n ) x_{(1)} \le x_{(2)} \le ··· \le x_{(n)} x(1)x(2)⋅⋅⋅x(n)和经验分布函数

F n ( x ) = { 0 x < x ( 1 ) k / n x ( k ) ≤ x ≤ x ( k + 1 ) , k = 1 , 2 , . . . , n 1 x ≥ x ( n ) F_n(x)=\left\{ \begin{array}{rcl} 0 & & {x < x_{(1)}}\\ k/n & & {x_{(k)}\le x \le x_{(k+1)}, k=1,2,...,n}\\ 1 & & {x\ge x{(n)}}\\ \end{array} \right. Fn(x)= 0k/n1x<x(1)x(k)xx(k+1),k=1,2,...,nxx(n)
由于当 n n n充分大时, ∀ ε > 0 \forall \varepsilon >0 ε>0 P ( ∣ F n ( x ) − F ( x ) ∣ > ε ) = 0 P(|F_n(x)-F(x)| >\varepsilon)=0 P(Fn(x)F(x)>ε)=0.
F ( x ) = P ( X ≤ x ) = ϕ ( x − μ σ ) F(x)=P(X\le x) =\phi(\frac{x-\mu}{\sigma}) F(x)=P(Xx)=ϕ(σxμ)
故当 n n n充分大时, F n ( x ) = ϕ ( x − μ σ ) F_n(x)=\phi(\frac{x-\mu}{\sigma}) Fn(x)=ϕ(σxμ), a . s a.s a.s
x − μ σ = ϕ ( − 1 ) ( F n ( x ) ) , a . s \frac{x-\mu}{\sigma}=\phi^{(-1)}(F_n(x)), a.s σxμ=ϕ(1)(Fn(x)),a.s
∀ x ∈ R \forall x \in R xR, 令 ϕ − 1 ( F n ( x ) ) ≡ ω \phi^{-1}(F_n(x)) \equiv \omega ϕ1(Fn(x))ω, 则有
x ≡ σ ω + μ , a . s x \equiv \sigma \omega + \mu, a.s xσω+μ,a.s
上式意味着,当总体是 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2)且样本量 n n n充分大时,样本观测值 x x x和逆标准正态分布值 ω \omega ω组成的点 ( ω , x ) (\omega, x) (ω,x)几乎处于一条直线上. source: 参考文献[3] p 22 p_{22} p22

1.2.2 作Q-Q图的步骤

  1. 将原始数据按升序排序,得到次序统计量 x ( 1 ) ≤ x ( 2 ) ≤ ⋅ ⋅ ⋅ ≤ x ( n ) ; x_{(1)} \le x_{(2)} \le ··· \le x_{(n)}; x(1)x(2)⋅⋅⋅x(n);
  2. 计算与 x ( n ) x_{(n)} x(n)相应的事件 X ≤ x ( n ) {X \le x_{(n)}} Xx(n)的概率(每个数据对应的百分位数)
    p i = F n ( x ( n ) ) = i − 0.5 n ; p_i = F_n(x_{(n)})=\frac{i-0.5}{n}; pi=Fn(x(n))=ni0.5;
  3. 对概率 p i p_i pi计算相应的标准正态分位数 u i ( i = 1 , 2 , . . . , n ) ; u_i(i=1,2,...,n); ui(i=1,2,...,n);
  4. 把点 ( u i , x ( i ) ) (u_i, x_{(i)}) (ui,x(i))画在平面直角坐标系上,并考察它们是否在一条直线上;
  5. #计算相关系数
    r = ∑ ( x ( i ) − x ‾ ) ( u i − u ‾ ) ∑ ( x ( i ) − x ‾ ) 2 ∑ ( u i − u ‾ ) 2 r = \frac{\sum (x_{(i)}-\overline{x})(u_i-\overline{u})}{\sqrt{\sum (x_{(i)}-\overline{x})^2}\sqrt{\sum (u_i-\overline{u})^2}} r=(x(i)x)2 (uiu)2 (x(i)x)(uiu)
    并检验其正态性(若点 ( u i , x ( i ) ) (u_i, x_{(i)}) (ui,x(i))近似在一条直线上(相关系数r=…),故可认为样本来自正态总体)

1.2.3 Q-Q图实现

  • R
library(car)
qqnorm(x)
  • Python
# QQ图
import statsmodels.api as sm
sm.qqplot(y,line='s')

# PP图
from scipy import stats
stats.probplot(x, dist="norm", plot=plt)

1.3 其他图示法

  • 核密度图判断该样本是否来自正态总体与直方图类似。
  • P-P图见参考文献[3] p 24 p_{24} p24

2.假设检验法

建立假设
H 0 : H_0: H0:总体 X X X的分布为正态分布 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2);(样本来自总体与正态分布无显著差异,即符合正态分布)
H 1 : H_1: H1:总体 X X X的分布不是正态分布 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2)

2.1 Shapiro-Wilk检验(Shapiro)

W 检验全称 Shapiro-Wilk 检验,是一种基于相关性的算法。计算可得到一个相关系数,它越接近 1 就越表明数据和正态分布拟合得越好。

2.1.1 检验步骤

  1. 将原始数据按升序排序,得到次序统计量 x ( 1 ) ≤ x ( 2 ) ≤ ⋅ ⋅ ⋅ ≤ x ( n ) ; x_{(1)} \le x_{(2)} \le ··· \le x_{(n)}; x(1)x(2)⋅⋅⋅x(n);
  2. 构造统计量
    W = ( ∑ i = 1 n a i x i ) 2 ∑ i = 1 n ( x i − x ‾ ) 2 ; W=\frac{(\sum_{i=1}^{n} a_i x_i)^2}{\sum_{i=1}^{n}(x_i - \overline{x})^2}; W=i=1n(xix)2(i=1naixi)2;

注:这里, x i x_i xi是第 i 个顺序统计量,即第 i 个最小的样本观测值。
$a_i , i=1,2…,n $是常数,它们的定义为
( a 1 , . . . , a n ) = m T V − 1 ( m T V − 1 V − 1 m ) 1 / 2 (a_1, ..., a_n) = \frac{m^TV^{-1}}{(m^TV^{-1}V^{-1}m)^{1/2}} (a1,...,an)=(mTV1V1m)1/2mTV1
m = ( m 1 , . . . , m n ) T m=(m_1, ..., m_n) ^T m=(m1,...,mn)T 是样本顺序统计量的样本均值, V是样本
顺序统计量的协方差矩阵。
(a可直接查表得到)

  1. 计算检验统计量 W W W,并与判断临界值 W α W_\alpha Wα做比较。
  2. 得出结论:若 W < W α W < W_{\alpha} W<Wα,按表上行写明的显著性水平α舍弃正态性假设( H 0 H_0 H0),若 W > W α W>W_\alpha W>Wα, 接受正态性假设.

2.1.2 实现

  • R
shapiro.test(x)
  • Python
from scipy import stats

stats.shapiro(x)

2.2 Kolmogorov-Smirnor检验(KS)

KS检验基于经验分布函数,该检验用大样本近似。其检验的是标化后的数据是否服从理论的分布
需要注意的是样本数据如果有结点(及是重复的数据),则无法计算准确的P值。

2.2.1 KS检验步骤

设样本的经验概率分布函数定义为 F n ( x ) = 1 n ∑ i = 1 n I X i ≤ x F_n(x)=\frac{1}{n}\sum_{i=1}^nI_{X_i \le x} Fn(x)=n1i=1nIXix,若 X i ≤ 1 X_i \le 1 Xi1 I X i ≤ x = 1 I_{X_i \le x}=1 IXix=1,否则0.

  1. 构造统计量(样本的累计分布函数与理论分布的分布函数的最大值)
    D n = sup ⁡ x ∣ F n ( x ) − F ( x ) ∣ D_n = \sup_{x}|F_n(x)-F(x)| Dn=xsupFn(x)F(x)
  2. 计算检验统计量 D n D_n Dn的值,拒绝域或者 p- 值由 K-S 分布计算给出。

D n D_n Dn的计算:
1)计算原数据的均值 x ‾ \overline{x} x与标准差 s s s,以及各水平对应的频数;
2)对水平的大小排序,得到频数序列,计算累计频数;
3)再计算累计频率,以及对应水平用Z-score法标准化后的取值;
4)使用标准化后的取值 x x x,查表得到理论分布的值;
5) D n = m a x ( 累计频率 − 理论分布 ) D_n=max(累计频率 - 理论分布) Dn=max(累计频率理论分布)
D值越小越接近正态分布

2.2.2 KS检验实现

  • R
ks.test(x, "pnorm",mean(x),sd(x))
#x为要检验的样本数据,其函数默认修改的精确公式、双边检验。
#需要大样本近似命令中加exact = F;
#单边我们可以用alternative = "less"或alternative= "greater"选择。
  • Python
from scipy import stats

stats.kstest(x, 'norm', (x.mean(), x.std()))  # 注意,Python的ks检验其P-value有时会与其他统计软件略微不同

2.2.3 Lilliefors检验(K-S检验的修正)

Lilliefors (Lillie)检验最早由Lilliefors 于1967年提出,它是对KS正态性检验的的修正,适合大样本。
适用于一般的正态性检验
Lillie检验实现

library(nortest)

lillie.test(x)
# Python中未找到lillie检验的封装函数.

2.3 其他检验法

  • 偏峰检验法
    详见参考文献[3] p 21 p_{21} p21
  • Pearson chi-square (Pearson)检验
    R nortest包中pearson.test()可以实现
    详见参考文献[3] p 20 p_{20} p20 [4][1]
  • Cramer-von Mises (CVM)检验
    R中nortest 包中的cvm.test()可以实现),需要注意的是如果(1+0.5/n)W的值不能大于2.64
    详见参考文献[4][1]
  • Anderson-Darling(AD)检验
    R中nortest包中的ad.test()可以实现
    详见参考文献[4][1]
  • Jarque-Bera (JB)检验(时间序列中常用
    Python实现:
import scipy.stats as ss
ss.jarque_bera(y)

https://www.php.cn/python-tutorials-391980.html
R中可用tseries包中的jarque.bera.test()实现
详见参考文献[4][1]

  • D’Agostino(Dago) 检验
    R的fBasics包中 dagoTest()可以实现
    详见参考文献[1]
  • Shapiro-Francia(SF)检验
    R中nortest包,sf.test()实现。是Shapiro检验的修正。
    详见参考文献[1]

还可以参考:
https://blog.csdn.net/u013524655/article/details/41053045 (SPSS)
http://www.mamicode.com/info-detail-937349.html (R)https://blog.csdn.net/cyan_soul/article/details/81236124 (Python)

参考文献:
[1] 何凤霞,马学俊. 基于R软件的正态性检验的功效比较[J].统计与决策,2012(18):17-19.
[2] 贾俊平. 统计学[M]. 第6版. 北京:中国人民大学出版社, 2014.12
[3] 高慧璇. 统计计算[M]. 北京:北京大学出版社, 1995.
[4] 李洪成. 数据的正态性检验方法及其统计软件实现 [J]. 统计与决策, 2009(12):155-156.

  • 52
    点赞
  • 338
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值