knitr::opts_chunk$set(echo = TRUE)
library(multcomp)
Loading required package: mvtnorm
Loading required package: survival
Loading required package: TH.data
Loading required package: MASS

Attaching package: ‘TH.data’

The following object is masked from ‘package:MASS’:

    geyser
library(car)
Loading required package: carData

Analysis of variance (ANOVA)

Previously we considered regression models for predicting a quantitative response variable from quantitative predictor variables. But we can include nominal or ordinal factors as predictors as well. When factors are included as explanatory variables, our focus usually shifts from prediction to understanding group differences, and the methodology is referred to as analysis of variance (ANOVA). ANOVA methodology is used to analyze a wide variety of experimental and quasi-experimental designs.

One-way ANOVA

In a one-way ANOVA, we are interested in comparing the dependent variable means of two or more groups defined by a categorical grouping factor.

In the following example, fifty patients received one of five cholesterol-reducing drug regimens (trt). Three of the treatment conditions involved the same drug administered as 20 mg once per day (1time), 10mg twice per day (2times), or 5 mg four times per day (4times). The two remaining conditions (drugD and drugE) represented competing drugs. Which drug regimen produced the greatest cholesterol reduction (response)?

library(multcomp)
data(cholesterol)
cholesterol
attach(cholesterol)
table(trt)
trt
 1time 2times 4times  drugD  drugE 
    10     10     10     10     10 
aggregate(response, by=list(trt), FUN=mean) 
aggregate(response, by=list(trt), FUN=sd)   
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
detach(cholesterol)

The results of the analysis indicate that there are significant differential effects of the treatments to reduce cholesterol, this is because the probability of a real no-difference (type I error) is very low (Pr(>F) = 9.82e-13).

But, wait! To apply the procedure above, there are a couple of requirements from the data:

  • data must have a normal distribution
  • equality of variance between the groups

First will see if the response variable has a normal distribution:

library(car)
qqPlot(lm(response ~ trt, data=cholesterol),
         simulate=TRUE, main="Q-Q Plot", labels=FALSE, col = "red")
[1] 19 38

The data falls within the 95% confidence envelope, suggesting that the normality assumption has been met fairly well.

Now we will test homogeneity of variance, using the Bartlett’s test:

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

Bartlett’s test indicates that the variances in the five groups do not differ significantly (p = 0.97).

The ANOVA F test for treatment tells you that the five drug regimens are not equally effective, but it does not tell you which treatments differ from one another. You can use a multiple comparison procedure to answer this question. For example, the TukeyHSD() function provides a test of all pairwise differences between group means, as shown next.

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))

For example, the mean cholesterol reductions for 1-time and 2-times are not significantly different from each other (p = 0.138), whereas the difference between 1-time and 4-times is significantly different (p < .001). In this graph, confidence intervals that include 0 indicate treatments that are not significantly different (p > 0.5).

ANOVA visualization using ggplot2

Now we are going to use box-plots to observe differences between treatments, using ggplot2.

Exercises

  • Make more appealing the previous graph, using ggplot2 options for geom_boxplot(…).
