# Conducting a moderated mediation analysis

## Overview

This vignette reports a moderated mediation analysis. This will help getting familiar with the several helpers JSmediation offers to conduct moderated mediation analysis.

Simple mediation refers to the pattern of statistical relationships in which the effect of a variable on another goes through a third variable. Sometimes, this indirect relationship is conditional to a fourth variable—a moderator. In such a case, we talk about moderated mediation. The JSmediation package offers a collection of tools to conduct and report a moderated mediation analysis (Muller et al., 2005).

## Conducting a Moderated Mediation Analysis

The Introduction to JSmediation vignette uses a data set collected by Ho et al. (2017) to illustrate simple mediation. This data set contains the result of an experiment in which Ho et al. focus on hypodescent among Black Americans. To illustrate how JSmediation can be used to conduct a moderated mediation analysis, we will expand on this example.

library(JSmediation)

Hypodescent refers to a rule observed in multiracial categorization. Research shows that majority group social perceivers (i.e., White Americans) typically associate Black-White multiracials with their lower status group rather than with their higher group (i.e., with Black Americans rather than with White Americans). This phenomenon is called the hypodescent rule and it was retrieved in the Black Americans population by Ho et al. (2017). The hypothesis is that such categorization occurs because of a sentiment of linked fate between Black Americans and Black-White multiracials.

This observation was supported by data showing that Black Americans felt a stronger sentiment of linked fate between them and Black-White multiracials when they read about an article discussing how Black-White multiracials were likely to suffer from discrimination (compared to an article discussing how they were not). The higher sentiment of linked fate was associated with a higher use of the hypodescent rule in multiracial categorization. In other words, the effect of a discrimination condition on hypodescent rule was mediated by the feeling of linked fate.

In the current vignette, we will investigate whether this indirect effect is moderated by social dominance orientation (SDO). Indeed, SDO correlates with preferences for intergroup equality—higher levels indicates resistance to intergroup equality and support for maintaining status quo, lower levels indicates support for intergroup equality and reducing hierarchy (Ho et al., 2017). Ho et al. (2017) assumed that the indirect effect will be stronger for Black Americans showing lower levels of SDO. They should feel a higher sentiment of linked fate when presented information related to the high discrimination of Black-White multiracials.

data(ho_et_al)

While this vignette was written to illustrate features from the JSmediation package, we will use functions from other packages (e.g., dplyr), but make it explicit when we do so. In other words, rather than calling library(dplyr) to attache the dplyr package and then calling its function (e.g., mutate), we will use dplyr::mutate, mutate will suffice.

### Data Preparation

The data set collected by Ho et al. (2017) contains the information necessary for the test of our hypothesis of moderated mediation. It contains a condition column indicating whether participants were read about the high or low discrimination of Black-White multiracials and a hypodescent column. The data set also contains a linkedfate column indicating the feeling of linked fate participants felt in the experimental situation. The simple mediation analysis in the Introduction to JSmediation vignette shows that participants in high discrimination conditions tend to feel a higher level of linked fate which results in higher hypodescent. We will now investigate whether this indirect effect is more likely to be observed among participants who show higher levels of SDO (thanks to the sdo column).

head(ho_et_al)
#>   id           condition    sdo linkedfate hypodescent
#> 1  2  Low discrimination 1.8125      6.000    2.333333
#> 2  3 High discrimination 1.5625      5.875    6.000000
#> 3  4 High discrimination 1.7500      6.625    6.000000
#> 4  5  Low discrimination 4.2500      5.125    5.666667
#> 5  6  Low discrimination 1.9375      4.375    4.000000
#> 6  9 High discrimination 2.8750      3.750    4.000000

Before we run the moderated mediation analysis, we must tweak the data set a little bit. Muller et al. (2005) recommend centering the continuous predictors and contrast-coding the categorical ones. JSmediation offers helpers like build_contrast or standardize_variable to do so.

ho_et_al <-
ho_et_al %>%
standardize_variable(c(sdo, linkedfate), suffix = "c") %>%
dplyr::mutate(condition_c = build_contrast(condition,
"Low discrimination",
"High discrimination")
)

#> # A tibble: 6 × 8
#>   <chr> <chr>       <dbl>      <dbl>       <dbl>  <dbl>        <dbl>       <dbl>
#> 1 2     Low discri…  1.81       6           2.33 -0.470       0.636         -0.5
#> 2 3     High discr…  1.56       5.88        6    -0.707       0.538          0.5
#> 3 4     High discr…  1.75       6.62        6    -0.529       1.13           0.5
#> 4 5     Low discri…  4.25       5.12        5.67  1.84       -0.0525        -0.5
#> 5 6     Low discri…  1.94       4.38        4    -0.351      -0.643         -0.5
#> 6 9     High discr…  2.88       3.75        4     0.538      -1.13           0.5

