﻿figure it out - a statistical consultancy from the Institute of Work Psychology, University of Sheffield ## Mplus code for mediation, moderation, and moderated mediation models

Model 31: 1 or more mediators, in parallel if multiple (example uses 1), 3 moderators, 2 moderating both the IV- Mediator path and the direct IV-DV path, 1 moderating both the Mediator-DV path and the direct IV-DV path

Example Variables: 1 predictor X, 1 mediator M, 3 moderators W, Z, V, 1 outcome Y

Preliminary notes:

The code below assumes that

• The primary IV (variable X) is continuous or dichotomous.
• Any moderators (variables W, V, Q, Z) are continuous, though the only adaptation required to handle dichotomous moderators is in the MODEL CONSTRAINT: and loop plot code - an example of how to do this is given in model 1b. Handling categorical moderators with > 2 categories is demonstrated in model 1d.
• Any mediators (variable M, or M1, M2, etc.) are continuous and satisfy the assumptions of standard multiple regression. An example of how to handle a dichotomous mediator is given in model 4c.
• The DV (variable Y) is continuous and satisfies the assumptions of standard multiple regression - an example of how to handle a dichotomous DV is given in model 1e (i.e. a moderated logistic regression) and in model 4d (i.e. an indirect effect in a logistic regression).

Model Diagram: Statistical Diagram: Model Equation(s):

Y = b0 + b1M + b2MV + c1'X + c2'W + c3'Z + c4'XW + c5'XZ + c6'V + c7'XV
M = a0 + a1X + a2W + a3Z + a4XW + a5XZ

Algebra to calculate indirect and/or conditional effects by writing model as Y = a + bX:

Y = b0 + b1M + b2MV + c1'X + c2'W + c3'Z + c4'XW + c5'XZ + c6'V + c7'XV
M = a0 + a1X + a2W + a3Z + a4XW + a5XZ

Hence... substituting in equation for M

Y = b0 + b1(a0 + a1X + a2W + a3Z + a4XW + a5XZ) + b2(a0 + a1X + a2W + a3Z + a4XW + a5XZ)V + c1'X + c2'W + c3'Z + c4'XW + c5'XZ + c6'V + c7'XV

Hence... multiplying out brackets

Y = b0 + a0b1 + a1b1X + a2b1W + a3b1Z + a4b1XW + a5b1XZ + a0b2V + a1b2XV + a2b2WV + a3b2ZV + a4b2XWV + a5b2XZV + c1'X + c2'W + c3'Z + c4'XW + c5'XZ + c6'V + c7'XV

Hence... grouping terms into form Y = a + bX

