方差分析(ANOVA)与缺失值处理

第四次生物统计学助教课的备课笔记。

本文为生统助教课备课过程的一些记录,主要涉及单因素方差分析(one-way ANOVA)、双因素方差分析(two-way ANOVA)的基本概念与计算方法,以及缺失值处理的相关知识点。

一张图展示本文知识大纲:

image.png

一、单因素方差分析

  • ANOVA回答的问题:对多个组的平均值进行检验,判断所有组的平均值是否相同,或者至少其中一个平均值与其他组不同。
    • 检验对象:多组样本所对应的群体均值是否相等,观察到的各组样本平均值之间的差异是否归因于随机抽样误差。
  • ANOVA分析基本假设:样本是从正态分布群体中随机抽取的,并且相互独立,方差相等。
  • ANOVA的原始假设与备择假设:
    • H0: 多个样本之间的population mean相同。(观测数据中的差异是由抽样误差造成,如下图左图)
    • H1: 多个样本之间的population mean中,至少有一个与其他的不同。(观测数据中的差异就是实际差异,如下图右图)

image.png

虽然我们比较的是各组之间的平均值,但是很显然组内方差和组间方差更适合我们去做这样的判断。因此,ANOVA的检验思路就是将所有样本的总方差分解为组内方差和组间方差,并进行比较(如下图)。若组间差异远小于组内差异,则认为组间均值无显著差异(接受H0);否则,拒绝H0,认为至少一组样本的均值与其他的不同(接受H1)

image.png

因此,ANOVA检验就是对两个不同的方差进行检验,这里涉及F检验的相关知识。如下图是F分布的相关知识点,放在这里帮助我们复习一下F检验的数学原理。

image.png

对于ANOVA来说,其检验统计量的计算方法为 $F=between MS/within MS$ , 即组间方差比上组内方差。零假设下,组间均方除以组内均方应该服从F分布。

  • 若H0为真(没有组间差异),则组间方差估计量(Between MS)和组内方差估计量(Within MS)其实是同一个总体方差σ²的两种估计,各自都(在零假设下)分别服从自由度不同的卡方分布:
    • 组间均方(MSBetween) $= SS_{Between}/(k-1) \sim χ^2(k-1)$
    • 组内均方(MSWithin) $= SS_{Within}/(n-k) ~ χ^2(n-k)$
    • 其中 $n$ 为总样本量 , $k$ 为组数。
    • 二者的比值就是两自由度独立卡方分布单元归一后的比值,这正是F分布的定义。
  • 因此,ANOVA的检验统计量可以使用这一公式进行计算: $F=MS_{Between}/MS_{Within} \sim F(k-1,n-k)$
    • 其中 $n$ 为总样本量 , $k$ 为组数。

image.png

one-way ANOVA的检验方法(step-by-step)

如下图。

image.png

下面我们以一个具体的问题为例,展示一下如何进行ANOVA分析。如下表所示,科学家测试了四种抗生素对某种细菌的抑菌效果,每一种抗生素进行了6组平行实验,请问根据表格中的数据,是否至少有一组抗生素的抑菌效果与其他各组显著不同?

antibiotic data
Penicillin 29.6 , 24.3 , 28.5 , 32 , 26.1 , 31
Tetracycline 27.3 , 32.6 , 30.8 , 34.8 , 29.4 , 33.1
Erythromycin 21.6 , 17.4 , 18.3 , 19 , 19.5 , 18
Chloramphenicol 29.2 , 32.8 , 25 , 24.2 , 26.6 , 28.9

首先是空假设和备择假设: H0:所有组别的抑菌效果都一样;H1:至少有一组抗生素的抑菌效果与其他各组显著不同。

首先,我们对这四组数据进行正态性检验,发现这几组数据都符合正态性的假设(过程略)。接下来,我们可以分布计算出下面的这些统计量:

