Link Search Menu Expand Document (external link)

How to perform a planned comparison test (in R, using gmodels)

See all solutions.

Task

Suppose that ANOVA reveals a significant difference between treatment levels, and you wish to explore further through post hoc analysis by comparing two specific treatment levels. How can we perform perform planned comparisons, also called a contrast test?

Solution

Usually, you have data you wish to compare, but we will use example data here. We load the “oats” dataset from R’s MASS package, about the yield of oats from a split-plot field trial using three varieties (V) and four levels of manurial treatment (N). The experiment was laid out in 6 blocks (B) of 3 main plots, each split into 4 sub-plots. The varieties were applied to the main plots and the manurial treatments to the sub-plots.

1
2
3
# install.package('MASS')  # if you have not already done so, and want this data
library(MASS)
df <- oats

Before we perform the contrast test, let’s verify that the yield of oats Y depends on the nitrogen manurial treatment given to it N.

1
2
aov1 <- aov(Y ~ N, data = df)
summary(aov1)
1
2
3
4
5
            Df Sum Sq Mean Sq F value   Pr(>F)    
N            3  20020    6673    14.2 2.78e-07 ***
Residuals   68  31965     470                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The $p$-value in the Pr(>F) column is below $\alpha=0.05$. So at the 5% significance level, the yield differs according to the nitrogen manurial treatment. We assume that the model assumptions are met but do not verify them here.

We now want to perform a planned comparison test (or contrast test) on the data to see whether there is a difference between the $N<0.5$ levels and the $N>0.5$ levels. We will use the fit.contrast function in the gmodels package. Since the order of the levels is 0, 0.2, 0.4 and 0.6, the contrast coefficients will be $-0.5$, $-0.5$, $0.5$, $0.5$, respectively.

1
2
3
# install.package('gmodels')  # if you have not already done so
library(gmodels)
fit.contrast(aov1, "N", coeff=c(-1/2,-1/2,1/2,1/2))
1
2
3
4
                          Estimate Std. Error  t value     Pr(>|t|)
N c=( -0.5 -0.5 0.5 0.5 ) 29.66667   5.110338 5.805225 1.855598e-07
attr(,"class")
[1] "fit_contrast"

The $p$-value in the Pr(>|t|) column is below $\alpha=0.05$. This tells us that there is a significant difference between the average yields of the $N<0.5$ and $N>0.5$ levels.

Content last modified on 24 July 2023.

See a problem? Tell us or edit the source.

Contributed by:

  • Krtin Juneja (KJUNEJA@falcon.bentley.edu)
  • Nathan Carter (ncarter@bentley.edu)