! 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 WZ MV XWZ;
! 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;
   WZ = W*Z;
   XWZ = X*W*Z;
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 V (b2);
   Y ON MV (b3);
   Y ON X (cdash);
   [M] (a0);
   M ON X (a1);
   M ON W (a2);
   M ON Z (a3);
   M ON XW (a4);
   M ON XZ (a5);
   M ON WZ (a6);
   M ON XWZ (a7);
! 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
    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 + a7*b1*LOW_W*LOW_Z +
     a1*b3*LOW_V + a4*b3*LOW_W*LOW_V + a5*b3*LOW_Z*LOW_V +
     a7*b3*LOW_W*LOW_Z*LOW_V;
    IMWLZLV = a1*b1 + a4*b1*MED_W + a5*b1*LOW_Z + a7*b1*MED_W*LOW_Z +
     a1*b3*LOW_V + a4*b3*MED_W*LOW_V + a5*b3*LOW_Z*LOW_V +
     a7*b3*MED_W*LOW_Z*LOW_V;
    IHWLZLV = a1*b1 + a4*b1*HIGH_W + a5*b1*LOW_Z + a7*b1*HIGH_W*LOW_Z +
     a1*b3*LOW_V + a4*b3*HIGH_W*LOW_V + a5*b3*LOW_Z*LOW_V +
     a7*b3*HIGH_W*LOW_Z*LOW_V;
    ILWMZLV = a1*b1 + a4*b1*LOW_W + a5*b1*MED_Z + a7*b1*LOW_W*MED_Z +
     a1*b3*LOW_V + a4*b3*LOW_W*LOW_V + a5*b3*MED_Z*LOW_V +
     a7*b3*LOW_W*MED_Z*LOW_V;
    IMWMZLV = a1*b1 + a4*b1*MED_W + a5*b1*MED_Z + a7*b1*MED_W*MED_Z +
     a1*b3*LOW_V + a4*b3*MED_W*LOW_V + a5*b3*MED_Z*LOW_V +
     a7*b3*MED_W*MED_Z*LOW_V;
    IHWMZLV = a1*b1 + a4*b1*HIGH_W + a5*b1*MED_Z + a7*b1*HIGH_W*MED_Z +
     a1*b3*LOW_V + a4*b3*HIGH_W*LOW_V + a5*b3*MED_Z*LOW_V +
     a7*b3*HIGH_W*MED_Z*LOW_V;
    ILWHZLV = a1*b1 + a4*b1*LOW_W + a5*b1*HIGH_Z + a7*b1*LOW_W*HIGH_Z +
     a1*b3*LOW_V + a4*b3*LOW_W*LOW_V + a5*b3*HIGH_Z*LOW_V +
     a7*b3*LOW_W*HIGH_Z*LOW_V;
    IMWHZLV = a1*b1 + a4*b1*MED_W + a5*b1*HIGH_Z + a7*b1*MED_W*HIGH_Z +
     a1*b3*LOW_V + a4*b3*MED_W*LOW_V + a5*b3*HIGH_Z*LOW_V +
     a7*b3*MED_W*HIGH_Z*LOW_V;
    IHWHZLV = a1*b1 + a4*b1*HIGH_W + a5*b1*HIGH_Z + a7*b1*HIGH_W*HIGH_Z +
     a1*b3*LOW_V + a4*b3*HIGH_W*LOW_V + a5*b3*HIGH_Z*LOW_V +
     a7*b3*HIGH_W*HIGH_Z*LOW_V;
    ILWLZMV = a1*b1 + a4*b1*LOW_W + a5*b1*LOW_Z + a7*b1*LOW_W*LOW_Z +
     a1*b3*MED_V + a4*b3*LOW_W*MED_V + a5*b3*LOW_Z*MED_V +
     a7*b3*LOW_W*LOW_Z*MED_V;
    IMWLZMV = a1*b1 + a4*b1*MED_W + a5*b1*LOW_Z + a7*b1*MED_W*LOW_Z +
     a1*b3*MED_V + a4*b3*MED_W*MED_V + a5*b3*LOW_Z*MED_V +
     a7*b3*MED_W*LOW_Z*MED_V;
    IHWLZMV = a1*b1 + a4*b1*HIGH_W + a5*b1*LOW_Z + a7*b1*HIGH_W*LOW_Z +
     a1*b3*MED_V + a4*b3*HIGH_W*MED_V + a5*b3*LOW_Z*MED_V +
     a7*b3*HIGH_W*LOW_Z*MED_V;
    ILWMZMV = a1*b1 + a4*b1*LOW_W + a5*b1*MED_Z + a7*b1*LOW_W*MED_Z +
     a1*b3*MED_V + a4*b3*LOW_W*MED_V + a5*b3*MED_Z*MED_V +
     a7*b3*LOW_W*MED_Z*MED_V;
    IMWMZMV = a1*b1 + a4*b1*MED_W + a5*b1*MED_Z + a7*b1*MED_W*MED_Z +
     a1*b3*MED_V + a4*b3*MED_W*MED_V + a5*b3*MED_Z*MED_V +
     a7*b3*MED_W*MED_Z*MED_V;
    IHWMZMV = a1*b1 + a4*b1*HIGH_W + a5*b1*MED_Z + a7*b1*HIGH_W*MED_Z +
     a1*b3*MED_V + a4*b3*HIGH_W*MED_V + a5*b3*MED_Z*MED_V +
     a7*b3*HIGH_W*MED_Z*MED_V;
    ILWHZMV = a1*b1 + a4*b1*LOW_W + a5*b1*HIGH_Z + a7*b1*LOW_W*HIGH_Z +
     a1*b3*MED_V + a4*b3*LOW_W*MED_V + a5*b3*HIGH_Z*MED_V +
     a7*b3*LOW_W*HIGH_Z*MED_V;
    IMWHZMV = a1*b1 + a4*b1*MED_W + a5*b1*HIGH_Z + a7*b1*MED_W*HIGH_Z +
     a1*b3*MED_V + a4*b3*MED_W*MED_V + a5*b3*HIGH_Z*MED_V +
     a7*b3*MED_W*HIGH_Z*MED_V;
    IHWHZMV = a1*b1 + a4*b1*HIGH_W + a5*b1*HIGH_Z + a7*b1*HIGH_W*HIGH_Z +
     a1*b3*MED_V + a4*b3*HIGH_W*MED_V + a5*b3*HIGH_Z*MED_V +
     a7*b3*HIGH_W*HIGH_Z*MED_V;
    ILWLZHV = a1*b1 + a4*b1*LOW_W + a5*b1*LOW_Z + a7*b1*LOW_W*LOW_Z +
     a1*b3*HIGH_V + a4*b3*LOW_W*HIGH_V + a5*b3*LOW_Z*HIGH_V +
     a7*b3*LOW_W*LOW_Z*HIGH_V;
    IMWLZHV = a1*b1 + a4*b1*MED_W + a5*b1*LOW_Z + a7*b1*MED_W*LOW_Z +
     a1*b3*HIGH_V + a4*b3*MED_W*HIGH_V + a5*b3*LOW_Z*HIGH_V +
     a7*b3*MED_W*LOW_Z*HIGH_V;
    IHWLZHV = a1*b1 + a4*b1*HIGH_W + a5*b1*LOW_Z + a7*b1*HIGH_W*LOW_Z +
     a1*b3*HIGH_V + a4*b3*HIGH_W*HIGH_V + a5*b3*LOW_Z*HIGH_V +
     a7*b3*HIGH_W*LOW_Z*HIGH_V;
    ILWMZHV = a1*b1 + a4*b1*LOW_W + a5*b1*MED_Z + a7*b1*LOW_W*MED_Z +
     a1*b3*HIGH_V + a4*b3*LOW_W*HIGH_V + a5*b3*MED_Z*HIGH_V +
     a7*b3*LOW_W*MED_Z*HIGH_V;
    IMWMZHV = a1*b1 + a4*b1*MED_W + a5*b1*MED_Z + a7*b1*MED_W*MED_Z +
     a1*b3*HIGH_V + a4*b3*MED_W*HIGH_V + a5*b3*MED_Z*HIGH_V +
     a7*b3*MED_W*MED_Z*HIGH_V;
    IHWMZHV = a1*b1 + a4*b1*HIGH_W + a5*b1*MED_Z + a7*b1*HIGH_W*MED_Z +
     a1*b3*HIGH_V + a4*b3*HIGH_W*HIGH_V + a5*b3*MED_Z*HIGH_V +
     a7*b3*HIGH_W*MED_Z*HIGH_V;
    ILWHZHV = a1*b1 + a4*b1*LOW_W + a5*b1*HIGH_Z + a7*b1*LOW_W*HIGH_Z +
     a1*b3*HIGH_V + a4*b3*LOW_W*HIGH_V + a5*b3*HIGH_Z*HIGH_V +
     a7*b3*LOW_W*HIGH_Z*HIGH_V;
    IMWHZHV = a1*b1 + a4*b1*MED_W + a5*b1*HIGH_Z + a7*b1*MED_W*HIGH_Z +
     a1*b3*HIGH_V + a4*b3*MED_W*HIGH_V + a5*b3*HIGH_Z*HIGH_V +
     a7*b3*MED_W*HIGH_Z*HIGH_V;
    IHWHZHV = a1*b1 + a4*b1*HIGH_W + a5*b1*HIGH_Z + a7*b1*HIGH_W*HIGH_Z +
     a1*b3*HIGH_V + a4*b3*HIGH_W*HIGH_V + a5*b3*HIGH_Z*HIGH_V +
     a7*b3*HIGH_W*HIGH_Z*HIGH_V;
