! Predictor variable - X
! Mediator variable(s) – M
! Moderator variable(s) – W, V, Q
! Outcome variable - Y
USEVARIABLES = X M W V Q Y XW XV XQ MV MQ;
! Create interaction terms
! Note that they have to be placed at end of USEVARIABLES subcommand above
DEFINE:
   MQ = M*Q;
   MV = M*V;
   XW = X*W;
   XQ = X*Q;
   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 MQ (b3);
   Y ON X (cdash1);
   Y ON W (cdash2);
   Y ON XW (cdash3);
   Y ON V (cdash4);
   Y ON Q (cdash5);
   Y ON XV (cdash6);
   Y ON XQ (cdash7);
   [M] (a0);
   M ON X (a1);
   M ON W (a2);
   M ON XW (a3);
! Use model constraint subcommand to test conditional indirect effects
! You need to pick low, medium and high moderator values for W, V, Q
! 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_V MED_V HIGH_V LOW_Q MED_Q HIGH_Q
    ILWLVLQ IMWLVLQ IHWLVLQ ILWMVLQ IMWMVLQ IHWMVLQ
    ILWHVLQ IMWHVLQ IHWHVLQ
    ILWLVMQ IMWLVMQ IHWLVMQ ILWMVMQ IMWMVMQ IHWMVMQ
    ILWHVMQ IMWHVMQ IHWHVMQ
    ILWLVHQ IMWLVHQ IHWLVHQ ILWMVHQ IMWMVHQ IHWMVHQ
    ILWHVHQ IMWHVHQ IHWHVHQ
    DLWLVLQ DMWLVLQ DHWLVLQ DLWMVLQ DMWMVLQ DHWMVLQ
    DLWHVLQ DMWHVLQ DHWHVLQ
    DLWLVMQ DMWLVMQ DHWLVMQ DLWMVMQ DMWMVMQ DHWMVMQ
    DLWHVMQ DMWHVMQ DHWHVMQ
    DLWLVHQ DMWLVHQ DHWLVHQ DLWMVHQ DMWMVHQ DHWMVHQ
    DLWHVHQ DMWHVHQ DHWHVHQ
    TLWLVLQ TMWLVLQ THWLVLQ TLWMVLQ TMWMVLQ THWMVLQ
    TLWHVLQ TMWHVLQ THWHVLQ
    TLWLVMQ TMWLVMQ THWLVMQ TLWMVMQ TMWMVMQ THWMVMQ
    TLWHVMQ TMWHVMQ THWHVMQ
    TLWLVHQ TMWLVHQ THWLVHQ TLWMVHQ TMWMVHQ THWMVHQ
    TLWHVHQ TMWHVHQ THWHVHQ);
    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_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
    LOW_Q = #LOWQ;   ! replace #LOWQ in the code with your chosen low value of Q
    MED_Q = #MEDQ;   ! replace #MEDQ in the code with your chosen medium value of Q
    HIGH_Q = #HIGHQ;   ! replace #HIGHQ in the code with your chosen high value of Q
