How to Perform Mediation Analysis with Factors in R: A Step-by-Step Guide

Understanding Mediation Analysis with as.factor() Independent Variable

Introduction

Mediation analysis is a statistical technique used to examine the relationship between an independent variable (IV) and a dependent variable (DV), while controlling for the effects of one or more mediating variables. In this article, we will explore how to perform mediation analysis when the independent variable is a factor in R.

Background

The mediate function from the psych package is commonly used for mediation analysis. However, when working with factors as independent variables, issues can arise. This article aims to provide a solution and guide readers on how to handle these challenges.

The Problem

The problem lies in the way the as.factor() function interacts with the mediate function. When we use as.factor() inside the formula, it changes the object’s class attribute name, leading to unexpected results.

For example, consider the following code:

data(iris)
library(mediation)
ols.med <- lm(Sepal.Width ~ Petal.Length + as.factor(Species), data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + as.factor(Species), data = iris)
results1 <- mediate(ols.med, ols.y, treat="Petal.Length", mediator="Sepal.Width", boot=TRUE, sims=500)

In this case, the as.factor() function modifies the object’s class attribute name, causing the error message “object ‘Species’ not found”.

Solution

To avoid this issue, it is recommended to create the as.factor() outside of the formula. Here’s an updated example:

data(iris)
library(mediation)

# Create the factor outside of the formula
iris$Species <- as.factor(iris$Species)

ols.0 <- lm(Sepal.Length ~ Petal.Length + Species, data = iris)
ols.med <- lm(Sepal.Width ~ Petal.Length + Species, data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + Species, data = iris)

results1 <- mediate(ols.med, ols.y, treat="Petal.Length", 
                   mediator="Sepal.Width", boot=TRUE, sims=500)

By creating the factor outside of the formula, we ensure that the as.factor() function does not modify the object’s class attribute name.

Alternative Solution

Another approach is to wrap the as.factor() inside the formula using the I() function. Here’s an updated example:

data(iris)
library(mediation)

ols.med <- lm(Sepal.Width ~ I(Petal.Length) + I(Species), data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + I(Species), data = iris)

results1 <- mediate(ols.med, ols.y, treat="Petal.Length", 
                   mediator="Sepal.Width", boot=TRUE, sims=500)

By using I(), we can keep the factor inside the formula without modifying its class attribute name.

Handling Changes in the Attribute

If we want to use a different approach, we can change the attribute of the object. For example:

data(iris)
library(mediation)

# Create the factor outside of the formula
iris$Species <- as.factor(iris$Species)

ols.med <- lm(Sepal.Width ~ Petal.Length + attr(Species, "class"), data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + attr(Species, "class"), data = iris)

results1 <- mediate(ols.med, ols.y, treat="Petal.Length", 
                   mediator="Sepal.Width", boot=TRUE, sims=500)

In this case, we use the attr() function to access the class attribute of the object and change its value.

Conclusion

Performing mediation analysis with a factor as an independent variable can be challenging. However, by creating the factor outside of the formula or using alternative approaches, such as wrapping the as.factor() inside the formula using I(), we can avoid issues related to class attribute name changes. By following these solutions and understanding how they work, you can successfully perform mediation analysis with factors in R.

Code Snippets

Here are some code snippets that demonstrate the different approaches:

Creating Factor Outside of Formula

data(iris)
library(mediation)

# Create the factor outside of the formula
iris$Species <- as.factor(iris$Species)

ols.0 <- lm(Sepal.Length ~ Petal.Length + Species, data = iris)
ols.med <- lm(Sepal.Width ~ Petal.Length + Species, data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + Species, data = iris)

results1 <- mediate(ols.med, ols.y, treat="Petal.Length", 
                   mediator="Sepal.Width", boot=TRUE, sims=500)

Wrapping as.factor() Inside Formula using I()

data(iris)
library(mediation)

# Create the factor inside the formula using I()
ols.med <- lm(Sepal.Width ~ I(Petal.Length) + I(Species), data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + I(Species), data = iris)

results1 <- mediate(ols.med, ols.y, treat="Petal.Length", 
                   mediator="Sepal.Width", boot=TRUE, sims=500)

Changing Attribute Using attr()

data(iris)
library(mediation)

# Create the factor outside of the formula
iris$Species <- as.factor(iris$Species)

ols.med <- lm(Sepal.Width ~ Petal.Length + attr(Species, "class"), data = iris)
ols.y <- lm(Sepal.Length ~ Petal.Length + Sepal.Width + attr(Species, "class"), data = iris)

results1 <- mediate(ols_med, ols.y, treat="Petal.Length", 
                   mediator="Sepal.Width", boot=TRUE, sims=500)

Last modified on 2023-11-01