《Discovering Statistics Using R》
笔记说明
读《Discovering Statistics Using R》第五章 Exploring assumptions做的笔记。本笔记对应章节为5.6,主要介绍正态性检验。
《Discovering Statistics Using R》书中只介绍了Shapiro-Wilk检验这一种正态性检验方法,本笔记参考其他资料补充了一些内容(其实补充的内容比书里的内容还多了)。
推荐阅读:SPSS教程:判断数据正态分布的超多方法!
正态性检验
正态性检验属于非参数检验。正态性检验的无效假设为:样本数据来自正态分布总体。因此正态性检验结果为P<α时拒绝无效假设,认为样本数据来自的总体和正态分布之间的差别有统计学意义,检验结果为P≥α时不拒绝无效假设,可以认为样本数据来自的总体符合正态分布。
正态性检验有很多种,常用的正态性检验有Shapiro-Wilk检验、Kolmogorov–Smirnov检验、Epps-Pulley检验等。
我国有关于正态性检验的推荐性国家标准《GB/T4882-2001数据的统计处理和解释:正态性检验》。在无方向的检验方法中,国标推荐使用Shapiro–Wilk检验和Epps-Pulley检验,Shapiro–Wilk检验适用于8≤n≤50的样本资料,Epps-Pulley检验适用于n≥8的样本资料。
在SPSS中,Shapiro-Wilk检验适用于3≤n≤5000的的小样本资料;Kolmogorov–Smirnov检验适用于n>5000的大样本资料。
在SAS中,Shapiro-Wilk检验适用于n≤2000的的小样本资料;Kolmogorov–Smirnov检验适用于n>2000的大样本资料。
示例数据
示例数据RExam记录了学生在R考试中的表现。
library(rio)
# 数据导入
rexam <- import("data/RExam.dat")
str(rexam)
## 'data.frame': 100 obs. of 5 variables:
## $ exam : int 18 30 40 30 40 15 36 40 63 31 ...
## $ computer: int 54 47 58 37 53 48 49 49 45 62 ...
## $ lectures: num 75 8.5 69.5 67 44.5 76.5 70 18.5 43.5 100 ...
## $ numeracy: int 7 1 6 6 2 8 3 7 4 6 ...
## $ uni : int 0 0 0 0 0 0 0 0 0 0 ...
数据中的uni变量是一个分类变量,0表示该条观测的学生来自Duncetown University 1表示该条观测的学生来自Sussex University。
对uni变量进行编码:
rexam$uni<-factor(rexam$uni, levels = c(0:1),
labels = c("Duncetown University", "Sussex University"))
str(rexam)
## 'data.frame': 100 obs. of 5 variables:
## $ exam : int 18 30 40 30 40 15 36 40 63 31 ...
## $ computer: int 54 47 58 37 53 48 49 49 45 62 ...
## $ lectures: num 75 8.5 69.5 67 44.5 76.5 70 18.5 43.5 100 ...
## $ numeracy: int 7 1 6 6 2 8 3 7 4 6 ...
## $ uni : Factor w/ 2 levels "Duncetown University",..: 1 1 1 1 1 1 1 1 1 1 ...
Shapiro-Wilk检验
可以用shapiro.test()
实现Shapiro-Wilk检验。Shapiro-Wilk检验的统计量为W。
shapiro.test(rexam$exam)
## Shapiro-Wilk normality test
##
## data: rexam$exam
## W = 0.96131, p-value = 0.004991
如果涉及分组的分析,需要看各组数据的正态性,可以使用by()
进行分组的正态性检验,比如按照uni变量进行分组正态性检验:
by(rexam$exam, rexam$uni, shapiro.test)
## rexam$uni: Duncetown University
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.97217, p-value = 0.2829
##
## ----------------------------------------------------------------------------
## rexam$uni: Sussex University
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.98371, p-value = 0.7151
Kolmogorov–Smirnov检验
Kolmogorov–Smirnov检验简称k-s检验。它基于累计分布函数,用于检验两个经验分布是否不同或一个经验分布与一个理想分布是否不同。统计量为D。在R中可以用ks.test()
来实现k-s检验。其用法为:
ks.test(x, y, …,
alternative = c("two.sided", "less", "greater"),
exact = NULL)
其中x,y即为需要比较的两组数据,在进行单样本的检验时x为单样本数据,y为与数据进行比较的累计分布函数。例如检验x是否与正态分布相符则填入“pnorm”(表示正态分布的累积分布函数),...
中填入y分布所需的参数比如正态分布的均值和标准差。
基于示例数据,用k-s检验检验exam变量的正态性会发现报错:
ks.test(rexam$exam,"pnorm",mean=mean(rexam$exam), sd=sd(rexam$exam))
## Warning message:
## In ks.test(rexam$exam, "pnorm", mean = mean(rexam$exam), sd = sd(rexam$exam)) :
## Kolmogorov - Smirnov检验里不应该有连结
这是因为数据中有重复值。k-s检验采用秩统计量,在排序过程中若有重复值的话就会显示警告。
可以用jitter()
给为数据加上噪音来解决这个问题:
ks.test(jitter(rexam$exam),"pnorm",mean=mean(rexam$exam), sd=sd(rexam$exam))
## One-sample Kolmogorov-Smirnov test
##
## data: jitter(rexam$exam)
## D = 0.099817, p-value = 0.272
## alternative hypothesis: two-sided
Epps-Pulley检验
Epps-Pulley检验虽然被纳入我国正态性检验的推荐国标,但我真没在实际中看到有人用过,就不展开了。。。
搜索后发现Epps-Pulley正态性检验可以使用PoweR
包的statcompute()
来实现。代码中函数第一个参数“31”表示使用Epps-Pulley检验,如果是“21”则对应Shapiro-Wilk检验.
statcompute(31, rexam$exam, levels = c(0.05, 0.1), critvalL = NULL, critvalR = NULL,
alter = 0, stat.pars = NULL)
正态性检验注意事项
大样本数据中,即使样本数据分布与正态分布只有微小的不同,也会在正态性检验中出现统计学意义。微小的不同并不会破坏正态性假设。因此考察数据正态性假设时,正态性检验的结果应该结合直方图、Q-Q图、偏度系数、峰度系数等的结果,综合考量。