group n average variance
Penicillin 6 28.58333 8.613667
Tetracycline 6 31.33333 7.406667
Erythromycin 6 18.96667 2.210667
Chloramphenicol 6 27.78333 10.08167
total 24 26.66667 28.58667

我们进一步可以求出:

$$
\begin{aligned}
SS_{total} &= \sum\sum(x_{ij}-\bar{\bar x})^2 &= 657.4933 \\
SS_{between} &= \sum\sum(x_j-\bar{\bar x})^2 &= 515.9300 \\
SS_{within} &= \sum\sum(x_{ij}-\bar{x_j})^2 &= 141.5633
\end{aligned}
$$

其中,有关系式 $SS_{total}=SS_{between}+SS_{within}$ ,我们可以基于这个关系式检验我们的计算结果。

我们的数据总共有4组,因此k=4。每一组有6个平行重复,因此n=24,因此我们可以进一步求得:

$$
\begin{aligned}
df_1 &= k-1 \\
&= 3 \\
df_2 &= n-k \\
&= 20 \\
F &= \frac{SS_{between}/df_1}{SS_{within}/df_2} \\
&= \frac{515.9300/3}{141.5633/20} \\
&\approx 24.29679 \\
\end{aligned}
$$

查表得,在显著性水平 $\alpha=0.05$, 自由度 df1=3 且 df2=20 的情况下,F统计量的边界值为 $3.098 < 24.29679$ ,因此我们拒接H0,接受H1,认为至少一组抗生素的抑菌效果与其他各组显著不同(经过事后检验,我们可以发现是红霉素Erythromycin的抗菌效果显著低于另外三种抗生素)。

事后检验(Post-hoc test)

在R语言中,有两种事后检验方法的函数接口,分别是 Pairwise.t.test()TukeyHSD() ,前者传入原始数据的dataframe,后者则传入 aov() 函数的返回值。

image.png

非参数检验

上面列举的one-way ANOVA检验方法,是建立在数据符合正态性假设的前提下的,如果数据不符合正态性,则需要使用非参数方法,其中R语言里提供的函数接口是 kruskal.test() ,这是一种从wilcox秩和检验发展而来的检验方法,通过检验不同分组之间的中位数是否相同而获得结果。

下图是一张总结,展示了对于多组数据的检验中,如何选择合适的检验方法,以及进行事后检验。

image.png

二、双因素方差分析

带有重复的双因素方差分析

two-way ANOVA分为带有重复的(Two-way ANOVA with replications)和不带重复的(Two-way ANOVA without replications)。二者的区别在于,带有重复的ANOVA需要考虑双因子之间的互作,而不带重复的则不需要考虑互作。

下图是one-way ANOVA与Two-way ANOVA with replications的比较。

image.png

Two-way ANOVA的数学原理也涉及对方差的分解与检验,注意这里需要计算三个检验统计量 $F_{A}$, $F_{B}$, $F_{AB}$, 分别用于检验因子A、B各自的效应,以及A与B互作的效应。

image.png

image.png

在R语言中,Two-way ANOVA的函数接口依然是 aov() ,需要注意如果要求带互作的ANOVA,则传入参数中两个因子之间的连接符需要使用星号 * ,如果不考虑互作,则使用 +

  • 考虑因子A与因子B的互作: aov(Y~A*B,data) , 等价于 aov(Y~A+B+A:B,data) ,其中 A:B 表示因子A与因子B的互作效应。
  • 不考虑互作:aov(Y~A+B,data)

image.png

交互作用的可视化

这一块并非上课重点,因此仅通过PPT列出相关函数接口以及使用效果,供参考。

image.png

image.png

image.png

不带重复的双因素方差分析

如下图。Two-way ANOVA without replications不考虑互作,因此检验统计量只有两个, $F_{A}$ 和 $F_{B}$ ,分别检验因子A和因子B各自的效果,不检验二者的互作效果。

image.png

三、缺失值处理

这一块也不算课题重点,因此仅以一张PPT作为总结:

image.png

以上。