The first function we used, standardize_variable, allows us to center and reduce (to standardize) a set of variables (here: sdo and linkedfate). The suffix argument of this function is used to name the standardized variables. Here, because we set suffix = "c", the new variables are named sdo_c and linkedfate_c. When the suffix argument is blank, original variables are overwritten. Because JSmediation was designed to fit within the tidyverse, standardize_variable is especially useful in a dplyr chain.

Here, we also used a second function from JSmediation: build_contrast. This function takes a character vector as a first argument and, then, returns a contrast-coded variables. It is designed for variables with two conditions, which is the case of condition. Because we want to include the transformed variable in ho_et_al, we can use the dplyr::mutate function which creates (or modify) variables. With this method, we contrast-coded the condition variable.

ho_et_al %>%
dplyr::select(dplyr::starts_with("condition"))
#> # A tibble: 824 × 2
#>    condition           condition_c
#>    <chr>                     <dbl>
#>  1 Low discrimination         -0.5
#>  2 High discrimination         0.5
#>  3 High discrimination         0.5
#>  4 Low discrimination         -0.5
#>  5 Low discrimination         -0.5
#>  6 High discrimination         0.5
#>  7 High discrimination         0.5
#>  8 Low discrimination         -0.5
#>  9 Low discrimination         -0.5
#> 10 High discrimination         0.5
#> # … with 814 more rows

### Fitting the moderated mediation model

We will now run our moderated mediation analysis. Remember, we are testing whether participants in high discrimination condition show higher level of hypodescent because of a higher perception of linked fate, and whether this indirect effect is higher among people with high level of SDO. In other words, we are testing whether SDO moderates the mediation of the effect on condition on hypodescent through linked fate perception. To test this moderated mediation, we will use the mdt_moderated function.

#### Moderated mediation formalization

Muller et al. (2005) provide an accessible introduction on how to conduct a moderated mediation analysis using the joint-significance methods. In a nutshell, one will fit several linear models to the data set, and, depending on the significance of some coefficients, one will be able to assess moderated mediation.

To better understand the process of testing a moderated mediation, we can glance at the equation describing the moderation of the indirect effect of X on Y. Such moderation can be described as follows:

$c \times Mod = c' \times Mod + (a \times Mod) \times b + a \times (b \times Mod)$

with $$c \times Mod$$ the total moderation of the indirect effect, $$c' \times Mod$$ the moderation of the direct effect, $$(a \times Mod) \times b$$, the moderation of the indirect effect passing by the moderation of $$a$$, and $$a \times (b \times Mod)$$, the moderation of the indirect effect passing by the moderation of $$b$$ (see Models section; Muller et al., 2005).

Either both $$a \times Mod$$ and $$b$$ or both $$a$$ and $$b \times Mod$$ need to be simultaneously significant for the moderation of the indirect effect to be claimed (Muller et al., 2005).

#### Running the Analysis with mdt_moderated

mdt_moderated works like every mdt_* function. It will be fit the necessary linear models (see the Models section in the help page of mdt_moderated) and returns the relevant coefficient in a nicely formatted output.

To use the function, we will have to describe the role of the variable in the ho_et_al data set.

moderated_mediation_fit <-
mdt_moderated(data = ho_et_al,
IV   = condition_c,
DV   = hypodescent,
Mod  = sdo_c)

Most of the math occurs when mdt_moderated is evaluated. The moderated_mediation_fit that we just computed contains every linear model useful to assess moderated mediation, as described in Muller et al. (2005).

As we can see, it is possible to see $$a$$, $$a \times Mod$$, $$b$$, and $$b \times Mod$$ in the mdt_moderated output.

moderated_mediation_fit
#> Test of mediation (moderated mediation)
#> ==============================================
#>
#> Variables:
#>
#> - IV: condition_c
#> - DV: hypodescent
#> - Mod: sdo_c
#>
#> Paths:
#>
#> ========  ==============  =====  =======================
#> Path      Point estimate     SE  APA
#> ========  ==============  =====  =======================
#> a                  0.569  0.063  t(820) = 9.01, p < .001
#> a * Mod           -0.268  0.063  t(820) = 4.25, p < .001
#> b                  0.161  0.043  t(818) = 3.75, p < .001
#> b * Mod           -0.066  0.042  t(818) = 1.57, p = .117
#> c                  0.131  0.078  t(820) = 1.67, p = .095
#> c * Mod           -0.037  0.078  t(820) = 0.47, p = .640
#> c'                 0.021  0.082  t(818) = 0.25, p = .800
#> c' * Mod           0.037  0.081  t(818) = 0.46, p = .645
#> ========  ==============  =====  =======================
#>
#> Indirect effect index:
#>
#> Indirect effect index is not computed by default.
#>
#> Fitted models:
#>
#> - X * Mod -> Y
#> - X * Mod -> M
#> - (X + M) * Mod -> Y

If a moderated mediation model is significant, Yzerbyt et al. (2018) recommend reporting the moderated mediation index. To compute this index, JSmediation offers the add_indexmethod. In the case of moderated mediation, we will have to specify whether we are in a scenario where we assume that the moderator impacts the relation between or IV and the mediator (i.e., both $$a \times Mod$$ and $$b$$ are significant), the relation between the moderator and the DV (i.e., both $$a$$ and $$b \times Mod$$ are significant), or both. To do so, we must use the stage argument.