Y = (b0 + a0b1 + a2b1W + a3b1Z + a0b2V + a2b2WV + a3b2ZV + c2'W + c3'Z + c6'V) + (a1b1 + a4b1W + a5b1Z + a1b2V + a4b2WV + a5b2ZV + c1' + c4'W + c5'Z + c7'V)X

Hence...

One indirect effect(s) of X on Y, conditional on W, Z, V:

a1b1 + a4b1W + a5b1Z + a1b2V + a4b2WV + a5b2ZV = (a1 + a4W + a5Z)(b1 + b2V)

One direct effect of X on Y, conditional on W, Z, V:

c1' + c4'W + c5'Z + c7'V

Mplus code for the model:

! Predictor variable - X
! Mediator variable(s) – M
! Moderator variable(s) – W, Z, V
! Outcome variable - Y

USEVARIABLES = X M W Z V Y XW XZ XV MV;

! Create interaction terms
! Note that they have to be placed at end of USEVARIABLES subcommand above

DEFINE:
MV = M*V;
XW = X*W;
XZ = X*Z;
XV = X*V;

ANALYSIS:
TYPE = GENERAL;
ESTIMATOR = ML;
BOOTSTRAP = 10000;

! In model statement name each path and intercept using parentheses

MODEL:
[Y] (b0);
Y ON M (b1);
Y ON MV (b2);

Y ON X (cdash1);
Y ON W (cdash2);
Y ON Z (cdash3);
Y ON XW (cdash4);
Y ON XZ (cdash5);
Y ON V (cdash6);
Y ON XV (cdash7);

[M] (a0);
M ON X (a1);
M ON W (a2);
M ON Z (a3);
M ON XW (a4);
M ON XZ (a5);

! Use model constraint subcommand to test conditional indirect effects
! You need to pick low, medium and high moderator values for W, Z, V
! for example, of 1 SD below mean, mean, 1 SD above mean

! 3 moderators, 3 values for each, gives 27 combinations
! arbitrary naming convention for conditional indirect and total effects used below:
! HWMVLQ = high value of W, medium value of V and low value of Q, etc.

MODEL CONSTRAINT:
NEW(LOW_W MED_W HIGH_W LOW_Z MED_Z HIGH_Z LOW_V MED_V HIGH_V
ILWLZLV IMWLZLV IHWLZLV ILWMZLV IMWMZLV IHWMZLV
ILWHZLV IMWHZLV IHWHZLV
ILWLZMV IMWLZMV IHWLZMV ILWMZMV IMWMZMV IHWMZMV
ILWHZMV IMWHZMV IHWHZMV
ILWLZHV IMWLZHV IHWLZHV ILWMZHV IMWMZHV IHWMZHV
ILWHZHV IMWHZHV IHWHZHV
DLWLZLV DMWLZLV DHWLZLV DLWMZLV DMWMZLV DHWMZLV
DLWHZLV DMWHZLV DHWHZLV
DLWLZMV DMWLZMV DHWLZMV DLWMZMV DMWMZMV DHWMZMV
DLWHZMV DMWHZMV DHWHZMV
DLWLZHV DMWLZHV DHWLZHV DLWMZHV DMWMZHV DHWMZHV
DLWHZHV DMWHZHV DHWHZHV
TLWLZLV TMWLZLV THWLZLV TLWMZLV TMWMZLV THWMZLV
TLWHZLV TMWHZLV THWHZLV
TLWLZMV TMWLZMV THWLZMV TLWMZMV TMWMZMV THWMZMV
TLWHZMV TMWHZMV THWHZMV
TLWLZHV TMWLZHV THWLZHV TLWMZHV TMWMZHV THWMZHV
TLWHZHV TMWHZHV THWHZHV);

LOW_W = #LOWW;   ! replace #LOWW in the code with your chosen low value of W
MED_W = #MEDW;   ! replace #MEDW in the code with your chosen medium value of W
HIGH_W = #HIGHW;   ! replace #HIGHW in the code with your chosen high value of W

LOW_Z = #LOWZ;   ! replace #LOWZ in the code with your chosen low value of Z
MED_Z = #MEDZ;   ! replace #MEDZ in the code with your chosen medium value of Z
HIGH_Z = #HIGHZ;   ! replace #HIGHZ in the code with your chosen high value of Z

LOW_V = #LOWV;   ! replace #LOWV in the code with your chosen low value of V
MED_V = #MEDV;   ! replace #MEDV in the code with your chosen medium value of V
HIGH_V = #HIGHV;   ! replace #HIGHV in the code with your chosen high value of V

! Calc conditional indirect effects for each combination of moderator values

ILWLZLV = a1*b1 + a4*b1*LOW_W + a5*b1*LOW_Z + a1*b2*LOW_V +
a4*b2*LOW_W*LOW_V + a5*b2*LOW_Z*LOW_V;
IMWLZLV = a1*b1 + a4*b1*MED_W + a5*b1*LOW_Z + a1*b2*LOW_V +
a4*b2*MED_W*LOW_V + a5*b2*LOW_Z*LOW_V;
IHWLZLV = a1*b1 + a4*b1*HIGH_W + a5*b1*LOW_Z + a1*b2*LOW_V +
a4*b2*HIGH_W*LOW_V + a5*b2*LOW_Z*LOW_V;

ILWMZLV = a1*b1 + a4*b1*LOW_W + a5*b1*MED_Z + a1*b2*LOW_V +
a4*b2*LOW_W*LOW_V + a5*b2*MED_Z*LOW_V;
IMWMZLV = a1*b1 + a4*b1*MED_W + a5*b1*MED_Z + a1*b2*LOW_V +
a4*b2*MED_W*LOW_V + a5*b2*MED_Z*LOW_V;
IHWMZLV = a1*b1 + a4*b1*HIGH_W + a5*b1*MED_Z + a1*b2*LOW_V +
a4*b2*HIGH_W*LOW_V + a5*b2*MED_Z*LOW_V;

ILWHZLV = a1*b1 + a4*b1*LOW_W + a5*b1*HIGH_Z + a1*b2*LOW_V +
a4*b2*LOW_W*LOW_V + a5*b2*HIGH_Z*LOW_V;
IMWHZLV = a1*b1 + a4*b1*MED_W + a5*b1*HIGH_Z + a1*b2*LOW_V +
a4*b2*MED_W*LOW_V + a5*b2*HIGH_Z*LOW_V;
IHWHZLV = a1*b1 + a4*b1*HIGH_W + a5*b1*HIGH_Z + a1*b2*LOW_V +
a4*b2*HIGH_W*LOW_V + a5*b2*HIGH_Z*LOW_V;

ILWLZMV = a1*b1 + a4*b1*LOW_W + a5*b1*LOW_Z + a1*b2*MED_V +
a4*b2*LOW_W*MED_V + a5*b2*LOW_Z*MED_V;
IMWLZMV = a1*b1 + a4*b1*MED_W + a5*b1*LOW_Z + a1*b2*MED_V +
a4*b2*MED_W*MED_V + a5*b2*LOW_Z*MED_V;
IHWLZMV = a1*b1 + a4*b1*HIGH_W + a5*b1*LOW_Z + a1*b2*MED_V +
a4*b2*HIGH_W*MED_V + a5*b2*LOW_Z*MED_V;

ILWMZMV = a1*b1 + a4*b1*LOW_W + a5*b1*MED_Z + a1*b2*MED_V +
a4*b2*LOW_W*MED_V + a5*b2*MED_Z*MED_V;
IMWMZMV = a1*b1 + a4*b1*MED_W + a5*b1*MED_Z + a1*b2*MED_V +
a4*b2*MED_W*MED_V + a5*b2*MED_Z*MED_V;
IHWMZMV = a1*b1 + a4*b1*HIGH_W + a5*b1*MED_Z + a1*b2*MED_V +
a4*b2*HIGH_W*MED_V + a5*b2*MED_Z*MED_V;

ILWHZMV = a1*b1 + a4*b1*LOW_W + a5*b1*HIGH_Z + a1*b2*MED_V +
a4*b2*LOW_W*MED_V + a5*b2*HIGH_Z*MED_V;
IMWHZMV = a1*b1 + a4*b1*MED_W + a5*b1*HIGH_Z + a1*b2*MED_V +
a4*b2*MED_W*MED_V + a5*b2*HIGH_Z*MED_V;
IHWHZMV = a1*b1 + a4*b1*HIGH_W + a5*b1*HIGH_Z + a1*b2*MED_V +
a4*b2*HIGH_W*MED_V + a5*b2*HIGH_Z*MED_V;

ILWLZHV = a1*b1 + a4*b1*LOW_W + a5*b1*LOW_Z + a1*b2*HIGH_V +
a4*b2*LOW_W*HIGH_V + a5*b2*LOW_Z*HIGH_V;
IMWLZHV = a1*b1 + a4*b1*MED_W + a5*b1*LOW_Z + a1*b2*HIGH_V +
a4*b2*MED_W*HIGH_V + a5*b2*LOW_Z*HIGH_V;
IHWLZHV = a1*b1 + a4*b1*HIGH_W + a5*b1*LOW_Z + a1*b2*HIGH_V +
a4*b2*HIGH_W*HIGH_V + a5*b2*LOW_Z*HIGH_V;

ILWMZHV = a1*b1 + a4*b1*LOW_W + a5*b1*MED_Z + a1*b2*HIGH_V +
a4*b2*LOW_W*HIGH_V + a5*b2*MED_Z*HIGH_V;
IMWMZHV = a1*b1 + a4*b1*MED_W + a5*b1*MED_Z + a1*b2*HIGH_V +
a4*b2*MED_W*HIGH_V + a5*b2*MED_Z*HIGH_V;
IHWMZHV = a1*b1 + a4*b1*HIGH_W + a5*b1*MED_Z + a1*b2*HIGH_V +
a4*b2*HIGH_W*HIGH_V + a5*b2*MED_Z*HIGH_V;

ILWHZHV = a1*b1 + a4*b1*LOW_W + a5*b1*HIGH_Z + a1*b2*HIGH_V +
a4*b2*LOW_W*HIGH_V + a5*b2*HIGH_Z*HIGH_V;
IMWHZHV = a1*b1 + a4*b1*MED_W + a5*b1*HIGH_Z + a1*b2*HIGH_V +
a4*b2*MED_W*HIGH_V + a5*b2*HIGH_Z*HIGH_V;
IHWHZHV = a1*b1 + a4*b1*HIGH_W + a5*b1*HIGH_Z + a1*b2*HIGH_V +
a4*b2*HIGH_W*HIGH_V + a5*b2*HIGH_Z*HIGH_V;

! Calc conditional direct effects for each combination of moderator values

DLWLZLV = cdash1 + cdash4*LOW_W + cdash5*LOW_Z + cdash7*LOW_V;
DMWLZLV = cdash1 + cdash4*MED_W + cdash5*LOW_Z + cdash7*LOW_V;
DHWLZLV = cdash1 + cdash4*HIGH_W + cdash5*LOW_Z + cdash7*LOW_V;

DLWMZLV = cdash1 + cdash4*LOW_W + cdash5*MED_Z + cdash7*LOW_V;
DMWMZLV = cdash1 + cdash4*MED_W + cdash5*MED_Z + cdash7*LOW_V;
DHWMZLV = cdash1 + cdash4*HIGH_W + cdash5*MED_Z + cdash7*LOW_V;

DLWHZLV = cdash1 + cdash4*LOW_W + cdash5*HIGH_Z + cdash7*LOW_V;
DMWHZLV = cdash1 + cdash4*MED_W + cdash5*HIGH_Z + cdash7*LOW_V;
DHWHZLV = cdash1 + cdash4*HIGH_W + cdash5*HIGH_Z + cdash7*LOW_V;

DLWLZMV = cdash1 + cdash4*LOW_W + cdash5*LOW_Z + cdash7*MED_V;
DMWLZMV = cdash1 + cdash4*MED_W + cdash5*LOW_Z + cdash7*MED_V;
DHWLZMV = cdash1 + cdash4*HIGH_W + cdash5*LOW_Z + cdash7*MED_V;

DLWMZMV = cdash1 + cdash4*LOW_W + cdash5*MED_Z + cdash7*MED_V;
DMWMZMV = cdash1 + cdash4*MED_W + cdash5*MED_Z + cdash7*MED_V;
DHWMZMV = cdash1 + cdash4*HIGH_W + cdash5*MED_Z + cdash7*MED_V;

DLWHZMV = cdash1 + cdash4*LOW_W + cdash5*HIGH_Z + cdash7*MED_V;
DMWHZMV = cdash1 + cdash4*MED_W + cdash5*HIGH_Z + cdash7*MED_V;
DHWHZMV = cdash1 + cdash4*HIGH_W + cdash5*HIGH_Z + cdash7*MED_V;

DLWLZHV = cdash1 + cdash4*LOW_W + cdash5*LOW_Z + cdash7*HIGH_V;
DMWLZHV = cdash1 + cdash4*MED_W + cdash5*LOW_Z + cdash7*HIGH_V;
DHWLZHV = cdash1 + cdash4*HIGH_W + cdash5*LOW_Z + cdash7*HIGH_V;

DLWMZHV = cdash1 + cdash4*LOW_W + cdash5*MED_Z + cdash7*HIGH_V;
DMWMZHV = cdash1 + cdash4*MED_W + cdash5*MED_Z + cdash7*HIGH_V;
DHWMZHV = cdash1 + cdash4*HIGH_W + cdash5*MED_Z + cdash7*HIGH_V;

DLWHZHV = cdash1 + cdash4*LOW_W + cdash5*HIGH_Z + cdash7*HIGH_V;
DMWHZHV = cdash1 + cdash4*MED_W + cdash5*HIGH_Z + cdash7*HIGH_V;
DHWHZHV = cdash1 + cdash4*HIGH_W + cdash5*HIGH_Z + cdash7*HIGH_V;

! Calc conditional total effects for each combination of moderator values

TLWLZLV = ILWLZLV + DLWLZLV;
TMWLZLV = IMWLZLV + DMWLZLV;
THWLZLV = IHWLZLV + DHWLZLV;

TLWMZLV = ILWMZLV + DLWMZLV;
TMWMZLV = IMWMZLV + DMWMZLV;
THWMZLV = IHWMZLV + DHWMZLV;

TLWHZLV = ILWHZLV + DLWHZLV;
TMWHZLV = IMWHZLV + DMWHZLV;
THWHZLV = IHWHZLV + DHWHZLV;

TLWLZMV = ILWLZMV + DLWLZMV;
TMWLZMV = IMWLZMV + DMWLZMV;
THWLZMV = IHWLZMV + DHWLZMV;

TLWMZMV = ILWMZMV + DLWMZMV;
TMWMZMV = IMWMZMV + DMWMZMV;
THWMZMV = IHWMZMV + DHWMZMV;

TLWHZMV = ILWHZMV + DLWHZMV;
TMWHZMV = IMWHZMV + DMWHZMV;
THWHZMV = IHWHZMV + DHWHZMV;

TLWLZHV = ILWLZHV + DLWLZHV;
TMWLZHV = IMWLZHV + DMWLZHV;
THWLZHV = IHWLZHV + DHWLZHV;

TLWMZHV = ILWMZHV + DLWMZHV;
TMWMZHV = IMWMZHV + DMWMZHV;
THWMZHV = IHWMZHV + DHWMZHV;

TLWHZHV = ILWHZHV + DLWHZHV;
TMWHZHV = IMWHZHV + DMWHZHV;
THWHZHV = IHWHZHV + DHWHZHV;

! Use loop plot to plot conditional indirect effect of X on Y for each combination of low, med, high moderator values
! Could be edited to show conditional direct or conditional total effects instead
! NOTE - values of 1,5 in LOOP() statement need to be replaced by
! logical min and max limits of predictor X used in analysis

PLOT(PLWLZLV PMWLZLV PHWLZLV PLWMZLV PMWMZLV PHWMZLV
PLWHZLV PMWHZLV PHWHZLV
PLWLZMV PMWLZMV PHWLZMV PLWMZMV PMWMZMV PHWMZMV
PLWHZMV PMWHZMV PHWHZMV
PLWLZHV PMWLZHV PHWLZHV PLWMZHV PMWMZHV PHWMZHV
PLWHZHV PMWHZHV PHWHZHV);

LOOP(XVAL,1,5,0.1);

PLWLZLV = ILWLZLV*XVAL;
PMWLZLV = IMWLZLV*XVAL;
PHWLZLV = IHWLZLV*XVAL;

PLWMZLV = ILWMZLV*XVAL;
PMWMZLV = IMWMZLV*XVAL;
PHWMZLV = IHWMZLV*XVAL;

PLWHZLV = ILWHZLV*XVAL;
PMWHZLV = IMWHZLV*XVAL;
PHWHZLV = IHWHZLV*XVAL;

PLWLZMV = ILWLZMV*XVAL;
PMWLZMV = IMWLZMV*XVAL;
PHWLZMV = IHWLZMV*XVAL;

PLWMZMV = ILWMZMV*XVAL;
PMWMZMV = IMWMZMV*XVAL;
PHWMZMV = IHWMZMV*XVAL;

PLWHZMV = ILWHZMV*XVAL;
PMWHZMV = IMWHZMV*XVAL;
PHWHZMV = IHWHZMV*XVAL;

PLWLZHV = ILWLZHV*XVAL;
PMWLZHV = IMWLZHV*XVAL;
PHWLZHV = IHWLZHV*XVAL;

PLWMZHV = ILWMZHV*XVAL;
PMWMZHV = IMWMZHV*XVAL;
PHWMZHV = IHWMZHV*XVAL;

PLWHZHV = ILWHZHV*XVAL;
PMWHZHV = IMWHZHV*XVAL;
PHWHZHV = IHWHZHV*XVAL;

PLOT:
TYPE = plot2;

OUTPUT:
STAND CINT(bcbootstrap);