! Calc conditional total effects for each combination of moderator values
    TLWLZLV = ILWLZLV + cdash;
    TMWLZLV = IMWLZLV + cdash;
    THWLZLV = IHWLZLV + cdash;
    TLWMZLV = ILWMZLV + cdash;
    TMWMZLV = IMWMZLV + cdash;
    THWMZLV = IHWMZLV + cdash;
    TLWHZLV = ILWHZLV + cdash;
    TMWHZLV = IMWHZLV + cdash;
    THWHZLV = IHWHZLV + cdash;
    TLWLZMV = ILWLZMV + cdash;
    TMWLZMV = IMWLZMV + cdash;
    THWLZMV = IHWLZMV + cdash;
    TLWMZMV = ILWMZMV + cdash;
    TMWMZMV = IMWMZMV + cdash;
    THWMZMV = IHWMZMV + cdash;
    TLWHZMV = ILWHZMV + cdash;
    TMWHZMV = IMWHZMV + cdash;
    THWHZMV = IHWHZMV + cdash;
    TLWLZHV = ILWLZHV + cdash;
    TMWLZHV = IMWLZHV + cdash;
    THWLZHV = IHWLZHV + cdash;
    TLWMZHV = ILWMZHV + cdash;
    TMWMZHV = IMWMZHV + cdash;
    THWMZHV = IHWMZHV + cdash;
    TLWHZHV = ILWHZHV + cdash;
    TMWHZHV = IMWHZHV + cdash;
    THWHZHV = IHWHZHV + cdash;
! 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);