在对数据进行基础的统计分析过程中,单因素方差分析(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)

r语言计算方差贡献率(基于R语言进行单因素方差分析)(1)

由于后续数据分析的需要,将数据转换为长格式:

#转换数据 data=melt(df) colnames(data)<-c('x','y')

r语言计算方差贡献率(基于R语言进行单因素方差分析)(2)

单因素方差分析

基于aov()函数进行方差分析:

aov.manu <- aov(y ~ x, data=data) summary(aov.manu)

r语言计算方差贡献率(基于R语言进行单因素方差分析)(3)

主效应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))

r语言计算方差贡献率(基于R语言进行单因素方差分析)(4)

从箱线图来看,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()

r语言计算方差贡献率(基于R语言进行单因素方差分析)(5)

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)

r语言计算方差贡献率(基于R语言进行单因素方差分析)(6)

#p值为3.155e-06,说明在0.05水平下极显著, 说明四组有显著差异。

#多重比较——进行两两t检验并不使用合并的标准差估计, 使用Holm方法进行p值调整以控制总错误率:

with(data, pairwise.t.test(y, x, pool.sd=FALSE, p.adjust.method="holm"))

r语言计算方差贡献率(基于R语言进行单因素方差分析)(7)

#在0.05水平下, A和D、B和C没有显著差异,A与B、C均有显著差异,B及C和D有显著差异,这与之前箱线图显示结果也一致;

非参数方差分析

#如果各组的因变量(指标)分布严重偏离正态, 则单因素方差分析所依据的F检验会有很大的误差,这时可以使用非参数方法,Kruskal-Wallis检验就是独立两样本比较的Wilcoxon秩和检验的推广。

kruskal.test(y ~ x, data=data)

r语言计算方差贡献率(基于R语言进行单因素方差分析)(8)

#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

,