LS0tCnRpdGxlOiAiRGF5X1RocmVlIgphdXRob3I6ICJELl9TLl9GZXJuw6FuZGV6LWRlbC1WaXNvIgpkYXRlOiAiNy8xOS8yMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCi0tLQoKYGBge3Igc2V0dXB9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKbGlicmFyeShtdWx0Y29tcCkKbGlicmFyeShjYXIpCmBgYAoKIyMjQW5hbHlzaXMgb2YgdmFyaWFuY2UgKEFOT1ZBKQpQcmV2aW91c2x5IHdlIGNvbnNpZGVyZWQgcmVncmVzc2lvbiBtb2RlbHMgZm9yIHByZWRpY3RpbmcgYSBxdWFudGl0YXRpdmUgcmVzcG9uc2UgdmFyaWFibGUgZnJvbSBxdWFudGl0YXRpdmUgcHJlZGljdG9yIHZhcmlhYmxlcy4gIEJ1dCB3ZSBjYW4gaW5jbHVkZSBub21pbmFsIG9yIG9yZGluYWwgZmFjdG9ycyBhcyBwcmVkaWN0b3JzIGFzIHdlbGwuICBXaGVuIGZhY3RvcnMgYXJlIGluY2x1ZGVkIGFzIGV4cGxhbmF0b3J5IHZhcmlhYmxlcywgb3VyIGZvY3VzIHVzdWFsbHkgc2hpZnRzIGZyb20gcHJlZGljdGlvbiB0byB1bmRlcnN0YW5kaW5nIGdyb3VwIGRpZmZlcmVuY2VzLCBhbmQgdGhlIG1ldGhvZG9sb2d5IGlzIHJlZmVycmVkIHRvIGFzIFthbmFseXNpcyBvZiB2YXJpYW5jZSAoQU5PVkEpXShodHRwczovL2xpdmVib29rLm1hbm5pbmcuY29tIyEvYm9vay9yLWluLWFjdGlvbi1zZWNvbmQtZWRpdGlvbi9jaGFwdGVyLTkvcG9pbnQtMjgwOC0xLTUtMCkuIEFOT1ZBIG1ldGhvZG9sb2d5IGlzIHVzZWQgdG8gYW5hbHl6ZSBhIHdpZGUgdmFyaWV0eSBvZiBleHBlcmltZW50YWwgYW5kIHF1YXNpLWV4cGVyaW1lbnRhbCBkZXNpZ25zLgoKIyMjI09uZS13YXkgQU5PVkEKSW4gYSBvbmUtd2F5IEFOT1ZBLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjb21wYXJpbmcgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBtZWFucyBvZiB0d28gb3IgbW9yZSBncm91cHMgZGVmaW5lZCBieSBhIGNhdGVnb3JpY2FsIGdyb3VwaW5nIGZhY3Rvci4KCkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZmlmdHkgcGF0aWVudHMgcmVjZWl2ZWQgb25lIG9mIGZpdmUgY2hvbGVzdGVyb2wtcmVkdWNpbmcgZHJ1ZyByZWdpbWVucyAodHJ0KS4gVGhyZWUgb2YgdGhlIHRyZWF0bWVudCBjb25kaXRpb25zIGludm9sdmVkIHRoZSBzYW1lIGRydWcgYWRtaW5pc3RlcmVkIGFzIDIwIG1nIG9uY2UgcGVyIGRheSAoMXRpbWUpLCAxMG1nIHR3aWNlIHBlciBkYXkgKDJ0aW1lcyksIG9yIDUgbWcgZm91ciB0aW1lcyBwZXIgZGF5ICg0dGltZXMpLiBUaGUgdHdvIHJlbWFpbmluZyBjb25kaXRpb25zIChkcnVnRCBhbmQgZHJ1Z0UpIHJlcHJlc2VudGVkIGNvbXBldGluZyBkcnVncy4gV2hpY2ggZHJ1ZyByZWdpbWVuIHByb2R1Y2VkIHRoZSBncmVhdGVzdCBjaG9sZXN0ZXJvbCByZWR1Y3Rpb24gKHJlc3BvbnNlKT8gCmBgYHtyIGFub3ZhLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KG11bHRjb21wKQpkYXRhKGNob2xlc3Rlcm9sKQpjaG9sZXN0ZXJvbAphdHRhY2goY2hvbGVzdGVyb2wpCnRhYmxlKHRydCkKYWdncmVnYXRlKHJlc3BvbnNlLCBieT1saXN0KHRydCksIEZVTj1tZWFuKQkKYWdncmVnYXRlKHJlc3BvbnNlLCBieT1saXN0KHRydCksIEZVTj1zZCkJCmZpdCA8LSBhb3YocmVzcG9uc2UgfiB0cnQpCQpzdW1tYXJ5KGZpdCkKZGV0YWNoKGNob2xlc3Rlcm9sKQpgYGAKClRoZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcyBpbmRpY2F0ZSB0aGF0IHRoZXJlIGFyZSBzaWduaWZpY2FudCBkaWZmZXJlbnRpYWwgZWZmZWN0cyBvZiB0aGUgdHJlYXRtZW50cyB0byByZWR1Y2UgY2hvbGVzdGVyb2wsIHRoaXMgaXMgYmVjYXVzZSB0aGUgcHJvYmFiaWxpdHkgb2YgYSByZWFsIG5vLWRpZmZlcmVuY2UgKHR5cGUgSSBlcnJvcikgaXMgdmVyeSBsb3cgKFByKD5GKSA9IDkuODJlLTEzKS4gIAoKQnV0LCB3YWl0ISBUbyBhcHBseSB0aGUgcHJvY2VkdXJlIGFib3ZlLCB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgcmVxdWlyZW1lbnRzIGZyb20gdGhlIGRhdGE6CgorIGRhdGEgbXVzdCBoYXZlIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbgorIGVxdWFsaXR5IG9mIHZhcmlhbmNlIGJldHdlZW4gdGhlIGdyb3VwcwoKRmlyc3Qgd2lsbCBzZWUgaWYgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGhhcyBhIFtub3JtYWwgZGlzdHJpYnV0aW9uXShodHRwczovL2xpdmVib29rLm1hbm5pbmcuY29tIyEvYm9vay9yLWluLWFjdGlvbi1zZWNvbmQtZWRpdGlvbi9jaGFwdGVyLTkvcG9pbnQtMjgwOS03Mi03NS0wKToKYGBge3Igbm9ybWFsaXR5fQpsaWJyYXJ5KGNhcikKcXFQbG90KGxtKHJlc3BvbnNlIH4gdHJ0LCBkYXRhPWNob2xlc3Rlcm9sKSwKICAgICAgICAgc2ltdWxhdGU9VFJVRSwgbWFpbj0iUS1RIFBsb3QiLCBsYWJlbHM9RkFMU0UsIGNvbCA9ICJyZWQiKQpgYGAKVGhlIGRhdGEgZmFsbHMgd2l0aGluIHRoZSA5NSUgY29uZmlkZW5jZSBlbnZlbG9wZSwgc3VnZ2VzdGluZyB0aGF0IHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBoYXMgYmVlbiBtZXQgZmFpcmx5IHdlbGwuCgpOb3cgd2Ugd2lsbCB0ZXN0IGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlLCB1c2luZyB0aGUgW0JhcnRsZXR04oCZcyB0ZXN0Ol0oaHR0cHM6Ly9saXZlYm9vay5tYW5uaW5nLmNvbSMhL2Jvb2svci1pbi1hY3Rpb24tc2Vjb25kLWVkaXRpb24vY2hhcHRlci05L3BvaW50LTI4MTAtNzctNzktMCkKYGBge3IgaG9tb3ZhcmlhbmNlfQpiYXJ0bGV0dC50ZXN0KHJlc3BvbnNlIH4gdHJ0LCBkYXRhPWNob2xlc3Rlcm9sKQpgYGAKQmFydGxldHTigJlzIHRlc3QgaW5kaWNhdGVzIHRoYXQgdGhlIHZhcmlhbmNlcyBpbiB0aGUgZml2ZSBncm91cHMgZG8gbm90IGRpZmZlciBzaWduaWZpY2FudGx5IChwID0gMC45NykuCgpUaGUgQU5PVkEgRiB0ZXN0IGZvciB0cmVhdG1lbnQgdGVsbHMgeW91IHRoYXQgdGhlIGZpdmUgZHJ1ZyByZWdpbWVucyBhcmUgbm90IGVxdWFsbHkgZWZmZWN0aXZlLCBidXQgaXQgZG9lcyBub3QgdGVsbCB5b3Ugd2hpY2ggdHJlYXRtZW50cyBkaWZmZXIgZnJvbSBvbmUgYW5vdGhlci4gWW91IGNhbiB1c2UgYSBbbXVsdGlwbGUgY29tcGFyaXNvbiBwcm9jZWR1cmVdKGh0dHBzOi8vbGl2ZWJvb2subWFubmluZy5jb20jIS9ib29rL3ItaW4tYWN0aW9uLXNlY29uZC1lZGl0aW9uL2NoYXB0ZXItOS9wb2ludC0yODExLTU5LTYwLTApIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIF9fVHVrZXlIU0QoKV9fIGZ1bmN0aW9uIHByb3ZpZGVzIGEgdGVzdCBvZiBhbGwgcGFpcndpc2UgZGlmZmVyZW5jZXMgYmV0d2VlbiBncm91cCBtZWFucywgYXMgc2hvd24gbmV4dC4KYGBge3IgbXVsdGlwbGV9ClR1a2V5SFNEKGZpdCkKcGFyKGxhcz0yKQpwYXIobWFyPWMoNSw4LDQsMikpCnBsb3QoVHVrZXlIU0QoZml0KSkKYGBgCkZvciBleGFtcGxlLCB0aGUgbWVhbiBjaG9sZXN0ZXJvbCByZWR1Y3Rpb25zIGZvciAxLXRpbWUgYW5kIDItdGltZXMgYXJlIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIgKHAgPSAwLjEzOCksIHdoZXJlYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLXRpbWUgYW5kIDQtdGltZXMgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKHAgPCAuMDAxKS4gIEluIHRoaXMgZ3JhcGgsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHRoYXQgaW5jbHVkZSAwIGluZGljYXRlIHRyZWF0bWVudHMgdGhhdCBhcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChwID4gMC41KS4KCiMjIyMjQU5PVkEgdmlzdWFsaXphdGlvbiB1c2luZyBnZ3Bsb3QyCk5vdyB3ZSBhcmUgZ29pbmcgdG8gdXNlIGJveC1wbG90cyB0byBvYnNlcnZlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHJlYXRtZW50cywgdXNpbmcgX19nZ3Bsb3QyX18uCmBgYHtyIGdncGxvdDJfbXVsdGlwX2JveHBsb3RzfQpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChjaG9sZXN0ZXJvbCwgYWVzKHg9dHJ0LCB5PXJlc3BvbnNlKSkgKyBnZW9tX2JveHBsb3QoZmlsbD0iY29ybmZsb3dlcmJsdWUiKSArCiAgbGFicyh4ID0gIlRyYXRhbWllbnRvcyIsIHkgPSAiUmVkdWNjacOzbiBDb2xlc3Rlcm9sLCAlIikKYGBgCgojIyMjX19FeGVyY2lzZXNfXwoKKyBNYWtlIG1vcmUgYXBwZWFsaW5nIHRoZSBwcmV2aW91cyBncmFwaCwgdXNpbmcgZ2dwbG90MiBvcHRpb25zIGZvciBfX2dlb21fYm94cGxvdCguLi4pX18uCgoKCg==