R语言中与方差分析有关的包有car、gplots、HH、rrcov、multicomp、effects、MASS和mvoutlier。
#运用multcomp包中的cholesterol数据
library(multcomp)
attach(cholesterol)
#查看疗法特征变量
table(trt)
trt
1time 2times 4times drugD drugE
10 10 10 10 10
#查看各组的均值以及方差
aggregate(response,by=list(trt),FUN=mean)
Group.1 x
1 1time 5.78197
2 2times 9.22497
3 4times 12.37478
4 drugD 15.36117
5 drugE 20.94752
aggregate(response,by=list(trt),FUN=sd)
Group.1 x
1 1time 2.878113
2 2times 3.483054
3 4times 2.923119
4 drugD 3.454636
5 drugE 3.345003
#检验组间差异(ANOVA)
fit <- aov(response ~ trt)
summary(fit) #这里显著说明组间存在差异
Df Sum Sq Mean Sq F value Pr(>F)
trt 4 1351.4 337.8 32.43 9.82e-13 ***
Residuals 45 468.8 10.4
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#绘制组间差异以及置信区间
library(gplots)
plotmeans(response ~ trt,
xlab = "Treatment",
ylab = "Response",
main = "Mean Plot \nwith 95% CI")
detach(cholesterol)
虽然ANOVA对各种疗法的F检验证明其效果不同,但并不知道哪种疗法与哪种疗法之间不同。多重比较可以解决这个问题,利用TukeyHSD()函数可以对各组均值差异成对检验。
#对各组均值差异进行成对检验
TukeyHSD(fit)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = response ~ trt)
$trt
diff lwr upr p adj
2times-1time 3.44300 -0.6582817 7.544282 0.1380949
4times-1time 6.59281 2.4915283 10.694092 0.0003542
drugD-1time 9.57920 5.4779183 13.680482 0.0000003
drugE-1time 15.16555 11.0642683 19.266832 0.0000000
4times-2times 3.14981 -0.9514717 7.251092 0.2050382
drugD-2times 6.13620 2.0349183 10.237482 0.0009611
drugE-2times 11.72255 7.6212683 15.823832 0.0000000
drugD-4times 2.98639 -1.1148917 7.087672 0.2512446
drugE-4times 8.57274 4.4714583 12.674022 0.0000037
drugE-drugD 5.58635 1.4850683 9.687632 0.0030633
#进行可视化
par(las=2) #旋转轴标签
par(mar=c(5,8,4,2)) #增大左边界的面积
plot(TukeyHSD(fit))
其中置信区间包含0说明差异并不显著。
利用multcomp包进行多重检验更为全面(并没感觉很好用)。
library(multcomp)
par(mar=c(5,4,6,2))
tuk <- glht(fit,linfct=mcp(trt="Tukey"))
plot(cld(tuk,level = 0.5),col="lightgrey")
在单因素方差分析中,我们假设数据服从正态分布,各组方差相等。可以使用Q-Q图来检验正态性假设。
#用Q-Q图进行正态性假设检验
library(car)
qqPlot(lm(response ~ trt, data = cholesterol),
simulate=TRUE, main="Q-Q Plot", labels=FALSE)
可见数据落在95%置信区间内,满足正态性假设。
接下来进行各组的方差齐整性检验,原假设是方差没有显著不同。
#方差齐整性检验
bartlett.test(response ~ trt, data = cholesterol)
Bartlett test of homogeneity of variances
data: response by trt
Bartlett's K-squared = 0.57975, df = 4, p-value = 0.9653
方差齐整性对离群点很敏感,利用car包的outlierTest()函数可以用来检测离群点:
> #离群点检测
> outlierTest(fit)
No Studentized residuals with Bonferonni p < 0.05
Largest |rstudent|:
rstudent unadjusted p-value Bonferonni p
19 2.251149 0.029422 NA
#从输出结果来看并没有离群点
单因素协方差分析对单因素分析进行了扩展,包含一个或多个定量的协变量。
> data(litter,package="multcomp")
> attach(litter)
> table(dose)
dose
0 5 50 500
20 19 18 17
> aggregate(weight,by=list(dose),FUN=mean)
Group.1 x
1 0 32.30850
2 5 29.30842
3 50 29.86611
4 500 29.64647
> fit <- aov(weight ~ gesttime + dose)
> summary(fit)
Df Sum Sq Mean Sq F value Pr(>F)
gesttime 1 134.3 134.30 8.049 0.00597 **
dose 3 137.1 45.71 2.739 0.04988 *
Residuals 69 1151.3 16.69
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
使用effects包的effect()函数获得调整之后的组均值。
> #获得去除协变量效应之后的组均值
> library(effects)
> effect("dose",fit)
dose effect
dose
0 5 50 500
32.35367 28.87672 30.56614 29.33460