R语言基础 | 方差分析(3):多因素方差分析(下)


专注系列化高质量的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:方差分析类型;II2表示II型方差分析,III3表示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.798.25293.01
I:
gear+cyl
349.79483.24293.01
II:
cyl+gear
349.798.25293.01
II:
gear+cyl
349.798.25293.01
III:
cyl+gear
349.798.25293.01
III:
gear+cyl
349.798.25293.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型方差分析中相同;

  • 参与交互的主效应变量(如cylgear)在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
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值