定性与定量的单变量正态性检验
对正态分布的检验往往具有两种方法,即从定性和定量两个角度出发。定性方法一般有直方图、Q-Q图和P-P图;定量方法一般有shapiro正态性检验和K-S正态性检验。下面将对这些定性和定量的方法做一个总结。
一、定性方法
1、直方图
通过直方图可以非常直观的发现变量的分布情况,同时往直方图中添加核密度曲线和理论正态分布曲线可以比较这条曲线的差异性。
脚本如下:
set.seed(1)
x <- rt(1000,5)
#绘制直方图
hist(x, freq = FALSE, breaks = seq(min(x),
max(x), length = 20), main = 'x的直方图',
ylab = '核密度值')
#添加核密度图
lines(density(x), col = 'red', lty = 1, lwd = 2)
#添加正态分布图
x <- x[order(x)]
lines(x, dnorm(x, mean(x), sd(x)),
col = 'blue', lty = 2, lwd = 2.5)
#添加图例
legend('topright',
legend = c('核密度曲线','正态分布曲线'),
col = c('red','blue'), lty = c(1,2),
lwd = c(2,2.5), bty = 'n')
本例中产生1000个自由度为5的t分布随机数,从直方图看,x似乎符合正态分布的形状,但其实际的核密度曲线与正态分布曲线又存在明显的差异。
2、Q-Q图
Q-Q图是一种散点图,对应于正态分布的Q-Q图,纵坐标是标准正态分布的分位数,横坐标为样本值的分位数。可利用QQ图鉴别样本数据是否近似于正态分布,只需看QQ图上的点是否近似地在一条直线附近。
脚本如下:
set.seed(1)
x <- rt(1000,5)
qqnorm(x, xlab = '实际分布', ylab = '正态分布',
main = 'x的Q-Q图', col = 'blue')
qqline(x)
图中显示绝大多数点还是在直线附近的,但还有一些点偏离了黑色直线,存在尖峰厚尾的分布形状,可能该序列不服从正态分布。
3、P-P图
P-P图是根据变量的累积比例与指定分布的累积比例之间的关系所绘制的图形。通过P-P图可以检验数据是否符合指定的分布。当数据符合指定分布时,P-P图中各点近似呈一条直线。P-P图和Q-Q图的用途完全相同,只是检验方法存在差异。
脚本如下:
set.seed(1)
x <- rt(1000,5)
x <- x[order(x)]
P <- pnorm(x, mean(x), sd(x))
#生成实际数据的累积分布值
cdf <- 0
for(i in 1:length(x)){cdf[i] <- sum(x <= x[i])/length(x)}
#绘制P-P图
plot(cdf, P, xlab = '实际分布', ylab = '正态分布',
main = 'x的P-P图', xlim = c(0,1), ylim = c(0,1),
col = 'blue')
#添加参考线
abline(a = 0, b = 1)
P-P图的结果与Q-Q图类似,绝大多数的数据还是落在直线上的,但仍有一部分数据是偏离直线的。
二、定量方法
定性方法中的直方图、Q-Q图和P-P图都能够直观的发现某个连续变量是否服从正态分布,但对于非常接近于正态分布的变量却无法准确判断是不是正态分布。为了解决这个问题,还可以从定量的角度出发,发现某个变量服从正态分布的概率,即从假设检验角度研究正态分布。
1、shapiro正态性检验
shapiro正态性检验比较适合样本量比较小的检验,一般低于5000的样本可以使用该方法。
脚本如下:
set.seed(1)
x <- rt(1000,5)
shapiro <- shapiro.test(x)
shapiro
很明显,该序列x服从正态性分布的概率非常之渺小,p-value<0.05,不能接受x服从正态性分布的原假设,从而得到x不服从正态分布。
2、K-S正态性检验
K-S正态性检验是一种基于经验累积分布函数(ECDF)的检验,该检验与shapiro正态性检验的区别主要在于样本量的考虑上,K-S正态性检验适合大样本的检验,超过5000样本可以考虑使用该方法。
脚本如下:
set.seed(1)
x <- rt(10000,5)
shapiro <- shapiro.test(x)
shapiro
ks <- ks.test(x,'pnorm')
ks
发现对于大样本(超过5000)shapiro正态性检验无法执行,此时使用K-S正态性检验可以得知x不服从正态性分布,原因是p-value远远小于0.05,即拒绝x服从正态分布的原假设。
三、定性和定量方法相结合
上文中分别介绍了定性和定量的正态性检验方法,下面对这两类方法做一个汇总,自定义一个函数,使得输出结果既包含直方图、Q-Q图和P-P图的定性结果,又包含shapiro正态性检验和K-S正态性检验的定量结果。
脚本如下:
norm.test <- function(x, breaks = 20, alpha = 0.05,
plot = TRUE){
if(plot == TRUE)
{#设置图形界面(多图合为一张图)
opar <- par(no.readonly = TRUE)
layout(matrix(c(1,1,2,3),2,2,byrow = TRUE),
width = c(2,2),heights = c(2,2))
#绘制直方图
hist(x, freq = FALSE, breaks = seq(min(x),
max(x), length = breaks), main = 'x的直方图',
ylab = '核密度值')
#添加核密度图
lines(density(x), col = 'red', lty = 1, lwd = 2)
#添加正态分布图
x <- x[order(x)]
lines(x, dnorm(x, mean(x), sd(x)),
col = 'blue', lty = 2, lwd = 2.5)
#添加图例
legend('topright',
legend = c('核密度曲线','正态分布曲线'),
col = c('red','blue'), lty = c(1,2),
lwd = c(2,2.5), bty = 'n')
#绘制Q-Q图
qqnorm(x, xlab = '实际分布', ylab = '正态分布',
main = 'x的Q-Q图', col = 'blue')
qqline(x)
#绘制P-P图
P <- pnorm(x, mean(x), sd(x))
cdf <- 0
for(i in 1:length(x)){cdf[i] <- sum(x <= x[i])/length(x)}
plot(cdf, P, xlab = '实际分布', ylab = '正态分布',
main = 'x的P-P图', xlim = c(0,1),
ylim = c(0,1), col = 'blue')
abline(a = 0, b = 1)
par(opar)
}
#定量的shapiro检验
if (length(x) <= 5000) {
shapiro <- shapiro.test(x)
if(shapiro$p.value > alpha)
print(paste('定量结果为:', 'x服从正态分布,',
'P值 =',round(shapiro$p.value,5), '> 0.05'))
else
print(paste('定量结果为:', 'x不服从正态分布,',
'P值 =',round(shapiro$p.value,5), '<= 0.05'))
shapiro
}
else {
ks <- ks.test(x,'pnorm')
if(ks$p.value > alpha)
print(paste('定量结果为:', 'x服从正态分布,',
'P值 =',round(ks$p.value,5), '> 0.05'))
else
print(paste('定量结果为:', 'x不服从正态分布,',
'P值 =',round(ks$p.value,5), '<= 0.05'))
ks
}
}
做了个序列的测试,效果如下:
这样就可以同时通过定性和定量的角度确定单变量是不是服从正态分布了。
文中脚本下载链接:
http://yunpan.cn/cH7dXVnCPRqKs 访问密码 f11e
参考书目:
R语言与网站分析
R语言实战
总结:文中使用到的R包和函数
stats包
hist()
qqnorm()
qqline()
plot()
lines()
legend()
qnorm()
dnorm()
shapiro.test()
ks.test()
paste()