方差分析是研究一种或多种因素的变化对试验结果的观测值是否有显著影响,从而找到较优试验条件或生产条件的一种常用数理统计方法。
方差分析根据平方和的加和原理,利用F检验,进而判断试验因素对试验结果的影响是否显著。
分为:单因素方差分析(one-way ANOVA)、双因素方差分析(two-way ANOVA)和多因素方差分析分析(multi-way ANOVA)
方差分析的前提假设:
①样本数据独立
②每组数据的总体服从正态分布分布
③每组数据方差齐性
因此在进行方差分析前,需要先进行对应的检验:
(1)正态性检验
①使用Shaprio-Wilk正态检验方法来检验样本是否符合正态分布
②使用Q-Q图来检验正态性
(2)方差齐性检验
①Bartlett检验:适用于数据服从正态分布,而当数据非正态时容易导致假阳性。
②Levene检验:在非正态数据时,表现较为稳定,对正态不敏感。
③Fligner-Killeen检验:非参数检验,完全不依赖已知分布。
(3)离群点检验
由于方差分析对离群点很敏感,所以需要对数据检测是否有离群点,最常用(可能也较为好使的)是以图形展示室,如箱线图、散点图等形式:
①mvoutlier包aq.plot()作物
②car包的outlierTest()作图
1、单因素方差分析分析——检验前提(正态性)
(1)独立性:由于随机抽取,假设总体满足独立。
(2)检验正态性:用W检验。
H0:样本数据与正态分布没有明显区别;
HA:样本数据与正态分布存在显著区别。
W统计量越小,越接近零,表示样本越接近正态分布;p值,如果p-value小于显著性水平α(通常为0.05),则拒绝H0。代码如下:
# 导入数据
df<-read.csv("sss.csv")
# 部分数据展示
head(df)
# 进行正态性检验
shapiro.test(df[which(df[,2]=="A"),]$x)
shapiro.test(df[which(df[,2]=="B"),]$x)
shapiro.test(df[which(df[,2]=="C"),]$x)
shapiro.test(df[which(df[,2]=="D"),]$x)
shapiro.test(df[which(df[,2]=="E"),]$x)
#结论:所有因素的W检验显示不显著,即满足正态性。
2、单因素方差分析分析——检验前提(齐次性)
检验方差齐次性(本例使用bartlett检验)
H0:各因子水平下的方差相同。
HA:各因子水平下的方差不同。
# 接续上一个代码
# 进行bartlett方差齐性检验
bartlett.test(x~method,data=df)
检验结果显示,p-value>0.05,即差异不显著,接受原假设(方差齐性)。
3、单因素方差分析分析——检验前提(离群性)
方差齐性检验本身对离群点就非常敏感。当然也可以用outlierTest()函数进行检验。
# 接续上一代码
# 进行离群性检验
library(car)
outlierTest(aov(x~method,data=df))
结论:没有证据表明数据中存在离群点。
4、单因素方差分析
由于经过前面三步的检验,符合方差分析的假设条件。下面进行方差分析。【注意:如果正态性和方差齐性不满足,需要中KW检验进行分析,对应的函数为:kruskal.test()】
# 接续上一代码
# 对数据进行方差分析
df$method<-factor(df$method)
aov.model<-aov(x~method,data=df)
summary(aov.model)
boxplot(x~method,data=df)
结论:p值小于0.05,即method的不同水平之间差异显著。
5、双因素(无交互)方差分析
双因素(无交互)方差分析,仍需要满足:数据独立、正态性和方差齐性。
R中的函数aov():不考虑交互作用x~A+B,加号表示两个因素具有可加性。
# 双因素(无交互)方差分析
# 导入数据
juice<-read.csv("juice.csv")
# 数据展示
head(juice)
# 转化为因子型变量
juice$A<-factor(juice$A)
juice$B<-factor(juice$B)
# 双因素方差分析
juice_aov<-aov(X~A+B,data=juice)
summary(juice_aov)
结论:A因素不同水平对x的影响差异不显著,B因素不同水平对x的影响差异显著。
6、双因素(有交互)方差分析
双因素(有交互)方差分析仍需要满足:数据独立、正态性和方差齐性。
有交互作用,表示两个因素的不同水平较差搭配对试验指标产生影响。
R中的函数aov():考虑交互作用的方差分析模型x~A+B+A:B
# 双因素(有交互)方差分析
# 导入数据
rats<-read.csv("rats.csv")
# 数据展示
head(rats,3)
# 转化为因子型变量
rats$Toxicant<-factor(rats$Toxicant)
rats$Cure<-factor(rats$Cure)
# 更改图形显示的界面排版
op<-par(mfrow=c(1,2))
# 图形展示
plot(Time~Toxicant+Cure,data=rats)
# 用函数interaction.plot()作出交互效应图,考察因素间是否存在交互作用
with(rats,interaction.plot(Toxicant,Cure,Time,trace.label="Cure"))
with(rats,interaction.plot(Cure,Toxicant,Time,trace.label="Toxicant"))
# 方差分析
rats_aov<-aov(Time~Toxicant+Cure+Toxicant:Cure,data=rats)
summary(rats_aov)
由交互曲线图可以看出,曲线中没有明显的相交情况出现,初步认为两个因素没有交互作用,下一步在用方差分析进行两因素间交互作用的确认。
由方差分析结果可知:两因素对Time的影响极显著;二者间的交互作用对Time影响不显著。