|
今天跟大家聊聊应用统计中一个非常基础,却又非常容易让让人感到困惑与头疼的问题,那就是正态性。
正态性的基本概念想必大家都清楚,比如一组数据,如果其频率分布跟下图类似,那么这组数据就较接近正态分布 。在R中,我们也可以非常方便的用shapiro.test()命令来对某一变量是否符合正态分布进行检验。
大多科研工作者也都知道,很多模型如anova, 一般线性模型的前提假设都要求数据要符合正态分布,但问题是这个正态性指的到底是什么?
这个问题非常具有迷惑性,甚至很多概率论和应用统计大学老师也都含糊其辞,云里雾里。那么,今天,咱们就跟大家彻底澄清一下,这个正态性到底所指何物?我们把这个问题分成几步,一步步来分析。
1) anova和一般线性模型的目的是什么?
首先要明确这个问题,当我们想分析因素x对y有没有影响及其影响强度的时候,就可以采用anova或者线性模型对x和y之间的关系分析。这里还要明确的是,anova和一般线性模型本质上没有区别,实际应用中,二者往往也经常配合使用,线性模型中的r2即可由anova中的相关参数直接算出,这里我们不做讨论。不理解的可以找本书再回顾一番。
2) 正态性指的是对y的要求还是对x的要求?
这个毫无疑问,指的是因变量y, 也就是你要分析的那个指标。对x是否符合正态,以及x是分类变量还是连续变量,都没有任何要求。同一模型中,x可以有多个,x也可以既包括分类变量,又包括连续变量(即ancova)。所以我们必须明确,在你做方差分析,或者一般线性回归前,要明确的是y是否符合正态分布,而不是x。
3) 正态性检验,是否要对所有的y值(也就是你的全部数据)进行正态性检验?
几乎所有的人(当然也包括当年的我)拿到数据之后,首先做的第一件事,就是把数据输入软件,然后对y做一下正态性检验,其结果往往也是数据严重偏离正态。紧跟着下一幕就是你愁眉不展,抓耳挠腮,一通各种数据转换不亦乐乎,最终也没能很好的解决正态性这个完蛋问题。这是几乎99%的人都曾经感到迷惑的问题。那么,我们到底需不需要对所有的y值进行正态性检验呢?
答案是,在几乎100%的情况下,对所有的y进行正态性检验都毫无意义。
为什么这么说呢?我们首先看一个标准的线性回归的公式
y=a+bx+ε, ε ~N(0, σ2)
这里有假设y符合正态分布了么?完全没有,只是假设残差符合正态分布。那么残差符合正态分布,该如何理解呢?其实这个问题,在贝叶斯语境下会更容易理解。比如上述公式在贝叶斯语境下,就变成:
y ~ Normal (a+bx, σ2)
也就是说,这里假定,y是符合正态分布的。什么?我不是刚说了假定Y符合正态分布毫无意义么,怎么这里又假定他符合正态分布了呢?
列位看官,别着急,擦亮你的眼睛先,咱们慢慢分析。
在y ~ Normal (a+bx, σ2) 这个模型里, 假定y符合正态分布不假,但这里是假定y符合同一个正态分布么?
非也! 这里是假定y符合一系列均值随x值的变化而变化的一系列正态分布,只不过这一系列正态分布的方差都是σ2而已(想想anova和线性回归的第二个前提假设:方差齐次性,慢慢理解下,看是不是豁然开朗了)。
所以说,正态性的本质,是在x相同或者保持不变的前提下,对应的y应该符合一个正态分布。而当x变化的时候,y理论上应该符合一系列的均值由x决定,而方差又相同的正态分布。从根本上说,正态性指的是,当所有影响y的因素(至少是你认为对y影响比较大的那些因素,也就是通常情况下你在实验中设置的x)都固定的前提下,y的值应该是符合一个正态分布的。
在线性模型中,x对y的影响,也就是公式中的bx。当我们把bx完全去除,或者令x保持在某一固定值之后,y就应该服从一个均值固定,且方差为σ2的正态分布。而去除x的影响后的y值,我们可以用y’表示,y’=y-a-bx (是否减去a无所谓,因为a是一个常数), 这不就是模型的残差么!所以这也是为何第一个公式中,我们要假定模型的残差要符合正态分布。
通常,我们研究某一个指标y的时候,都需要考虑某些因素x对y的影响,而不是仅仅研究y本身的随机波动。所以说,在几乎所有情况下,我们直接对y进行正态性检验是毫无意义的,因为y的变异中掺杂了x对y的影响。所以正态性检验时,我们首先要把这部分影响排除,也就是只对模型的残差进行正态性检验(这是最常用的方法),或者对x相同时对应的y进行正态性检验就可以了。
好了,讲了这么多可能大家觉得还是有点抽象,下面就以一个最简单的案例说明这一问题。比如,我想了解男女之间体重是否有差别,分别从某一相同年龄段的人群中(人种等其他因素尽可能保持一致)随机调查了1000个男人和1000个女人的体重。然后直接对这2000个体重数据的分布作图,结果如下:
很明显,这是一个双峰曲线,是不符合正态分布的,对这组数据的正态性检验也说明了这一点:
那么怎么办?我就要放弃anova或者线性模型,或者立即开始对体重数据进行各种巧立名目的转换了么?别着急,按我们说的,当x保持一致时(这里也就是性别一致时),y符合正态分布就可以,那么,我们对男、女的体重可以分别作图:
这时我们变发现,男女的体重看起来分别都非常接近正态。所以我们可以拿体重对性别做线性回归:
lm1<-lm(weight~sex, data=data)
然后对这个模型的残差进行正态性检验:结果如下:
可见残差完全符合正态分布,模型本身没有任何问题。原始体重数据不符合正态分布,其实是由于性别造成,这也是我们为什么只对模型残差进行正态性检验的原因。
到这里,数据正态性的意义大家都清楚了吧!
事实上,在实际数据分析中,模型的残差真正符合正态分布的情况也很少见(至少我自己一次也没碰到过,当然这时,也可以先对y做下转化,然后再做回归分析)。当你历经千辛万苦,想尽各种办法去改进模型,但残差还是不符合正态分布怎么办呢?一种大家都认可的方案是,我们可以拿模型的残差和拟合值之间重新做一下回归,如果二者没有关系,那就说明你的模型没有什么大问题。残差的正态性,事实上并不是一个非常严格的限定条件,但拟合值和残差没有关系,这一点是一定要确认的。
最后需要说明的是,对于连续变量y(如体重,身高),通常我们可以认为在x固定的前提下,y理论上是符合正态的。 但有些变量属于天生混蛋型,无论x怎么保持一致,y都不可能服从正态(比如0,1数据,一个家庭有多少个孩子,一个鸟窝里有多少个鸟蛋,比率数据等等)。对于这类数据,一般线性模型是不适合的,要解决这个问题,我们就需要进入传说中的广义线性模型的范畴了,我们下次有机会再做介绍。
欢迎关注“二傻统计”微信公众号!
附代码:
##产生随机数据
female<-rnorm(1000,100, 10)
male<-rnorm(1000,125,10)
weight<-(c(female,male))
d1<-as.data.frame(weight)
d1$sex[c(0:1000,0)]<-"female"
d1$sex[c(1001:2000,0)]<-"male"
View(d1)
###体重数据的分布作图
plot(density(d1$weight))
polygon(density(d1$weight),col="slategray1")
###对体重的正态性进行检验
shapiro.test(d1$weight)
###男女各自的体重分布
library(ggplot2)
ggplot(data=d1,aes(x=weight, group=sex,fill=sex,alpha=0.5)) +
geom_density(adjust=1.5)
lm1<-lm(weight~sex,data=d1)
summary(lm1)
anova(lm1)
##对模型lm1的残差的残差作图
hist(lm1$residuals)
###对模型lm1的残差正态性进行检验
shapiro.test(lm1$residuals)
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-24 14:26
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社