在传统的假设检验过程中,我们常常假定模型的误差项是符合正态分布且同方差的。对于这样的假设是否真的成立,通常情况下我们可以使用诊断图来进行判断,但在这里我将和大家介绍如何使用其它方法去检查这两个条件是否同时满足。
1. 检测异常值(Outlier)
一般情况下,异常值的存在可能严重影响残差方差的正态性和同质性,进而导致偏倚,是统计结果的效力大打折扣,所以对于异常值的检测和剔除就显得非常重要。在这里我先和大家介绍如何通过检测与剔除异常值来使得残差方差满足正态性和同质性。
R包mvoutlier提供aq.plot(x)函数,通过计算稳健平方马氏距离和经验分布距离的差异来寻找多元样本里的异常值,并且以图片的形式展现出来,这里的x通常是一个矩阵或者数据框。
代码语言:javascript复制# 以mtcars数据集为例,寻找多元样本的异常值
library(mvoutlier) #加载R包
outliers <-
aq.plot(mtcars[c("mpg","disp","hp","drat","wt","qsec")])#绘图展示异常值
outliers # 列出异常值检测的结果,TRUE表示是异常值,FALSE表示非异常值
上图反映的就是各个样本点的平方马氏距离和经验分布距离的差距,样本距离原点越远,则该样本为异常值的可能性就越大。
2. 一元正态性
判断一元数据正态性的方法有很多,一般情况下,我们可以使用Q-Q图来看一元数据的正态性,这个方法简单直观,但是不够精确。
代码语言:javascript复制# 评估mtcars里的mpg数据的正态性
attach(mtcars)
qqnorm(mpg) # 绘制Q-Q图
qqline(mpg) # 添加参照线
就Q-Q图而言,数据点集中在参照线上说明数据服从正态分布,如果数据偏离参照线很大,那这组数据就极有可能不服从正态分布。当然,你也可以直接使用shapiro.test()函数来进行正态性的精确计算,这个函数在之前的非参数检验部分已经使用过了,这里就不赘述。
3. 多元正态性
多元方差分析假定数据服从多元正态分布,R包mvnormtest提供了进行多元正态性检验的函数mshapiro.test(),这个函数也是基于Shapiro-Wilk检验的。
代码语言:javascript复制# 检验多元正态性
library(mvnormtest) #加载R包
mshapiro.test(t(as.matrix(mtcars[,1:4]))) #计算多元正态性
上图结果现实p-value < 0.05,所以我们暂时可以认为mtcars数据集的前四个变量并不服从多元正态分布。
4. 方差的同质性
在R中,函数bartlett.test()提供了同方差性的参数检验方法,而flinger.test()则提供的是非参数检验方法。
代码语言:javascript复制#建立相关数据集
setosa <- iris[which(iris$Species=='setosa'),] #提取setosa类的鸢尾花
versicolor <- iris[which(iris$Species=='versicolor'),] #提取versicolor类的鸢尾花
mydata <- rbind(setosa,versicolor) #按行合并数据集
# Bartlett Test of Homogeneity of Variances
bartlett.test(Sepal.Length~Species, data=mydata)
# Figner-Killeen Test of Homogeneity of Variances
fligner.test(Sepal.Length~Species, data=mydata)
这里结果显示,无论是bartlett检验还是flinger检验,鸢尾花花萼长度方差具有一定异质性(p-value < 0.05)。
5. 协方差矩阵的同质性
在进行多元方差分析时,我们通常也要求协方差阵具有同质性,但是使用Box’s M 进行检验的结果常常会对非正态性十分敏感,这也导致我们在绝大多数情况下会拒绝原假设,应用时也需慎重。R包biotools里的boxM()函数可以帮助实现。
如何正确评估假设检验的条件是否成立是我们在进行统计分析时必须考虑的一件事,这点非常重要!关于这方面的内容就先分享到这儿,以后如有机会,我会和大家详细讲讲里面的数学原理。