2019独角兽企业重金招聘Python工程师标准>>>
首先准备两个样本:
set.seed(0)
a <- runif(100, min = -3, max = 3)
b <- rnorm(100, mean = 0, sd = 9)
正态分布检验的方法有:
1. ks.test()
ks.test函数是R语言自带的函数, 对单样本或双样本做Kolmogorov-Smirnov检验, 是用来检验数据的累计函数是否来自某个确切的分布, 故如果假设的正态分布的均值和方差, 可用ks.test函数进行正态分布检验, ks.test函数的声明如下:
ks.test(x, y, ...,
alternative = c("two.sided", "less", "greater"),
exact = NULL)
x: 向量, 是要验证的数据;
y: 如果是一个向量, 则验证其和x的累计分布是否一致; 也可以是一个字符串, 比如"pnorm", 指向具有连续型累积分布函数的分布;
...: 如果y是一个字符串, 则在这里设置y分布的参数;
alternative: 备择假设, 默认检验两分布的累计密度分布相同;
exact: 是否需要计算精确的p值, 默认一个样本, 样本数少于100, 且没有相同值, 或者双样本, 样本数的乘积少于10000时, 会精确计算p值.
比如要检验a,b是否来自标准正态分布以及a,b是否来自同一个分布:
ks.test(a,"pnorm", mean = 0, sd = 9) # 1.692e-12
ks.test(b,"pnorm", mean = 0, sd = 9) # 0.2196
ks.test(a, b) # 1.001e-07
2. shapiro.test()
shapiro.test函数也是R语言自带的一个函数, 用来做Shapiro-Wilk正态性检验, 函数声明如下:
shapiro.test(x)
x: 需要做正态性检验的数据, 非缺失值个数应在3到5000个.
比如要检验a,b是否来自正态分布:
shapiro.test(a) # 0.002126
shapiro.test(b) # 0.1671
3. nortest包
只有5个函数的包, 而这5个函数都是用来做正态性检验的, 5个函数的声明如下:
ad.test(x)
cvm.test(x)
lillie.test(x)
pearson.test(x, n.classes = ceiling(2 * (n^(2/5))), adjust = TRUE)
sf.test(x)
x: 要验证正态性的数据;
n.classes: 分组的数目, 默认以Moore (1986)为准;
adjust: p值的计算是否需要调整, 默认为TRUE, 则计算的时候认为统计量来自自由度为n.classes - 3的卡方分布, 否则来自自由度为n.classes - 1的卡方分布.
ad.test是Anderson-Darling正态性检验,;
cvm.test是Cramer-von Mises正态性检验;
lillie.test是Lilliefors (Kolmogorov-Smirnov)正态性检验;
pearson.test是pearson卡方正态性检验;
sf.test是Shapiro-Francia正态性检验, 用这些检验验证a,b的正态性.
ad.test(a) # 0.002495
cvm.test(a) # 0.004729
lillie.test(a) # 0.03081
pearson.test(a) # 0.1667
sf.test(a) # 0.008442
ad.test(b) # 0.09009
cvm.test(b) # 0.1537
lillie.test(b) # 0.0235
pearson.test(b) # 0.003961
sf.test(b) # 0.1458
4. fBasics包
fBasics包是一个处理金融数据的基础包, 包含了6个正态性检验的函数, 并且包含了nortest包的5个正态性检验函数, 声明如下:
ksnormTest(x, title = NULL, description = NULL)
jarqueberaTest(x, title = NULL, description = NULL)
dagoTest(x, title = NULL, description = NULL)
jbTest(x, title = NULL, description = NULL)
shapiroTest(x, title = NULL, description = NULL)
normalTest(x, method = c("sw", "jb"), na.rm = FALSE)
adTest(x, title = NULL, description = NULL)
cvmTest(x, title = NULL, description = NULL)
lillieTest(x, title = NULL, description = NULL)
pchiTest(x, title = NULL, description = NULL)
sfTest(x, title = NULL, description = NULL)
x: 数值向量或者是S4对象形式的时间序列;
tittle: 可以指定输出标题;
description: 可以指定输出详细情况;
method: normalTest函数的参数, 设定正态性检验的函数;
na.rm: normalTest函数的参数, 检验前是否删除NA数据, 默认为FALSE.
ksnormTest进行Kolmogorov-Smirnov正态性检验;
jarqueberaTest进行Jarque-Bera正态性检验;
dagoTest进行D'Agostino正态性检验;
jbTest进行JB LM和ALM检验;
shapiroTest进行Shapiro-Wilk's正态检验;
normalTest是为了兼容SPlus/Finmetrics而设置的函数, method可以设置成"ks","jb","da","sw","ad", 从而调用ksnormTest, jarqueberaTest, dagoTest, shapiroTest, adTest函数得到结果, 默认为shapiroTest的结果;
adTest是兼容nortest包中的ad.test函数;
cvmTest是兼容nortest包中的cvm.test函数;
lillietest是兼容nortest包中的lillie.test函数;
pchiTest是兼容nortest包中的pearson.test函数;
sfTest是兼容nortest包中的sf.test函数.
用这11个函数做正态性检验:
ksnormTest(scale(a)) # 0.345 0.1734 0.4033
jarqueberaTest(a) # 0.0548
dagoTest(a) # 4.732e-07 0.7064 7.292e-08
jbTest(a) # 0.045 0.053 0.055
shapiroTest(a) # 0.002126
normalTest(a) # 0.002126
adTest(a) # 0.002495
cvmTest(a) # 0.004729
lillieTest(a) # 0.03081
pchiTest(a) # 0.1667 0.2919
sfTest(a) # 0.008442
ksnormTest(scale(b)) # 0.3136 0.6009 0.1574
jarqueberaTest(b) # 0.3622
dagoTest(b) # 0.3686 0.1781 0.6689
jbTest(b) # 0.274 0.293 0.362
shapiroTest(b) # 0.1671
normalTest(b) # 0.1671
adTest(b) # 0.09009
cvmTest(b) # 0.1537
lillieTest(b) # 0.0235
pchiTest(b) # 0.003961 0.01131
sfTest(b) # 0.1458
Kolmogorov-Smirnov能检验数据是否来自某个特定的分布(连续分布), 而ksnormTest函数只能检验数据是否来自标准正态分布;
Kolmogorov-Smirnov检验和Lilliefor检验在样本数大于100的时候, 会用近似计算p值, 比较不精准, 但是随着样本数的增加近似结果会变好.
pearson卡方正态性检验和Kolmogorov-Smirnov检验都采用实际频数和期望频数进行检验, 前者既可用于连续总体, 又可用于离散总体, 而Kolmogorov-Smirnov检验只适用于连续和定量数据.
Shapiro-Wilk检验只适用于小样本场合, 在一些软件里面, 只在样本数小于2000时选用这个方法, 其他方法的检验功效一般随样本容量的增大而增大.
Jarque-Bera检验易受异常值的影响, 检验功效就会降低.
Shapiro-Wilk检验和Lilliefor检验都是进行大小排序后得到的,所以易受异常值的影响.
pearson卡方正态性检验的检验结果依赖于分组,而其他方法的检验结果与区间划分无关.
假设检验的目的是拒绝原假设, 当p值不是很大时, 应根据数据背景再作讨论.
由上面的结果可以看出, 不同的检验可以得到完全不一样的结论, 一般而言, 我们不去做所有的检验, 可根据具体情况衡量用哪种方法分析.
PS:
SPSS 规定: 当样本含量3 ≤ n ≤ 5000时, 结果以Shapiro-Wilk为准, 当样本含量n > 5000结果以Kolmogorov-Smirnov为准.
而SAS 规定: 当样本含量n ≤ 2000时, 结果以Shapiro-Wilk为准, 当样本含量n >2000时, 结果以Kolmogorov-Smirnov为准.