How to Conduct an Analysis of Covariance (ANCOVA) in R

Spread the love

Analysis of Covariance (ANCOVA) is a generalized form of Analysis of Variance (ANOVA) that allows you to evaluate whether population means of a dependent (target) variable differ with respect to one or more categorical independent variables, while also accounting for the effects of continuous variables that have an influence on the dependent variable. Essentially, ANCOVA adjusts the dependent variable for any influence by the covariate(s).

This article aims to provide a comprehensive guide to conducting an ANCOVA in R, how to check assumptions, running the ANCOVA, interpreting the output, and post-hoc analyses.

Install and Load Necessary Packages

Let’s start by installing and loading the required packages.


Understanding the Data

For demonstration purposes, we’ll use a hypothetical dataset of student scores from different schools and grade levels, alongside their pre-test scores. The dataset will contain:

  • School_Type: Public or Private (Categorical)
  • Grade_Level: Freshman, Sophomore, Junior, Senior (Categorical)
  • Pretest_Score: Scores from a pre-test (Continuous)
  • Final_Score: Final scores (Continuous)

You can create this dataset in R with the following code:

# Create dataset
n <- 100 # Number of samples

School_Type <- sample(c("Public", "Private"), n, replace = TRUE)
Grade_Level <- sample(c("Freshman", "Sophomore", "Junior", "Senior"), n, replace = TRUE)
Pretest_Score <- round(rnorm(n, 70, 10))
Final_Score <- round(rnorm(n, 75, 12))

data <- data.frame(School_Type, Grade_Level, Pretest_Score, Final_Score)

Check Assumptions

Before running an ANCOVA, some assumptions need to be met:

  1. Linearity: A linear relationship should exist between the dependent variable and the covariate(s).
  2. Homogeneity of Variance: The variance of the residuals should be constant across groups.
  3. Independence: Observations should be independent of each other.
  4. Normality: The residuals should be normally distributed.

Check for Linearity

You can use scatter plots and correlation tests to check for linearity.

ggplot(data, aes(x = Pretest_Score, y = Final_Score)) +
  geom_point() +
  geom_smooth(method = "lm") +
  facet_grid(School_Type ~ Grade_Level)

Check for Homogeneity of Variance

Use Levene’s test to check for homogeneity of variance.

leveneTest(Final_Score ~ School_Type * Grade_Level, data = data)

Check for Independence and Normality

Independence is often assumed from the study design. Normality can be checked using QQ-plots or statistical tests like Shapiro-Wilk.

Running the ANCOVA in R

The function aov() in R can be used to perform ANCOVA. The syntax to include a covariate is to add it before the categorical variables separated by a + sign in the formula argument.

ancova_result <- aov(Final_Score ~ Pretest_Score + School_Type * Grade_Level, data = data)

Interpreting the Results

The output will include F-values, degrees of freedom, and p-values for each variable and interaction term. A significant p-value for the covariate (Pretest_Score) indicates that adjusting for it was beneficial. A significant p-value for the categorical variables (School_Type, Grade_Level) or their interaction implies that they have a significant effect on the dependent variable (Final_Score), after adjusting for the covariate.


Plotting the data can help interpret the results more easily.

# Create a plot
ggplot(data, aes(x = Grade_Level, y = Final_Score, color = School_Type)) +
  geom_point(aes(shape = School_Type)) +
  geom_smooth(method = "lm", aes(group = School_Type), se = FALSE) +
  facet_grid(. ~ School_Type)


Conducting an ANCOVA in R involves multiple steps, including checking assumptions, running the ANCOVA model, interpreting the results. Care should be taken at each stage to ensure that the assumptions are met and that the model is appropriate for the data. ANCOVA is a powerful method that allows you to understand the impact of multiple types of variables at once, thereby providing a more nuanced understanding of your data.

Posted in RTagged

Leave a Reply