专注系列化、高质量的R语言教程
本篇接上篇继续介绍多因素方差分析。目录如下:
2 多因素方差分析
2.6 TukeyHSD函数
2.7 anova函数
2.8 不含交互项的II型和III型方差分析
2.9 含交互项的II型和III型方差分析
2 多因素方差分析
2.6 TukeyHSD函数
方差分析使用F统计量检验各组样本均值是否存在显著差异:当分组数在三组以上时,只要任意两组样本均值存在显著差异,F统计量就具有显著性。方差分析不会直接反映两两比较的结果。
stats
工具包中的TukeyHSD()
函数可以根据方差分析的结果进行两两比较,语法结构如下:
TukeyHSD(x, which, ordered = FALSE,
conf.level = 0.95, ...)
x:方差分析模型;
which:分组变量。
例2.7:示例来自函数帮助文档
fm <- aov(breaks ~ wool + tension, data = warpbreaks)
summary(fm)
## Df Sum Sq Mean Sq F value Pr(>F)
## wool 1 451 450.7 3.339 0.07361 .
## tension 2 2034 1017.1 7.537 0.00138 **
## Residuals 50 6748 135.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
levels(warpbreaks$tension)
## [1] "L" "M" "H"
TukeyHSD(fm, "tension", ordered = TRUE)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
## factor levels have been ordered
##
## Fit: aov(formula = breaks ~ wool + tension, data = warpbreaks)
##
## $tension
## diff lwr upr p adj
## M-H 4.722222 -4.6311985 14.07564 0.4474210
## L-H 14.722222 5.3688015 24.07564 0.0011218
## L-M 10.000000 0.6465793 19.35342 0.0336262
方差分析结果显示,根据
tension
变量分组的样本均值在95%置信水平下存在显著性差异;使用
TukeyHSD()
函数输出tension
变量三个水平("L"、"M"、"H")对应样本均值的两两比较结果;结果显示在95%置信水平下,M和H组的样本均值不存在显著性差异,L和H组、L和M组存在显著性差异。
2.7 anova函数
anova()
函数用来计算回归模型的方差分析表,语法结构如下:
anova(object, ...)
object
:模型对象;
...
:模型对象。
例2.8:单个模型的方差分析表
fm1 <- lm(breaks ~ wool, data = warpbreaks)
anova(fm1)
## Analysis of Variance Table
##
## Response: breaks
## Df Sum Sq Mean Sq F value Pr(>F)
## wool 1 450.7 450.67 2.6684 0.1084
## Residuals 52 8782.1 168.89
上述结果与
aov(breaks ~ wool, data = warpbreaks)
的结果完全一致。
例2.9:多个模型的方差分析表
fm2 <- lm(breaks ~ wool + tension, data = warpbreaks)
anova(fm1, fm2)
## Analysis of Variance Table
##
## Model 1: breaks ~ wool
## Model 2: breaks ~ wool + tension
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 52 8782.1
## 2 50 6747.9 2 2034.3 7.5367 0.001378 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
输出结果每行依次表示各个模型;
前两列表示每个模型的残差自由度(
Res.Df
)和残差平方和(RSS
);后四列表示上一行模型与本行模型的残差自由度之差(
Df
)、残差平方和之差(Sum of Sq
)及其F统计量(F
)、显著性水平(Pr(>F)
)。
在上面例子中,第2行模型之所以比第1行模型的残差平方和更小,是因为它多了个分组变量,减少的残差平方和就是这个分组变量对应的离差平方和。下面的方差分析结果表明了这一点:
aov(breaks ~ wool + tension, data = warpbreaks)
## Terms:
## wool tension Residuals
## Sum of Squares 450.667 2034.259 6747.889
## Deg. of Freedom 1 2 50
方差分析表可以作为模型比较的参考依据。若F统计量具有显著性,说明残差平方和较小的模型更优。
2.8 不含交互项的II型和III型方差分析
加载示例数据mpg
:
library(dplyr)
mpg <- mtcars %>%
select(mpg, cyl, gear, carb) %>%
mutate(cyl = factor(cyl),
gear = factor(gear),
carb = factor(carb))
前篇已经介绍,aov()
函数执行的是I型方差分析。II型和III型方差分析可以使用car
工具包中Anova()
函数(首字母大写)运行。语法结构如下:
Anova(mod, error, type = c("II","III", 2, 3),
vcov.=NULL, singular.ok, ...)
Anova()
函数的使用方法与模型对象只有一个的anova()
函数类似:
mod
:模型对象;
type
:方差分析类型;II
和2
表示II型方差分析,III
和3
表示III型方差分析。
例2.10:比较如下I、II、III型方差分析的结果
## I型
aov(mpg ~ cyl + gear, mpg)
aov(mpg ~ gear + cyl, mpg)
lfit1 <- lm(mpg ~ cyl + gear, mpg)
lfit2 <- lm(mpg ~ gear + cyl, mpg)
library(car)
## II型
Anova(lfit1, type = 2)
Anova(lfit2, type = 2)
## III型
Anova(lfit1, type = 3)
Anova(lfit2, type = 3)
分为方便比较,将结果汇总成如下表:
模型形式 | SS(cyl) | SS(gear) | SS(Residuals) |
---|---|---|---|
I: cyl+gear | 824.79 | 8.25 | 293.01 |
I: gear+cyl | 349.79 | 483.24 | 293.01 |
II: cyl+gear | 349.79 | 8.25 | 293.01 |
II: gear+cyl | 349.79 | 8.25 | 293.01 |
III: cyl+gear | 349.79 | 8.25 | 293.01 |
III: gear+cyl | 349.79 | 8.25 | 293.01 |
有如下结论:
在没有交互项的情况下,II型和III型方差分析的结果完全一致;
II型和III型方差分析的结果与分组变量顺序无关;
分组变量在I型方差分析中靠后时的离差平方和,就是它在II型和III型方差分析中的离差平方和;
II型和III型方差分析的组间和组内离差平方和之和不等于总离差平方和。
基于以上结论,可以使用如下两种方法“手动”计算II型和III型方差分析的离差平方和。
第一种方法就是直接取该变量在I型方差分析中顺序靠后时的结果,示例结果见上表。
第二种方法是分别建立全变量线性回归和只缺少该变量的线性回归,二者残差平方和之差即该变量在II型和III型方差分析中的离差平方和。
例2.11:以gear
变量为例
lm1 <- lm(mpg ~ cyl, mpg)
lm2 <- lm(mpg ~ cyl + gear, mpg)
## 计算残差平方和也有多种方法
sum(residuals(lm1)^2) - sum(residuals(lm2)^2)
## [1] 8.251855
sum((fitted(lm2) - mean(mpg$mpg))^2) - sum((fitted(lm1) - mean(mpg$mpg))^2)
## [1] 8.251855
anova(lm1, lm2)
## Analysis of Variance Table
##
## Model 1: mpg ~ cyl
## Model 2: mpg ~ cyl + gear
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 29 301.26
## 2 27 293.01 2 8.2519 0.3802 0.6873
2.9 含交互项的II型和III型方差分析
在含有交互项时,II型和III型方差分析的结果不完全一致。
例2.12:运行如下例子
fit <- lm(mpg ~ cyl*gear + carb, mpg)
Anova(fit, type = 2)
## Anova Table (Type II tests)
##
## Response: mpg
## Sum Sq Df F value Pr(>F)
## cyl 13.200 2 0.7370 0.49110
## gear 66.158 2 3.6938 0.04313 *
## carb 90.017 4 2.5130 0.07405 .
## cyl:gear 25.388 2 1.4175 0.26564
## Residuals 179.103 20
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(fit, type = 3, singular.ok = T)
## Anova Table (Type III tests)
##
## Response: mpg
## Sum Sq Df F values Pr(>F)
## cyl 3.298 2 0.1841 0.83321
## gear 62.078 2 3.4661 0.05100 .
## carb 90.017 4 2.5130 0.07405 .
## cyl:gear 25.388 2 1.4175 0.26564
## Residuals 179.103 20
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
有如下结论:
交互项(如
cyl:gear
)和不参与交互的变量(如carb
)的离差平方和在II型和III型方差分析中相同;参与交互的主效应变量(如
cyl
、gear
)在II型和III型方差分析中不同。
通过2.9节中的两种方法可以计算交互项和非交互变量的离差平方和。
例2.13:第一种方法
## 将交互项放在最后
aov(terms(mpg ~ carb + cyl*gear, keep.order = T), mpg)
## Terms:
## carb cyl gear cyl:gear Residuals
## Sum of Squares 500.5610 354.8374 66.1579 25.3878 179.1030
## Deg. of Freedom 5 2 2 2 20
## 将carb放在最后
aov(terms(mpg ~ cyl*gear + carb, keep.order = T), mpg)
## Terms:
## cyl gear cyl:gear carb Residuals
## Sum of Squares 824.7846 8.2519 23.8907 90.0170 179.1030
## Deg. of Freedom 2 2 3 4 20
例2.14:第二种方法
## 全模型
fit0 <- lm(mpg ~ cyl*gear + carb, mpg)
## 不含交互项
fit1 <- lm(mpg ~ cyl + gear + carb, mpg)
## 不含carb变量
fit2 <- lm(mpg ~ cyl*gear, mpg)
sum(residuals(fit1)^2) - sum(residuals(fit0)^2)
## [1] 25.38784
sum(residuals(fit2)^2) - sum(residuals(fit0)^2)
## [1] 90.017
参与交互项的主效应变量在II型和III型中不同。
II型方差分析的主效应变量的离差平方和等于把它放在交互项之前、其他变量之后时的I型方差分析。
从下面I型方差分析的输出结果可以看出,除交互项外,gear
变量的离差平方和也与II型方差分析相同,因为此时gear
变量的位置是在交互项之前、其他变量之后。
aov(terms(mpg ~ carb + cyl*gear, keep.order = T), mpg)
## Terms:
## carb cyl gear cyl:gear Residuals
## Sum of Squares 500.5610 354.8374 66.1579 25.3878 179.1030
## Deg. of Freedom 5 2 2 2 20
同理,下面I型方差分析中的cyl
变量的离差平方和与II型方差分析相同:
aov(terms(mpg ~ carb + gear*cyl, keep.order = T), mpg)
## Terms:
## carb gear cyl gear:cyl Residuals
## Sum of Squares 500.5610 407.7953 13.2000 25.3878 179.1030
## Deg. of Freedom 5 2 2 2 20
III型方差分析的主效应变量的离差平方和等于它放在其他变量和交互项变量之后时的I型方差分析。
例2.15:以gear
变量为例,下面代码可“手动”计算它在III型方差分析中的离差平方和
mpg$cg <- mpg$cyl:mpg$gear
levels(mpg$cg)
## [1] "4:3" "4:4" "4:5" "6:3" "6:4" "6:5" "8:3" "8:4" "8:5"
mpg$cg <- factor(mpg$cg, levels = levels(mpg$cg),
labels = c(0,0,0, levels(mpg$cg)[4:9]))
levels(mpg$cg)
## [1] "0" "6:3" "6:4" "6:5" "8:3" "8:4" "8:5"
fit3 <- lm(mpg ~ cg + carb, mpg)
sum(residuals(fit3)^2) - sum(residuals(fit0)^2)
## [1] 62.078