9.7 多元方差分析

当因变量(结果变量)不止一个时,可用多元方差分析(MANOVA)对它们同时进行分析。以MASS包中的UScereal数据集为例[Venables,Ripley(1999)],我们将研究美国谷物中的卡路里、脂肪和糖含量是否会因为储存架位置的不同而发生变化。其中1代表底层货架,2代表中层货架,3代表顶层货架。卡路里、脂肪和糖含量是因变量,货架是三水平(1、2、3)的自变量。分析过程见代码清单9-8。

代码清单9-8 单因素多元方差分析

  1. > library(MASS)
  2. > attach(UScereal)
  3. > y <- cbind(calories, fat, sugars)
  4. > aggregate(y, by=list(shelf), FUN=mean)
  5. Group.1 calories fat sugars
  6. 1 1 119 0.662 6.3
  7. 2 2 130 1.341 12.5
  8. 3 3 180 1.945 10.9
  9. > cov(y)
  10. calories fat sugars
  11. calories 3895.2 60.67 180.38
  12. fat 60.7 2.71 4.00
  13. sugars 180.4 4.00 34.05
  14. > fit <- manova(y ~ shelf)
  15. > summary(fit)
  16. Df Pillai approx F num Df den Df Pr(>F)
  17. shelf 1 0.1959 4.9550 3 61 0.00383 **
  18. Residuals 63
  19. ---
  20. Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  21. > summary.aov(fit) # 输出单变量结果
  22. Response calories :
  23. Df Sum Sq Mean Sq F value Pr(>F)
  24. shelf 1 45313 45313 13.995 0.0003983 ***
  25. Residuals 63 203982 3238
  26. ---
  27. Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  28. Response fat :
  29. Df Sum Sq Mean Sq F value Pr(>F)
  30. shelf 1 18.421 18.421 7.476 0.008108 **
  31. Residuals 63 155.236 2.464
  32. ---
  33. Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  34. Response sugars :
  35. Df Sum Sq Mean Sq F value Pr(>F)
  36. shelf 1 183.34 183.34 5.787 0.01909 *
  37. Residuals 63 1995.87 31.68
  38. ---
  39. Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

代码清单9-8中,cbind()函数将三个因变量(卡路里、脂肪和糖)合并成一个矩阵。aggregate()函数可获取货架的各个均值,cov()则输出各谷物间的方差和协方差。

manova()函数能对组间差异进行多元检验。上面F值显著,说明三个组的营养成分测量值不同。

由于多元检验是显著的,因此可以使用summary.aov()函数对每一个变量做单因素方差分析。从上述结果可以看到,三组中每种营养成分的测量值都是不同的。另外,还可以用均值比较步骤(比如TukeyHSD)来判断对于每个因变量,哪种货架与其他货架都是不同的(此处已略去,以节省空间)。

9.7.1 评估假设检验

单因素多元方差分析有两个前提假设,一个是多元正态性,一个是方差—协方差矩阵同质性。

第一个假设即指因变量组合成的向量服从一个多元正态分布。可以用Q-Q图来检验该假设条件(参见补充内容“理论补充”对其工作原理的统计解释)。

理论补充

若有一个p*1的多元正态随机向量x,均值为μ,协方差矩阵为∑,那么x与μ的马氏距离的平方服从自由度为p的卡方分布。Q-Q图展示卡方分布的分位数,横纵坐标分别是样本量与马氏距离平方值。如果点全部落在斜率为1、截距项为0的直线上,则表明数据服从多元正态分布。

分析代码见代码清单9-9,结果见图9-11。

代码清单9-9 检验多元正态性

  1. > center <- colMeans(y)
  2. > n <- nrow(y)
  3. > p <- ncol(y)
  4. > cov <- cov(y)
  5. > d <- mahalanobis(y,center,cov)
  6. > coord <- qqplot(qchisq(ppoints(n),df=p),
  7. d, main="Q-Q Plot Assessing Multivariate Normality",
  8. ylab="Mahalanobis D2")
  9. > abline(a=0,b=1)
  10. > identify(coord$x, coord$y, labels=row.names(UScereal))

9.7 多元方差分析 - 图1

图9-11 检验多元正态性的Q-Q图

若数据服从多元正态分布,那么点将落在直线上。你能通过identify()函数(参见16.4节)交互性地对图中的点进行鉴别。从图形上看,观测点“Wheaties Honey Gold”和“Wheaties”异常,数据集似乎违反了多元正态性。可以删除这两个点再重新分析。

方差—协方差矩阵同质性即指各组的协方差矩阵相同,通常可用Box's M检验来评估该假设。由于R中没有Box's M函数,可以通过网络搜索找到合适的代码。另外,该检验对正态性假设很敏感,会导致在大部分案例中直接拒绝同质性假设。也就是说,对于这个重要的假设的检验,我们目前还没有一个好方法[但是可以参考Anderson(2006)和Silva et al.(2008)提供的一些有趣的备选方法,虽然在R中还没有实现]。

最后,还可以使用mvoutlier包中的ap.plot()函数来检验多元离群点。代码如下:

  1. library(mvoutlier)
  2. outliers <- aq.plot(y)
  3. outliers

自己尝试一下,看看会得到什么结果吧!

9.7.2 稳健多元方差分析

如果多元正态性或者方差—协方差均值假设都不满足,又或者你担心多元离群点,那么可以考虑用稳健或非参数版本的MANOVA检验。稳健单因素MANOVA可通过rrcov包中的Wilks.test()函数实现。vegan包中的adonis()函数则提供了非参数MANOVA的等同形式。代码清单9-10是Wilks.test()的应用。

代码清单9-10 稳健单因素MANOVA

  1. library(rrcov)
  2. > Wilks.test(y,shelf,method="mcd")
  3. Robust One-way MANOVA (Bartlett Chi2)
  4. data: x
  5. Wilks' Lambda = 0.511, Chi2-Value = 23.71, DF = 4.85, p-value =
  6. 0.0002143
  7. sample estimates:
  8. calories fat sugars
  9. 1 120 0.701 5.66
  10. 2 128 1.185 12.54
  11. 3 161 1.652 10.35

从结果来看,稳健检验对离群点和违反MANOVA假设的情况不敏感,而且再一次验证了存储在货架顶部、中部和底部的谷物营养成分含量不同。