在对数据进行基础的统计分析过程中,单因素方差分析(one-way analysis of variance)是比较常用的一种分析手段,一般我们要比较试验观测值的某个因变量(称为“指标”)按照一个分组变量(称为“因素”)分组后, 各组的因变量均值有无显著差异。今天,小编给大家展示的内容就是如何基于R语言进行单因素方差分析。
R包加载及数据加载
rm(list=ls())#clear Global Environment
setwd('D:\\桌面\\单因素方差分析')#设置工作路径
#加载包
library(ggplot2)
library(reshape)
library(ggpubr)
#读取数据
df <- read.table(file="data.txt",sep="\t",header=T,check.names=FALSE)
由于后续数据分析的需要,将数据转换为长格式:
#转换数据
data=melt(df)
colnames(data)<-c('x','y')
单因素方差分析
基于aov()函数进行方差分析:
aov.manu <- aov(y ~ x, data=data)
summary(aov.manu)
主效应x(分组)的F检验的p值为1.26e-07, 检验水平为0.05情况下则分组效应显著, 各组之间有显著差异。基于箱线图进行初步展示
ggplot(data,aes(x=x,y=y))
stat_boxplot(geom = "errorbar", width=0.1)
geom_boxplot(aes(fill=x),
outlier.colour="white")
theme(panel.background=element_blank(),
axis.line=element_line(),
legend.position="none")
scale_fill_manual(values=c("#ffc000","#80c97f","#a68dc8","red"))
geom_jitter(width=0.2)
geom_signif(comparisons = list(c("A","B"),c("A","C"),c("A","D"),c("B","C"),c("B","D"),c("C","D")),
map_signif_level=TRUE,
test = t.test, y_position = c(200,205,210,215,220,225))
从箱线图来看,A组和D组之间以及B组和C组之间没有显著差异, A组与B组、C组之间均有显著差异,B组和C组与D组之间有显著差异。
多重比较为了找到各组两两之间是否有显著差异,可以进行两两的独立两样本t检验,但这样不能利用共同的模型参数,进行多次重复检验也会使得总第一类错误概率变得比较高, 发生过度拟合。为此,可以进行一些调整, 使得报告的检验p值能够控制总第一类错误概率。multcomp包的glht()函数可以对方差分析结果进行多重比较并控制总错误率,一种方法是利用Tukey的HSD(Honest Significant Difference)方法, 程序如下:
library(multcomp, quietly=TRUE)
glht(aov.manu, linfct = mcp(x = "Tukey")) |>
summary()
Tukey HSD检验的结果显示在0.05水平下, A和D,B和C没有显著差异, A与B、C均有显著差异,B及C和D有显著差异,这与之前箱线图显示结果一致;
方差不相等情形#方差分析模型要求误差项独立同正态分布,这意味着各组的因变量方差相等。
#实际中不同组的因变量可能有不同的方差。
#R中oneway.test()函数可以不要求方差相等,是一种独立两样本t检验的Welch方法推广。
oneway.test(y ~ x, data=data)
#p值为3.155e-06,说明在0.05水平下极显著, 说明四组有显著差异。
#多重比较——进行两两t检验并不使用合并的标准差估计, 使用Holm方法进行p值调整以控制总错误率:
with(data,
pairwise.t.test(y, x, pool.sd=FALSE,
p.adjust.method="holm"))
#在0.05水平下, A和D、B和C没有显著差异,A与B、C均有显著差异,B及C和D有显著差异,这与之前箱线图显示结果也一致;
非参数方差分析#如果各组的因变量(指标)分布严重偏离正态, 则单因素方差分析所依据的F检验会有很大的误差,这时可以使用非参数方法,Kruskal-Wallis检验就是独立两样本比较的Wilcoxon秩和检验的推广。
kruskal.test(y ~ x, data=data)
#Kruskal-Wallis检验p值为0.002,所以在0.05水平下拒绝原假设,认为各组之间有显著差异。
参考:https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/stat-aov.html#stat-aov-1w-multc
,