方差分析(ANOVA)的基本原理及R实现(单因素)

方差分析(analysis of variance,ANOVA)几乎是在统计学分析中最常用的方法,通过分析各变量主效应(main effect)和交互效应(interaction effect),从而发现因变量(dependent variable)的变异源。另外,通过配合使用多重比较的检验方法,其也常用于比较不同处理导致的因变量的差异。

一、基本原理

假设我们实验获得了这样的一组数据:通过对研究对象(各实验单位)进行不同处理(控制各变量的水平),导致实验对象的某一指标(因变量)在实验单位间出现差异。同时,为了更好的探讨差异的来源,同时提高结果的可靠性,同样的处理我们做了多次重复(一般要大于3)。

1、数学模型

这样就可以将数据的变异划分为组内变异和组间变异,组内变异即各实验重复间的差异,由于随机误差导致。组间变异即各处理组之间的差异,由随机误差和处理效应导致。方差分析的基本思路就是将变异分解为组间变异和组内变异差异的大小(服从 F F F分布),并使用 F F F检验来比较二者差异的显著性。

设实验一共有 k \red{k} k个处理,每个处理有 n \red{n} n个重复,因此第 i \red{i} i个处理的第 j \red{j} j次重复的观测表示为 x i j \red{x_{ij}} xij,且有 μ \mu μ总体平均数 μ = ∑ μ i k \mu=\frac{\sum\mu_{i}}{k} μ=kμi k k k为处理数, μ i \mu_{i} μi为各处理组的均值), α i \alpha_{i} αi处理效应(样本为总体时, ∑ α i = 0 \sum\alpha_{i}=0 αi=0), ε i j \varepsilon_{ij} εij随机误差(相互独立且 ε \varepsilon ε~ N ( o , σ 2 ) N(o,\sigma^{2}) N(o,σ2)),则观测与变异间的关系可表示为:
x i j = μ + α i + ε i j x_{ij}=\mu+\alpha_{i}+\varepsilon_{ij} xij=μ+αi+εij
使用样本统计数表示就是:
x i j = x ‾ + α i + e i j   ,   e i j :样本随机误差 x_{ij}=\overline{x}+\alpha_{i}+e_{ij}~,~e_{ij:\text{样本随机误差}} xij=x+αi+eij , eij样本随机误差

2、方差分解

在方差分析中,通常使用方差 s 2 s^{2} s2来表征数据的变异,而方差通过平方和自由度来计算:
S 2 = ∑ ( x i − x ‾ ) d f S^{2}=\frac{\sum(x_{i}-\overline x)}{df} S2=df(xix)
所以,将总变异分解为组间变异组内变异实质上就是分解平方和自由度

(1)平方和的分解

沿用上述的例子,则总变异的平方和 S S T \red{SS_{T}} SST为:

S S T = ∑ i = 1 k ∑ j = 1 n ( x i j − x ‾ ) 2 SS_{T}= \sum_{i=1}^{k} \sum_{j=1}^{n} (x_{ij}-\overline x)^2 SST=i=1kj=1n(xijx)2

化简得:

S S T = ∑ i = 1 k ∑ j = 1 n ( x ‾ i − x ‾ ) 2 + ∑ i = 1 k ∑ j = 1 n ( x i j − x ‾ i ) 2 SS_{T}= \sum_{i=1}^{k} \sum_{j=1}^{n} (\overline x_{i}-\overline x)^2+ \sum_{i=1}^{k} \sum_{j=1}^{n} (x_{ij}-\overline x_{i})^2 SST=i=1kj=1n(xix)2+i=1kj=1n(xijxi)2

可以看出组间平方和 S S t \red{SS_t} SSt(处理平方和)为:

S S t = ∑ i = 1 k ∑ j = 1 n ( x ‾ i − x ‾ ) 2 = n ∑ i = 1 k ( x ‾ i − x ‾ ) 2 \begin{aligned} SS_t &=\sum_{i=1}^{k} \sum_{j=1}^{n} (\overline x_{i}-\overline x)^2\\ &=n\sum_{i=1}^{k} (\overline x_{i}-\overline x)^2 \end{aligned} SSt=i=1kj=1n(xix)2=ni=1k(xix)2

组内平方和 S S e \red{SS_e} SSe(误差平方和)为:

S S e = ∑ i = 1 k ∑ j = 1 n ( x i j − x ‾ i ) 2 SS_e= \sum_{i=1}^{k} \sum_{j=1}^{n} (x_{ij}-\overline x_{i})^2 SSe=i=1kj=1n(xijxi)2

