# How to perform post-hoc analysis with Tukey’s HSD test (in R)

See all solutions.

If we run a one-way ANOVA test and find that there is a significant difference between population means, we might want to know which means are actually different from each other. One way to do so is with Tukey’s Honestly Significant Differences (HSD) method. It creates confidence intervals for each pair of samples, while controlling for Type I error rate across all pairs. Thus the resulting intervals are a little wider than those produced using Fisher’s LSD method. How do we make these confidence intervals, with an appropriate visualization?

## Solution

We load here the same data that appears in the solution for how to perform pairwise comparisons. That solution used ANOVA to determine which pairs of groups have significant differences in their means; follow its link for more details.

1
2
3
# Load an inbuilt data set called InsectSprays and assign it to the variable df
df <- InsectSprays

1
2
3
4
5
6
7
8
9
10
11
count spray
1  10    A
2   7    A
3  20    A
4  14    A
5  14    A
6  12    A
7  10    A
8  23    A
9  17    A
10 20    A


We now want to perform an unplanned comparison test on the data to determine the magnitudes of the differences between pairs of groups. We do this by applying Tukey’s HSD approach to perform pairwise comparisons and generate confidence intervals that maintain a specified experiment-wide error rate. We use R’s built-in TukeyHSD function, and we give it the same ANOVA results that we computed in the solution for how to perform pairwise comparisons.

1
2
aov1 <- aov(count ~ spray, data = df)
TukeyHSD(aov1, "spray", ordered=TRUE, conf.level = 0.95)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Tukey multiple comparisons of means
95% family-wise confidence level
factor levels have been ordered

Fit: aov(formula = count ~ spray, data = df)

$spray diff lwr upr p adj E-C 1.4166667 -3.282742 6.116075 0.9488669 D-C 2.8333333 -1.866075 7.532742 0.4920707 A-C 12.4166667 7.717258 17.116075 0.0000000 B-C 13.2500000 8.550591 17.949409 0.0000000 F-C 14.5833333 9.883925 19.282742 0.0000000 D-E 1.4166667 -3.282742 6.116075 0.9488669 A-E 11.0000000 6.300591 15.699409 0.0000000 B-E 11.8333333 7.133925 16.532742 0.0000000 F-E 13.1666667 8.467258 17.866075 0.0000000 A-D 9.5833333 4.883925 14.282742 0.0000014 B-D 10.4166667 5.717258 15.116075 0.0000002 F-D 11.7500000 7.050591 16.449409 0.0000000 B-A 0.8333333 -3.866075 5.532742 0.9951810 F-A 2.1666667 -2.532742 6.866075 0.7542147 F-B 1.3333333 -3.366075 6.032742 0.9603075  Because the above table contains a lot of information, it’s often helpful to visualize these intervals. R lets us do so by simply calling plot on the above table. We add a few plotting parameters to improve its appearance. 1 2 plot( TukeyHSD(aov1, "spray", ordered=TRUE, conf.level = 0.95), las=1, cex.axis=0.9 )  Confidence intervals that cross the vertical, dashed line at$x=0\$ are those in which the means across those groups may be equal. Other intervals have mean differences whose 95% confidence intervals do not include zero.