正态分布是统计分析中最重要的分布,很多时候我们希望能够确认数据是服从该分布的。今天我们学习使用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检验为准。根据样本量选择哪种方法我们还可以参考其他软件中的规定:
偏度系数和峰度系数 当数据近似正态分布时,峰度系数或者偏度系数应该接近于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。其结果可以作为正态分布考察的参照。 需要提醒的是,偏度系数和峰度系数更常用于对数据偏态程度的考察,正态性检验惯用的还是上面的图示法或非参数法。 |
|