也有 快速计算 \red{快速计算} 快速计算的公式:
{ C = T 2 / ( k n ) S S T = ∑ ∑ x i j 2 − C S S t = ∑ ( T i 2 / n ) − C S S e = S S T − S S t \begin{cases} C&=T^{2}/(kn)\\ SS_T&=\sum\sum x^{2}_{ij}-C\\ SS_t&=\sum(T^2_{i}/n)-C\\ SS_e&=SS_T-SS_t \end{cases} CSSTSStSSe=T2/(kn)=∑∑xij2C=(Ti2/n)C=SSTSSt

(2)自由度的分解

在计算方差的时候,各方差的自由度受对应的平方和的约束,所以可以分别得出总自由度、处理自由度和误差自由度:

总自由度 d f T \red{df_{T}} dfT

d f T = k n − 1 df_T=kn-1 dfT=kn1

处理自由度 d f t \red{df_t} dft:

d f t = k − 1 df_{t}=k-1 dft=k1

误差自由度 d f e \red{df_e} dfe

d f e = k ( n − 1 ) df_e=k(n-1) dfe=k(n1)

(3)方差和 F F F统计量

所以通过上述推导可得分解后得自由度和平方和,并以此计算方差(方差分析中表示为 M S \red{MS} MS,即均方):

{ 处理均方: M S t = S S t / d f t 误差均方: M S e = S S e / d f e \begin{cases} 处理均方:\red{MS_t}=SS_t/df_t\\ 误差均方:\red{MS_e}=SS_e/df_e \end{cases} {处理均方:MSt=SSt/dft误差均方:MSe=SSe/dfe

因此, F F F统计量为:

F = M S t M S e \red{F}= \frac{MS_t}{MS_e} F=MSeMSt

通过 F F F统计量即可确定处理效应是否显著( F > F 0.05 F>F_{0.05} F>F0.05)。

3、多重比较

在确定处理均方(处理效应)是否显著后,即可通过多重比较检验各处理组别间差异的显著性。主要的检验方法可大致分为两类:最小显著差数法最小显著极差法。常用的方法如下:
多重比较 { 最小显著差数法 { L S D  test Sidak test Bonferroni test 特点:差数标准固定 最小显著极差法 { Tukey test S-N-K test Tukey’s-b test Duncan test 特点:差数标准随秩次变化 多重比较 \begin{cases} &\text{最小显著差数法} \begin{cases} &LSD~\text{test}\\ &\text{Sidak~test}\\ &\text{Bonferroni~test} \end{cases} 特点:差数标准固定\\ &\text{最小显著极差法} \begin{cases} &\text{Tukey~test}\\ &\text{S-N-K~test}\\ &\text{Tukey's-b~test}\\ &\text{Duncan~test} \end{cases} 特点:差数标准随秩次变化 \end{cases} 多重比较 最小显著差数法 LSD testSidak testBonferroni test特点:差数标准固定最小显著极差法 Tukey testS-N-K testTukey’s-b testDuncan test特点:差数标准随秩次变化

4、方差分析表

为了更好的解读方差分析结果,有必要按特定的规范书写方差分析,一般方差分析的结果可表示为:
变异源 S S d f M S F 处理效应 S S t = ∑ ( T i 2 / n ) − C d f t = k − 1 M S t = S S t / d f t F = M S t / M S e ∗ ∗ ∗ 随机误差 S S e = S S T − S S t d f e = k ( n − 1 ) M S e = S S e / d f e   总变异 S S T = ∑ ∑ x i j 2 − C d f T = k n − 1     \begin{array}{ccccc} 变异源 & SS & df & MS & F\\ \hline 处理效应 & SS_t=\sum(T^2_{i}/n)-C & df_{t}=k-1 & MS_t=SS_t/df_t & F=MS_t/MS_e^{***}\\ 随机误差 & SS_e=SS_T-SS_t & df_e=k(n-1) & MS_e=SS_e/df_e & ~\\ 总变异 & SS_T=\sum\sum x^{2}_{ij}-C & df_T=kn-1 & ~ & ~\\ \end{array} 变异源处理效应随机误差总变异SSSSt=(Ti2/n)CSSe=SSTSStSST=∑∑xij2Cdfdft=k1dfe=k(n1)dfT=kn1MSMSt=SSt/dftMSe=SSe/dfe FF=MSt/MSe∗∗∗  
F F F值得上标 ∗ ∗ ∗ \red{***} 表示处理效应显著性,有时也会额外加一列表示处理效应的显著性,例如R中agricolae包的结果:
在这里插入图片描述

二、R实现

1、方差分析

R中提供了很多用于方差分析得包,这里以stats包为例:

setwd("your workspace")
#加载包
library(agricolae)
#R version(4.0.5)

#读取数据
data <- read.csv("data.csv",header = T)

数据集data.csv是某一作物在不同激素浓度处理Treat k = 4 , n = 5 k=4,n=5 k=4,n=5)下对叶长Length)生长量的影响。
单因素方差分析


#描述性统计
#方差分析
fit <- aov(Length ~ Treat, data = data)
#结果
summary(fit)

输出结果如下:
在这里插入图片描述
可看出不同激素处理对叶长生长量的变化( F = 12.02 F=12.02 F=12.02)极显著( P = 0.000227 P=0.000227 P=0.000227)。

2、多重比较

使用 L S D  test LSD~\text{test} LSD testagricolae包)进行多重比较

#显著性检验(LSD检验)
var<- LSD.test(fit, "Treat")
#结果
var

输出结果如下:
在这里插入图片描述
从结果中可看出四种处理下叶长生长量大小关系为: A 1 > A 3 > A 2 > A 4 A1>A3>A2>A4 A1>A3>A2>A4,其中 A 2 A2 A2 A 3 A3 A3处理的差异并不显著。另外,结果中还列出了均值、标准差、分位数、 α \alpha α等关键信息。

3、可视化

单因素方差分析结果一般辅以箱型图来展示,可有效的提供处理效应显著性、差异显著性、数据分布等有效信息。

(1)ggplot法

ggplot系列包因为可以图层叠加,可以极大的节省后期修图的工作量,目前基本已成为R语言可视化的首选。
下列代码以ggplot2绘制箱型图,数据集仍为data.csv,最后使用ggsignif标记差异显著性
绘制箱形图

#加载ggplot2包
library(ggplot2)

#绘制箱型图
boxplot=
  ggplot(data, aes(x=Treat, y=Length, fill=Treat))+#定义图形属性
  geom_boxplot()+#以箱型图显示
  #添加图例、标题等信息
  labs(title="Effect of Hormones on Leaf Length (p<0.001)", x="Treat", y="Length")+
  theme(plot.title=element_text(hjust=0.5), 
        legend.title=element_blank())#定义主题

#查看可视化结果
boxplot

在这里插入图片描述

添加差异显著性标签

#加载ggsignif
library(ggsignif)

#添加差异显著性标签
boxplot = boxplot +
  #A1对A2
  geom_signif(comparisons = list(c(1, 2)),#处理组对比对
              y_position = 18.9,          #标签位置对应y轴的值
              tip_length = 0,             #标签竖线长度
              annotations = "P < 0.05")+  #标签文本
  #A1对A3
  geom_signif(comparisons = list(c(1, 3)),
              y_position = 15.9,          
              tip_length = 0,             
              annotations = "P < 0.05")+  
  #A1对A4
  geom_signif(comparisons = list(c(1, 4)),
              y_position = 15,          
              tip_length = 0,             
              annotations = "P < 0.05")+  
  #A3对A4
  geom_signif(comparisons = list(c(3, 4)),
              y_position = 18.5,          
              tip_length = 0,             
              annotations = "P < 0.05")+  
  #A2对A4
  geom_signif(comparisons = list(c(2, 4)),
              y_position = 18.7,         
              tip_length = 0,             
              annotations = "P < 0.05")
#查看结果
boxplot

在这里插入图片描述
可以看出,在比较组别较多的时候ggsignif包的方法得到的结果会过于复杂,违反了直观性原则。因此,也可以直接使用AI根据多重比较结果进行标记
在这里插入图片描述

(2)基础绘图法

基础绘图也提供了可视化方法,使用上述的方差分析结果fit进行多重比较(TukeyHSD test),并使用data数据集绘制均值图,涉及的包为gplots:

#加载包
library(gplots)

#绘图
par(mfcol=c(1,2))
par(las = 2)
plotmeans(data = data,
          Length ~ Treat,
          xlab = "Treatment",
          ylab = "Length",
          main = "Effect of Hormones on Leaf Length (p<0.001)")

#使用ukey HSD进行多重比较并可视化
Tukey = TukeyHSD(fit)
par(las = 2)
plot(Tukey)

在这里插入图片描述
不难看出,使用不同方法进行多重比较,获得的结果并不相同,这是因为两类检验方法在确定显著性的标准上有一定的差异。因此,在实际操作中,需要根据自己的数据集特点,选择合适的检验方法。

Ending!!!

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Odd_guy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值