分享

骚年,看这里!正态性检验的R语言实现!简直666~~

 yjt2004us 2018-04-08

正态分布是统计分析中最重要的分布,很多时候我们希望能够确认数据是服从该分布的。今天我们学习使用R语言来考察数据的正态性的方法。

正态分布的考察主要有两种方法:定性的图示法和定量的非参数法,此外峰度系数和偏度系数也可作为考察数据正态性的参照。

今天小编为大家详细解读定量的非参数法。

Shapiro-Wilk检验(W检验)

W检验是建立在次序统计量的基础上的。对n个独立观测值 ,将其按照升序排列后计算W统计量来判断,具体计算公式参考方积乾老师的卫生统计学教材。R语言中使用shapiro.test() 函数实现W检验,推荐样本量为小于5000:

> shapiro.test(rnorm(1000,0,1))

    Shapiro-Wilk normality test

data:  rnorm(1000, 0, 1)

W = 0.9984, p-value = 0.494

P值=0.74,不拒绝原假设,认为样本服从正态分布,实际上这里我们正是使用正态分布函数构造的数据。

注意:很多统计书认为W检验适合于小样本资料(3<><><>

Kolmogorov-Smirnov检验(K-S检验)

Kolmogorov-Smirnov检验又称K-S检验或K-S D检验,本质上是一种拟合优度检验。该检验方法基于变量的累计分布函数,用于检验经验分布是否符合某理论分布,或者比较两个经验分布是否有差异。若差距很小,则认为经验分布符合理论分布,或两个经验分布相同。K-S检验主要用于连续分布的检验,不仅可用于检验正态分布,还可用于检验其他分布,例如均匀分布,指数分布,poisson分布等。需要注意的是,k-s检验在计算时采用大样本近似计算,且样本数据中不能有节点(重复数值)。R软件中用函数ks.test() 实现该检验,该函数的参数如下

ks.test(x, y, ..., alternative = c('two.sided', 'less', 'greater'),exact = NULL)

其中X为数值向量,y为另一数值向量(此时为双样本检验)或者某理论分布(此时为单样本检验,需要使用累计分布函数),alternative指定检验时采用双侧还是单侧,exact设置近似计算还是精确计算,默认NULL。

#构造数据

set.seed(4)

d<>rnorm(1000,0,1)

e<>rnorm(100,0,1)

f<>rbinom(100,100,0.5)

#检验向量d是否服从均数为0标准差为1的正态分布,结论为不拒绝无效假设

ks.test(d,'pnorm',0,1,alternative = 'two.sided')

> ks.test(d,'pnorm',0,1,alternative = 'two.sided')

    One-sample Kolmogorov-Smirnov test

data:  d

D = 0.022727, p-value = 0.6799

alternative hypothesis: two-sided

#检验向量d是否服从均数为1标准差为1的正态分布,结论为拒绝无效假设

ks.test(d,'pnorm',1,1,alternative = 'two.sided')

> ks.test(d,'pnorm',1,1,alternative = 'two.sided')

    One-sample Kolmogorov-Smirnov test

data:  d

D = 0.4053, p-value 2.2e-16

alternative hypothesis: two-sided

#检验向量d和向量e是否服从同一正态分布,结论为不拒绝无效假设

ks.test(d,e,alternative = 'two.sided')

> ks.test(d,e,alternative = 'two.sided')

    Two-sample Kolmogorov-Smirnov test

data:  d and e

D = 0.091, p-value = 0.4389

alternative hypothesis: two-sided

#检验向量f是否服从均数为0标准差为1的正态分布,结果为拒绝无效假设并出现警告提示

ks.test(f,'pnorm',0,1,alternative = 'two.sided')

> ks.test(f,'pnorm',0,1,alternative = 'two.sided')

    One-sample Kolmogorov-Smirnov test

data:  f

D = 1, p-value 2.2e-16

alternative hypothesis: two-sided

Warning message:

In ks.test(f, 'pnorm', 0, 1, alternative = 'two.sided') :

  Kolmogorov - Smirnov检验里不应该有连结

我们构造的向量f是服从二项分布的,而二项分布不是连续型分布。可以看到,在对向量f检验时,R语言输出了“Kolmogorov - Smirnov检验里不应该有连结”的警告,这是因为,K-S检验是基于连续累积分布函数的,而连续累积分布中出现相同值的概率为0。也就是说,K-S检验只适用于连续分布的数据,这也是K-S检验与卡方拟合优度检验不同的地方。

lillie检验

在spss的探索对话框中有一种修正的k-s检验,即lillie检验。R语言中也可以实现该检验,但是需要通过nortest包中的lillie.test()函数来实现

library(nortest)

lillie.test(d) 

> lillie.test(d)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  d

D = 0.010926, p-value = 0.9944

卡方拟合优度检验

卡方检验可用于单样本资料的拟合优度检验,但一般是分类资料。用于定量数据做正态性检验时,数据要进行分组。可喜的是nortest包中pearson.test()函数已经替我们完成这一过程

> pearson.test(d)

    Pearson chi-square normality test

data:  d

P = 21.888, p-value = 0.8248

其他检验方法

除了以上方法,R语言的nortest包中还提供多个函数用于正态性检验,这里不做演示,仅仅将相关函数列举如下

ad.test()进行Anderson-Darling正态性检验。

cvm.test()进行Cramer-von Mises正态性检验。

sf.test()进行Shapiro-Francia正态性检验。

样本含量问题

R中规定3≤n≤5000时,结果以W检验为准,当n>5000时,以k-s检验为准。根据样本量选择哪种方法我们还可以参考其他软件中的规定:

  • SPSS中规定,当样本含量3≤n≤5000时,结果以W检验为准,当样本含量n>5000时,以K-S检验为准。

  • SAS中规定,当样本含量n≤2000时,结果以W检验为准,当样本含量n>2000时,以K-S检验为准。

参数方法

偏度系数和峰度系数

当数据近似正态分布时,峰度系数或者偏度系数应该接近于0,所以理论上峰度系数或偏度系数可以进行正态性检验。R许多扩展包提供计算偏度和峰度的函数,这里仅以psych包中的describe()函数来说明使用方法:

library(psych)

describe(d)

> describe(d)

   vars    n  mean   sd median trimmed  mad   min  max range  skew kurtosis   se 

X1    1 1000 -0.03 0.97  -0.04   -0.03 0.97 -2.84 3.17  6.01 -0.01    -0.12 0.03

describe()函数输出了峰度和偏度的计算结果,可以看到峰度为-0.12,偏度为-0.01。其结果可以作为正态分布考察的参照。

需要提醒的是,偏度系数和峰度系数更常用于对数据偏态程度的考察,正态性检验惯用的还是上面的图示法或非参数法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多