! Calc conditional indirect effects for each combination of moderator values
    ILWLVLQ = a1*b1 + a3*b1*LOW_W + a1*b2*LOW_V + a3*b2*LOW_W*LOW_V +
     a1*b3*LOW_Q + a3*b3*LOW_W*LOW_Q;
    IMWLVLQ = a1*b1 + a3*b1*MED_W + a1*b2*LOW_V + a3*b2*MED_W*LOW_V +
     a1*b3*LOW_Q + a3*b3*MED_W*LOW_Q;
    IHWLVLQ = a1*b1 + a3*b1*HIGH_W + a1*b2*LOW_V + a3*b2*HIGH_W*LOW_V +
     a1*b3*LOW_Q + a3*b3*HIGH_W*LOW_Q;
    ILWMVLQ = a1*b1 + a3*b1*LOW_W + a1*b2*MED_V + a3*b2*LOW_W*MED_V +
     a1*b3*LOW_Q + a3*b3*LOW_W*LOW_Q;
    IMWMVLQ = a1*b1 + a3*b1*MED_W + a1*b2*MED_V + a3*b2*MED_W*MED_V +
     a1*b3*LOW_Q + a3*b3*MED_W*LOW_Q;
    IHWMVLQ = a1*b1 + a3*b1*HIGH_W + a1*b2*MED_V + a3*b2*HIGH_W*MED_V +
     a1*b3*LOW_Q + a3*b3*HIGH_W*LOW_Q;
    ILWHVLQ = a1*b1 + a3*b1*LOW_W + a1*b2*HIGH_V + a3*b2*LOW_W*HIGH_V +
     a1*b3*LOW_Q + a3*b3*LOW_W*LOW_Q;
    IMWHVLQ = a1*b1 + a3*b1*MED_W + a1*b2*HIGH_V + a3*b2*MED_W*HIGH_V +
     a1*b3*LOW_Q + a3*b3*MED_W*LOW_Q;
    IHWHVLQ = a1*b1 + a3*b1*HIGH_W + a1*b2*HIGH_V + a3*b2*HIGH_W*HIGH_V +
     a1*b3*LOW_Q + a3*b3*HIGH_W*LOW_Q;
    ILWLVMQ = a1*b1 + a3*b1*LOW_W + a1*b2*LOW_V + a3*b2*LOW_W*LOW_V +
     a1*b3*MED_Q + a3*b3*LOW_W*MED_Q;
    IMWLVMQ = a1*b1 + a3*b1*MED_W + a1*b2*LOW_V + a3*b2*MED_W*LOW_V +
     a1*b3*MED_Q + a3*b3*MED_W*MED_Q;
    IHWLVMQ = a1*b1 + a3*b1*HIGH_W + a1*b2*LOW_V + a3*b2*HIGH_W*LOW_V +
     a1*b3*MED_Q + a3*b3*HIGH_W*MED_Q;
    ILWMVMQ = a1*b1 + a3*b1*LOW_W + a1*b2*MED_V + a3*b2*LOW_W*MED_V +
     a1*b3*MED_Q + a3*b3*LOW_W*MED_Q;
    IMWMVMQ = a1*b1 + a3*b1*MED_W + a1*b2*MED_V + a3*b2*MED_W*MED_V +
     a1*b3*MED_Q + a3*b3*MED_W*MED_Q;
    IHWMVMQ = a1*b1 + a3*b1*HIGH_W + a1*b2*MED_V + a3*b2*HIGH_W*MED_V +
     a1*b3*MED_Q + a3*b3*HIGH_W*MED_Q;
    ILWHVMQ = a1*b1 + a3*b1*LOW_W + a1*b2*HIGH_V + a3*b2*LOW_W*HIGH_V +
     a1*b3*MED_Q + a3*b3*LOW_W*MED_Q;
    IMWHVMQ = a1*b1 + a3*b1*MED_W + a1*b2*HIGH_V + a3*b2*MED_W*HIGH_V +
     a1*b3*MED_Q + a3*b3*MED_W*MED_Q;
    IHWHVMQ = a1*b1 + a3*b1*HIGH_W + a1*b2*HIGH_V + a3*b2*HIGH_W*HIGH_V +
     a1*b3*MED_Q + a3*b3*HIGH_W*MED_Q;
    ILWLVHQ = a1*b1 + a3*b1*LOW_W + a1*b2*LOW_V + a3*b2*LOW_W*LOW_V +
     a1*b3*HIGH_Q + a3*b3*LOW_W*HIGH_Q;
    IMWLVHQ = a1*b1 + a3*b1*MED_W + a1*b2*LOW_V + a3*b2*MED_W*LOW_V +
     a1*b3*HIGH_Q + a3*b3*MED_W*HIGH_Q;
    IHWLVHQ = a1*b1 + a3*b1*HIGH_W + a1*b2*LOW_V + a3*b2*HIGH_W*LOW_V +
     a1*b3*HIGH_Q + a3*b3*HIGH_W*HIGH_Q;
    ILWMVHQ = a1*b1 + a3*b1*LOW_W + a1*b2*MED_V + a3*b2*LOW_W*MED_V +
     a1*b3*HIGH_Q + a3*b3*LOW_W*HIGH_Q;
    IMWMVHQ = a1*b1 + a3*b1*MED_W + a1*b2*MED_V + a3*b2*MED_W*MED_V +
     a1*b3*HIGH_Q + a3*b3*MED_W*HIGH_Q;
    IHWMVHQ = a1*b1 + a3*b1*HIGH_W + a1*b2*MED_V + a3*b2*HIGH_W*MED_V +
     a1*b3*HIGH_Q + a3*b3*HIGH_W*HIGH_Q;
    ILWHVHQ = a1*b1 + a3*b1*LOW_W + a1*b2*HIGH_V + a3*b2*LOW_W*HIGH_V +
     a1*b3*HIGH_Q + a3*b3*LOW_W*HIGH_Q;
    IMWHVHQ = a1*b1 + a3*b1*MED_W + a1*b2*HIGH_V + a3*b2*MED_W*HIGH_V +
     a1*b3*HIGH_Q + a3*b3*MED_W*HIGH_Q;
    IHWHVHQ = a1*b1 + a3*b1*HIGH_W + a1*b2*HIGH_V + a3*b2*HIGH_W*HIGH_V +
     a1*b3*HIGH_Q + a3*b3*HIGH_W*HIGH_Q;