moderated_mediation_fit_w_index <- moderated_mediation_fit %>%
add_index(stage = "first")

The output of the new object now contains the index.

moderated_mediation_fit_w_index
#> Test of mediation (moderated mediation)
#> ==============================================
#>
#> Variables:
#>
#> - IV: condition_c
#> - DV: hypodescent
#> - Mod: sdo_c
#>
#> Paths:
#>
#> ========  ==============  =====  =======================
#> Path      Point estimate     SE  APA
#> ========  ==============  =====  =======================
#> a                  0.569  0.063  t(820) = 9.01, p < .001
#> a * Mod           -0.268  0.063  t(820) = 4.25, p < .001
#> b                  0.161  0.043  t(818) = 3.75, p < .001
#> b * Mod           -0.066  0.042  t(818) = 1.57, p = .117
#> c                  0.131  0.078  t(820) = 1.67, p = .095
#> c * Mod           -0.037  0.078  t(820) = 0.47, p = .640
#> c'                 0.021  0.082  t(818) = 0.25, p = .800
#> c' * Mod           0.037  0.081  t(818) = 0.46, p = .645
#> ========  ==============  =====  =======================
#>
#> Indirect effect index:
#>
#> - type: Mediated moderation index (First stage)
#> - point estimate: -0.0432
#> - confidence interval:
#>   - method: Monte Carlo (5000 iterations)
#>   - level: 0.05
#>   - CI: [-0.0779; -0.0162]
#>
#> Fitted models:
#>
#> - X * Mod -> Y
#> - X * Mod -> M
#> - (X + M) * Mod -> Y

#### Reporting Moderated Mediation

The moderated_mediation_fit_w_index object that we computed contains every bit of information to report a moderated mediation in an analysis, following Yzerbyt et al.’s (2018) recommendations:

To assess whether SDO moderates the indirect effect of discrimination condition on hypodescent through linked fate perception, we conducted a moderated mediation analysis (Muller et al., 2005). This analysis first revealed that SDO moderates the effect of condition on linked fate perception, t(820) = 4.25, p < .001. It also revealed that the effect of linked fate perception for a mean level of SDO, and controlling for the effect of the condition and for the moderation of the condition by SDO, predicted significantly hypodescent, t(818) = 3.75, p < .001. This pattern reveals the existence of a moderated mediation. We also computed the first stage moderated mediation index consistent with our joint-significant analysis and it confirmed the moderated mediation, -0.0432, CI95% [-0.0778; -0.0171] (Monte Carlo simulation, 5000 simulations; Yzerbyt et al., 2018).

## Compute the indirect effect for a moderator’s value

When reporting a moderated mediation analysis, it is sometimes useful to know what the indirect effect is for several values of the moderator. The compute_indirect_effect_for function serves that purpose.

compute_indirect_effect_for takes as the first argument a moderated mediation model for which we want to compute the indirect effect at a specific value of the moderator and as the second argument the value of the moderator.

In our example, we standardized our moderator. A mean value of the moderator therefore is sdo_c = 0. If we wanted to compute the effect of condition on hypodescent through linked fate for a mean value of SDO, we would have to run the following:

compute_indirect_effect_for(moderated_mediation_fit, Mod = 0)
#> - type: Conditional simple mediation index (Mod = 0)
#> - point estimate: 0.0916
#> - confidence interval:
#>   - method: Monte Carlo (5000 iterations)
#>   - level: 0.05
#>   - CI: [0.0429; 0.149]

We could also compute this indirect effect for participants who score one standard deviation above the mean in terms of SDO.

compute_indirect_effect_for(moderated_mediation_fit, Mod = 1)
#> - type: Conditional simple mediation index (Mod = 1)
#> - point estimate: 0.0286
#> - confidence interval:
#>   - method: Monte Carlo (5000 iterations)
#>   - level: 0.05
#>   - CI: [-0.00646; 0.0745]

As we can see, the indirect effect estimate decreases when the SDO increases. This result is consistent with the negative value of the moderated mediation index.

# References

Ho, A. K., Kteily, N. S., & Chen, J. M. (2017). You’re one of us”: Black Americans’ use of hypodescent and its association with egalitarianism. Journal of Personality and Social Psychology, 113(5), 753–768. https://doi.org/10.1037/pspi0000107
Muller, D., Judd, C. M., & Yzerbyt, V. Y. (2005). When moderation is mediated and mediation is moderated. Journal of Personality and Social Psychology, 89(6), 852–863. https://doi.org/10.1037/0022-3514.89.6.852
Yzerbyt, V., Muller, D., Batailler, C., & Judd, C. M. (2018). New recommendations for testing indirect effects in mediational models: The need to report and test component paths. Journal of Personality and Social Psychology, 115(6), 929–943. https://doi.org/10.1037/pspa0000132