1.方差分析的基本思想
方差:又叫均方,是标准差的平方,是表示变异的量。在一个多处理实验中,可以得出一系列不同的观测值,导致这些观测值不同的原因主要是由于处理效应(处理不同引起的)和试验误差(试验过程中偶然性因素的干扰和测量误差)两个因素所导致,方差分析就是确定各种原因(处理效应、试验误差)在总变异种所占的重要程度,方差检验结果相差不大,说明试验处理对于指标影响不大;结果相差较大,即处理效应比试验误差大得多,说明试验处理影响很大,不可忽视。
2.方差分析的前提条件
-
采样的随机性
难以用数学的方法进行检验 -
样本的独立性
通常也不进行检验 -
分布的正态性
正态性检验——Shapiro-Wilk normality test -
方差同质性(齐性)
Bartlett Test of Homogeneity of Variances (parametric)
Figner-Killeen Test of Homogeneity of Variances (non-parametric)
3.方差分析的步骤
- 提出原假设和备择假设;
- 计算各因素的离差平方和、均方差和原假设的显著性概率;
- 根据显著性概率和显著性水平,判断拒绝或者接受原假设。
4.单因素方差分析举例——R语言
1.输入数据
#不同地点植物的初级生产力
site1 <- c(9.4, 8.7, 13.3, 13.6, 15, 15.2, 17.7, 18.6, 22.2)
site2 <- c(16.8, 30.8, 33.6, 40.5, 48.9)
site3 <- c(27.0, 28.9, 32, 32.7, 35.5, 45.6)
site4 <- c(21.0, 23.4, 27.5, 27.5, 30.5, 31.9, 32.5, 33.8, 33.8)
site5 <- c(24.3, 29.7, 19.9)
site6 <- c(17.7, 19.7, 21.5, 27.9, 34.8, 40.2)
site7 <- c(16.5, 20.7, 23.5, 26.4, 26.7, 29.5, 29.8, 31.9, 35.5)
#将数据组合成一个数据框
rodent.survey <- data.frame(weight=c(site1,site2,site3,site4,site5,site6,site7), site=factor(c(rep("1",9),rep("2",5),rep("3",6),rep("4",9),rep("5",3), rep("6",6),rep("7",9))))
2.做数据的描述统计
#可用psych()包中的describeBy分组计算
library(psych)
describeBy(rodent.survey, rodent.survey$site)
#也可用tapply函数直接计算均值方差等
tapply(rodent.survey$weight, rodent.survey$site, mean)
tapply(rodent.survey$weight, rodent.survey$site, var)
tapply(rodent.survey$weight, rodent.survey$site, sum)
3.分析和结果
fit <- aov (weight~site, data=rodent.survey)
summary(fit)
4.多重比较
TukeyHSD(fit)$site
可以看到3-2差异不显著(p=1),3-1差异非常显著(p<0.01),查看Tukey HSD均值成对比较图,图形中置信区间包含0的表示差异不显著。
5.评估检验的假设条件
1.正态性检验——Q-Q图
library(car)
qqPlot(lm(weight~site, data=rodent.survey),simulate=TRUE,main="Q-Q Plot",labels=FALSE)
数据全部落在95%的置信区间范围内,因此数据满足正态性假设。
2.方差齐性检验
bartlett.test (weight~site, data=rodent.survey)
p值大于0.05,说明数据满足方差齐性。
6.标注图形差异显著性
library(multcomp)
par(mar=c(5,4,6,2))
tuk <- glht(fit,linfct=mcp(site="Tukey"))
plot(cld(tuk,level=.05),col="lightgrey")
具有相同字母得为差异不显著。
7.ggplot标注图形差异显著性
site <- c("site1","site2","site3","site4","site5","site6","site7" )
mean<-c (14.85556,34.12000,33.61667,29.10000,24.63333,26.96667,26.72222)
se <- c(1.43,5.34,2.69,1.53,2.83,3.68,1.94)
df <- data.frame(site,mean,se)
label <- c("a", "b", "b", "b", "ab", "b", "b")#设置显著性“***”等是一样的
a1 <- ggplot(data=df,aes(x=site,y=mean))+geom_bar(stat="identity", color="black", position=position_dodge())+ geom_errorbar(aes(ymin=mean-se,ymax=mean+se),position = position_dodge(0.9), width = 0.3)+geom_text(aes(y = mean + 1.8 * se, label = label), position = position_dodge(0.9), size = 5,family="TNM", fontface = "bold")+scale_fill_brewer(palette = "Set1")
p1<- a1 +labs(x=NULL,y='Weight')+
theme_bw()+theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank())+
theme(axis.text.x= element_text(size=8, family="TNM", color="black", face= "bold", angle = 45,vjust=0.5, hjust=0.5))+#angle设置坐标轴标签角度
theme(axis.text.y= element_text(size=10, family="TNM", color="black", face= "bold", vjust=0.5, hjust=0.5))+
theme(axis.title= element_text(size=10, family="TNM", color="black", face= "bold", vjust=0.5, hjust=0.5))+
theme(legend.text = element_text(size=10, family="TNM", color="black", face= "bold", vjust=0.5, hjust=0.5))+
theme(legend.position = c(0.75,0.88))#(theme(legend.title = element_blank())#弃用图例标题,guides(fill=F)#隐藏图例)
#输出图片
png(file="方差分析.png",res=600,width=2000,height=2000)
p1
dev.off()