! Calc conditional direct effects for each combination of moderator values
    DLWLVLQ = cdash1 + cdash3*LOW_W + cdash6*LOW_V + cdash7*LOW_Q;
    DMWLVLQ = cdash1 + cdash3*MED_W + cdash6*LOW_V + cdash7*LOW_Q;
    DHWLVLQ = cdash1 + cdash3*HIGH_W + cdash6*LOW_V + cdash7*LOW_Q;
    DLWMVLQ = cdash1 + cdash3*LOW_W + cdash6*MED_V + cdash7*LOW_Q;
    DMWMVLQ = cdash1 + cdash3*MED_W + cdash6*MED_V + cdash7*LOW_Q;
    DHWMVLQ = cdash1 + cdash3*HIGH_W + cdash6*MED_V + cdash7*LOW_Q;
    DLWHVLQ = cdash1 + cdash3*LOW_W + cdash6*HIGH_V + cdash7*LOW_Q;
    DMWHVLQ = cdash1 + cdash3*MED_W + cdash6*HIGH_V + cdash7*LOW_Q;
    DHWHVLQ = cdash1 + cdash3*HIGH_W + cdash6*HIGH_V + cdash7*LOW_Q;
    DLWLVMQ = cdash1 + cdash3*LOW_W + cdash6*LOW_V + cdash7*MED_Q;
    DMWLVMQ = cdash1 + cdash3*MED_W + cdash6*LOW_V + cdash7*MED_Q;
    DHWLVMQ = cdash1 + cdash3*HIGH_W + cdash6*LOW_V + cdash7*MED_Q;
    DLWMVMQ = cdash1 + cdash3*LOW_W + cdash6*MED_V + cdash7*MED_Q;
    DMWMVMQ = cdash1 + cdash3*MED_W + cdash6*MED_V + cdash7*MED_Q;
    DHWMVMQ = cdash1 + cdash3*HIGH_W + cdash6*MED_V + cdash7*MED_Q;
    DLWHVMQ = cdash1 + cdash3*LOW_W + cdash6*HIGH_V + cdash7*MED_Q;
    DMWHVMQ = cdash1 + cdash3*MED_W + cdash6*HIGH_V + cdash7*MED_Q;
    DHWHVMQ = cdash1 + cdash3*HIGH_W + cdash6*HIGH_V + cdash7*MED_Q;
    DLWLVHQ = cdash1 + cdash3*LOW_W + cdash6*LOW_V + cdash7*HIGH_Q;
    DMWLVHQ = cdash1 + cdash3*MED_W + cdash6*LOW_V + cdash7*HIGH_Q;
    DHWLVHQ = cdash1 + cdash3*HIGH_W + cdash6*LOW_V + cdash7*HIGH_Q;
    DLWMVHQ = cdash1 + cdash3*LOW_W + cdash6*MED_V + cdash7*HIGH_Q;
    DMWMVHQ = cdash1 + cdash3*MED_W + cdash6*MED_V + cdash7*HIGH_Q;
    DHWMVHQ = cdash1 + cdash3*HIGH_W + cdash6*MED_V + cdash7*HIGH_Q;
    DLWHVHQ = cdash1 + cdash3*LOW_W + cdash6*HIGH_V + cdash7*HIGH_Q;
    DMWHVHQ = cdash1 + cdash3*MED_W + cdash6*HIGH_V + cdash7*HIGH_Q;
    DHWHVHQ = cdash1 + cdash3*HIGH_W + cdash6*HIGH_V + cdash7*HIGH_Q;
! Calc conditional total effects for each combination of moderator values
    TLWLVLQ = ILWLVLQ + DLWLVLQ;
    TMWLVLQ = IMWLVLQ + DMWLVLQ;
    THWLVLQ = IHWLVLQ + DHWLVLQ;
    TLWMVLQ = ILWMVLQ + DLWMVLQ;
    TMWMVLQ = IMWMVLQ + DMWMVLQ;
    THWMVLQ = IHWMVLQ + DHWMVLQ;
    TLWHVLQ = ILWHVLQ + DLWHVLQ;
    TMWHVLQ = IMWHVLQ + DMWHVLQ;
    THWHVLQ = IHWHVLQ + DHWHVLQ;
    TLWLVMQ = ILWLVMQ + DLWLVMQ;
    TMWLVMQ = IMWLVMQ + DMWLVMQ;
    THWLVMQ = IHWLVMQ + DHWLVMQ;
    TLWMVMQ = ILWMVMQ + DLWMVMQ;
    TMWMVMQ = IMWMVMQ + DMWMVMQ;
    THWMVMQ = IHWMVMQ + DHWMVMQ;
    TLWHVMQ = ILWHVMQ + DLWHVMQ;
    TMWHVMQ = IMWHVMQ + DMWHVMQ;
    THWHVMQ = IHWHVMQ + DHWHVMQ;
    TLWLVHQ = ILWLVHQ + DLWLVHQ;
    TMWLVHQ = IMWLVHQ + DMWLVHQ;
    THWLVHQ = IHWLVHQ + DHWLVHQ;
    TLWMVHQ = ILWMVHQ + DLWMVHQ;
    TMWMVHQ = IMWMVHQ + DMWMVHQ;
    THWMVHQ = IHWMVHQ + DHWMVHQ;
    TLWHVHQ = ILWHVHQ + DLWHVHQ;
    TMWHVHQ = IMWHVHQ + DMWHVHQ;
    THWHVHQ = IHWHVHQ + DHWHVHQ;
! 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(PLWLVLQ PMWLVLQ PHWLVLQ PLWMVLQ PMWMVLQ PHWMVLQ
    PLWHVLQ PMWHVLQ PHWHVLQ
    PLWLVMQ PMWLVMQ PHWLVMQ PLWMVMQ PMWMVMQ PHWMVMQ
    PLWHVMQ PMWHVMQ PHWHVMQ
    PLWLVHQ PMWLVHQ PHWLVHQ PLWMVHQ PMWMVHQ PHWMVHQ
    PLWHVHQ PMWHVHQ PHWHVHQ);
    LOOP(XVAL,1,5,0.1);
    PLWLVLQ = ILWLVLQ*XVAL;
    PMWLVLQ = IMWLVLQ*XVAL;
    PHWLVLQ = IHWLVLQ*XVAL;
    PLWMVLQ = ILWMVLQ*XVAL;
    PMWMVLQ = IMWMVLQ*XVAL;
    PHWMVLQ = IHWMVLQ*XVAL;
    PLWHVLQ = ILWHVLQ*XVAL;
    PMWHVLQ = IMWHVLQ*XVAL;
    PHWHVLQ = IHWHVLQ*XVAL;
    PLWLVMQ = ILWLVMQ*XVAL;
    PMWLVMQ = IMWLVMQ*XVAL;
    PHWLVMQ = IHWLVMQ*XVAL;
    PLWMVMQ = ILWMVMQ*XVAL;
    PMWMVMQ = IMWMVMQ*XVAL;
    PHWMVMQ = IHWMVMQ*XVAL;
    PLWHVMQ = ILWHVMQ*XVAL;
    PMWHVMQ = IMWHVMQ*XVAL;
    PHWHVMQ = IHWHVMQ*XVAL;
    PLWLVHQ = ILWLVHQ*XVAL;
    PMWLVHQ = IMWLVHQ*XVAL;
    PHWLVHQ = IHWLVHQ*XVAL;
    PLWMVHQ = ILWMVHQ*XVAL;
    PMWMVHQ = IMWMVHQ*XVAL;
    PHWMVHQ = IHWMVHQ*XVAL;
    PLWHVHQ = ILWHVHQ*XVAL;
    PMWHVHQ = IMWHVHQ*XVAL;
    PHWHVHQ = IHWHVHQ*XVAL;
PLOT:
   TYPE = plot2;
OUTPUT:
   STAND CINT(bcbootstrap);