方差分析(Analysis of Variance, ANOVA)于1918年由Ronald Fisher(也是F分布的提出者)提出,用于比较多组样本的均值是否存在显著差异,是t检验的拓展。本篇来介绍单因素方差分析,目录如下:

  • 1 单因素方差分析
  • 1.1 学生t检验和Welch t检验
  • 1.2 单因素方差分析
  • 1.3 aov函数
  • 1.4 单因素方差分析与t检验的关系
  • 1.5 oneway.test函数
  • 1.6 方差分析与线性回归的关系

1 单因素方差分析

在单因素方差分析(One-way ANOVA)里,只有一个分组变量。

通过推文t检验和F检验,我们知道t检验也可以检验组间样本均值的差异,但它最多允许样本分为两组。比如根据性别(分组变量)可以将人群分为男、女两类,使用t检验(独立样本t检验)可以检验不同性别在某变量(如身高)上是否存在显著性差异。而组别如果在三个及以上,t检验就不适用了,比如根据种族(分组变量)可以将人群分为黄色、白色、黑色、棕色人种。

  • 注意,这里样本虽然被分为多个组别,但分组变量只有一个(性别、种族)。

1.1 学生t检验和Welch t检验

推文t检验和F检验已经介绍过t检验了,这里针对独立样本t检验再加以补充。参考资料[1]:https://www.statology.org/welchs-t-test/。

由William Sealy Gosset(笔名Student,t分布的提出者)提出的t检验称为学生t检验(Student’s t-test)。它假设两组样本的总体方差相同,在此基础上检验总体均值是否存在显著性差异。它的t统计量的计算公式为:

自由度为,即。

由B. L. Welch改进的t检验称为Welch t检验(Welch's t-test)[2]。它不需要假设两组样本的总体方差相等。它的t统计量的计算公式为:

自由度为。

  • 当两组的样本数相同时(),两种t统计量相等;
  • 关于总体方差是否具有显著性差异,可以使用F检验,详见推文t检验和F检验;
  • 相比之下,Welch t检验更具有一般性,因此是t检验的默认形式[3]t.test()函数的var.equal参数的默认值就是FALSE。

例1

set.seed(1112)
x = rnorm(30, 5, sd = 0.1) 
y = rnorm(30, 5.2, sd = 0.1) 

## 默认形式(Welch's t-test)
t.test(x, y)
##  Welch Two Sample t-test
## 
## data:  x and y
## t = -5.8794, df = 55.926, p-value = 2.396e-07
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.2257523 -0.1110069
## sample estimates:
## mean of x mean of y 
##  5.017888  5.186268

## 总体方差相等(Student’s t-test)
t.test(x, y, var.equal = T) 
## data:  x and y
## t = -5.8794, df = 58, p-value = 2.153e-07
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.2257070 -0.1110522
## sample estimates:
## mean of x mean of y 
##  5.017888  5.186268  

## 手动计算t统计量
(mean(x) - mean(y))/sqrt(29*(var(x) + var(y))/58*(2/30))  
## [1] -5.87936
(mean(x) - mean(y))/sqrt((var(x)+var(y))/30)
## [1] -5.87936
  • 当两组的样本数相同时()时,两种情况的t统计量相等;
  • 两种情况的自由度df和值p-value不同。

1.2 单因素方差分析

假设分组变量将个样本分为组,使用表示分组标识()。方差分析认为样本之间的差异来自两个方面,一个是组间差异,另一个是组内差异。

组间离差平方和():

  • 表示第组的样本均值,表示所有样本的均值;
  • 的自由度为。

组内离差平方和():

  • 表示样本值,表示第组的样本均值;
  • 的自由度为。

总离差平方和():

  • 自由度为。

方差分析也要求各组样本的总体方差相同,在此基础上使用如下统计量检验各组样本的总体均值是否具有显著性差异:

在零假设(各组样本的总体均值没有显著性差异)下,上述统计量服从F分布。

1.3 aov函数

stats工具包中,可以使用aov()函数进行方差分析。它的语法结构如下:

aov(formula, data = NULL, projections = FALSE, 
    qr = TRUE, contrasts = NULL, ...)

例2

aov()函数所需要的数据结构与t.test()不同,应为包含样本取值变量和分组变量的数据框:

data = data.frame(
  value = c(x, y),
  group = c(rep(1, 30), rep(2, 30))) 
data
##       value group
## 1  5.078769     1
## 2  4.957798     1
## ...
## 30 5.165296     1
## 31 5.267878     2
## 32 5.188655     2
## ...
## 60 5.247890     2

aov.fit <- aov(value ~ group, data = data)
summary(aov.fit) 
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## group        1 0.4253  0.4253   34.57 2.15e-07 ***
## Residuals   58 0.7136  0.0123                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • 可以看出,方差分析的Pr(>F)与例1中的学生t检验的p-value相同;
  • group行对应的是组间分析结果,Residuals对应的是组内分析结果;Df为自由度,Sum Sq为离差平方和,Mean Sq表示离差均值(等于离差平方和除以自由度)。

例3

当分组数在三个及以上时,t检验不再适用,但仍然可以使用方差分析:

sleep
##    extra group ID
## 1    0.7     1  1
## 2   -1.6     1  2
## 3   -0.2     1  3
## 4   -1.2     1  4
## ...
## 20   3.4     2 10

summary(aov(extra ~ ID, data = sleep))
##             Df Sum Sq Mean Sq F value Pr(>F)  
## ID           9  58.08   6.453   3.345 0.0368 *
## Residuals   10  19.29   1.929                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

1.4 单因素方差分析与t检验的关系

单因素方差分析是t检验的拓展,它们都可以用于检验两组样本的均值是否存在显著差异。从前面的例子也可以看到,方差分析和学生t检验计算的p值完全相同。

其实从理论上看,t分布和F检验也存在内在联系:假设服从t分布,那么就服从F分布。下面推导学生t统计量和方差分析的F统计量之间存在平方关系。

对于的情况,所有样本的均值与两组样本均值的关系如下:

因此,组间平方和: