Skip to Main Content

How can I do moderated mediation with a categorical moderator using sem? | Stata FAQ

This page is just an extension of How can I do moderated mediation
in Stata?
to include a categorical moderator variables.
We will call that page modmed. If
you are unfamiliar with moderated mediation you should review the modmed
FAQ page before continuing on with this page.

We will to use the same data and the same abbreviated variable names as were used on the
modmed page. The model is not of substantive interest, it is merely
used to show the steps involved in the analysis.

use https://stats.idre.ucla.edu/stat/data/hsbdemo, clear
rename science y  /* dependent variable   */
rename math x     /* independent variable */
rename read m     /* mediator variable    */
rename female w   /* moderator variable with 2 levels */
rename socst cv   /* continuous covariate */

The modmed page presented five different models for moderated mediation.
This page will cover models 5, 2 and 3, to illustrate the use of categorical moderators.
The diagram for model 5 looks like this:

Model 5
Image model5s

First pass using sem

The trick to using sem for moderated mediation with a categorical moderator
is to do a multiple group
analysis using the group option. Please note, there are no explicit
interactions in the model. The interactions are implicit in the multiple group analysis
itself. Here is our first try.

sem (m <- x cv)(y <- m x cv), group(w)

Endogenous variables

Observed:  m y

Exogenous variables

Observed:  x cv

Fitting target model:

Iteration 0:   log likelihood = -2792.7769  
Iteration 1:   log likelihood = -2792.7769  

Structural equation model                       Number of obs      =       200
Grouping variable  = w                          Number of groups   =         2
Estimation method  = ml
Log likelihood     = -2792.7769

------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4461113     .09393     4.75   0.000      .262012    .6302107
      female |   .5523602   .0843711     6.55   0.000     .3869959    .7177244
    cv       |
        male |   .3687237   .0800976     4.60   0.000     .2117353     .525712
      female |   .3444715   .0754397     4.57   0.000     .1966124    .4923306
    _cons    |
        male |   10.10814    4.69041     2.16   0.031     .9151099    19.30118
      female |   4.564765   3.855135     1.18   0.236    -2.991162    12.12069
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |   .4504614   .1045896     4.31   0.000     .2454696    .6554532
      female |    .211106   .0977165     2.16   0.031     .0195853    .4026267
    x        |
        male |   .3523138   .1046885     3.37   0.001     .1471281    .5574996
      female |    .452633   .1015976     4.46   0.000     .2535052    .6517607
    cv       |
        male |   .0497414   .0887335     0.56   0.575    -.1241731     .223656
      female |   .0458989   .0840018     0.55   0.585    -.1187416    .2105395
    _cons    |
        male |   8.206073   4.797652     1.71   0.087    -1.197152     17.6093
      female |   13.63157   3.958183     3.44   0.001     5.873677    21.38947
-------------+----------------------------------------------------------------
Variance     |
  e.m        |
        male |   55.76584   8.267278                        41.704    74.56907
      female |   41.59327   5.634104                      31.89494    54.24058
  e.y        |
        male |   55.51193   8.229635                      41.51411    74.22955
      female |   43.28974   5.863902                      33.19584     56.4529
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0)   =      0.00, Prob > chi2 =      .

This isn’t too bad. We are getting separate male and female coefficients for both
x and m. However, we are also getting separate
coefficients for cv and separate residual variances in each equations.
In a traditional moderated mediation model these values are not part of the interaction.
So, we will need to constrain the coefficients for cv and residual variances to
be equal in both equations. Here is how to do that.

Model 5 constraining the covariate to be equal across groups

Equations that begin with 0: refer to the male group and equations that begin with 1: refer
to the female group. To constrain values use a ‘@’ and a name. Terms with the same name
will be constrained to be equal. For example, the term cv@c1 will be
constrained to be equal in both equations.

sem (0: m <- x cv@c1)(0: y <- m x cv@c2) ///
    (1: m <- x cv@c1)(1: y <- m x cv@c2), group(w) ///
    variance(0: e.m@v1 e.y@v2) ///
    variance(1: e.m@v1 e.y@v2)

Endogenous variables

Observed:  m y

Exogenous variables

Observed:  x cv

Fitting target model:

Iteration 0:   log likelihood = -2795.5195  
Iteration 1:   log likelihood = -2794.6484  
Iteration 2:   log likelihood = -2794.6438  
Iteration 3:   log likelihood = -2794.6438  

Structural equation model                       Number of obs      =       200
Grouping variable  = w                          Number of groups   =         2
Estimation method  = ml
Log likelihood     = -2794.6438

 ( 1)  [m]0bn.w#c.cv - [m]1.w#c.cv = 0
 ( 2)  [y]0bn.w#c.cv - [y]1.w#c.cv = 0
 ( 3)  [var(e.m)]0bn.w - [var(e.m)]1.w = 0
 ( 4)  [var(e.y)]0bn.w - [var(e.y)]1.w = 0
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4525824   .0821032     5.51   0.000      .291663    .6135017
      female |   .5435942   .0815035     6.67   0.000     .3838503    .7033381
    cv       |
         [*] |   .3576463   .0548017     6.53   0.000     .2502369    .4650556
    _cons    |
        male |   10.33924   4.225914     2.45   0.014     2.056605    18.62188
      female |   4.326879   4.000737     1.08   0.279    -3.514422    12.16818
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |   .4513773   .0937037     4.82   0.000     .2677214    .6350331
      female |   .2101483   .0992473     2.12   0.034     .0156271    .4046694
    x        |
        male |   .3527524   .0972145     3.63   0.000     .1622155    .5432893
      female |   .4520144   .1061237     4.26   0.000     .2440157    .6600131
    cv       |
         [*] |   .0479536   .0608685     0.79   0.431    -.0713466    .1672537
    _cons    |
        male |   8.227069   4.450954     1.85   0.065    -.4966419    16.95078
      female |    13.6048   4.117905     3.30   0.001     5.533856    21.67575
-------------+----------------------------------------------------------------
Variance     |
  e.m        |
         [*] |   48.05346   4.805346                      39.50068    58.45812
  e.y        |
         [*] |   48.85108   4.885108                      40.15633    59.42843
------------------------------------------------------------------------------
Note: [*] identifies parameter estimates constrained to be equal across
      groups.
LR test of model vs. saturated: chi2(4)   =      3.73, Prob > chi2 = 0.4432

Now we can use the estat teffects to calculate the indirect
effects for both males and females.

estat teffects


Direct effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4525824   .0821032     5.51   0.000      .291663    .6135017
      female |   .5435942   .0815035     6.67   0.000     .3838503    .7033381
    cv       |
        male |   .3576463   .0548017     6.53   0.000     .2502369    .4650556
      female |   .3576463   .0548017     6.53   0.000     .2502369    .4650556
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |   .4513773   .0937037     4.82   0.000     .2677214    .6350331
      female |   .2101483   .0992473     2.12   0.034     .0156271    .4046694
    x        |
        male |   .3527524   .0972145     3.63   0.000     .1622155    .5432893
      female |   .4520144   .1061237     4.26   0.000     .2440157    .6600131
    cv       |
        male |   .0479536   .0608685     0.79   0.431    -.0713466    .1672537
      female |   .0479536   .0608685     0.79   0.431    -.0713466    .1672537
------------------------------------------------------------------------------


Indirect effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
         [*] |          0  (no path)
    cv       |
         [*] |          0  (no path)
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
         [*] |          0  (no path)
    x        |
        male |   .2042854   .0563196     3.63   0.000     .0939009    .3146699
      female |   .1142354   .0566038     2.02   0.044     .0032939    .2251768
    cv       |
        male |   .1614334   .0416532     3.88   0.000     .0797947    .2430722
      female |   .0751587    .037317     2.01   0.044     .0020188    .1482986
------------------------------------------------------------------------------
Note: [*] identifies parameter estimates constrained to be equal across
      groups.


Total effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4525824   .0821032     5.51   0.000      .291663    .6135017
      female |   .5435942   .0815035     6.67   0.000     .3838503    .7033381
    cv       |
        male |   .3576463   .0548017     6.53   0.000     .2502369    .4650556
      female |   .3576463   .0548017     6.53   0.000     .2502369    .4650556
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |   .4513773   .0937037     4.82   0.000     .2677214    .6350331
      female |   .2101483   .0992473     2.12   0.034     .0156271    .4046694
    x        |
        male |   .5570378   .0914805     6.09   0.000     .3777393    .7363362
      female |   .5662498   .0857084     6.61   0.000     .3982643    .7342352
    cv       |
        male |    .209387   .0638934     3.28   0.001     .0841582    .3346158
      female |   .1231123   .0621467     1.98   0.048     .0013071    .2449176
------------------------------------------------------------------------------

The indirect effect of x on y for males is .2042854 while
for females it is .1142354.

Next we will look at Model 2.

Model 2

Here is the diagram for Model 2.

Image model2s-1

For this model there is an interaction between w and x
only in the mediator equation so we have to constrain the coefficient for the mediator
to be equal in both equations in addition to the covariate and residuals.

sem (0: m <- x cv@c1)(0: y <- m@b1 x cv@c2) ///
    (1: m <- x cv@c1)(1: y <- m@b1 x cv@c2), group(w) ///
    variance(0: e.m@v1 e.y@v2) ///
    variance(1: e.m@v1 e.y@v2)

Endogenous variables

Observed:  m y

Exogenous variables

Observed:  x cv

Fitting target model:

Iteration 0:   log likelihood = -2880.2553  
Iteration 1:   log likelihood = -2814.5984  
Iteration 2:   log likelihood =  -2797.118  
Iteration 3:   log likelihood = -2796.3599  
Iteration 4:   log likelihood = -2796.3547  
Iteration 5:   log likelihood = -2796.3547  

Structural equation model                       Number of obs      =       200
Grouping variable  = w                          Number of groups   =         2
Estimation method  = ml
Log likelihood     = -2796.3547

 ( 1)  [y]0bn.w#c.m - [y]1.w#c.m = 0
 ( 2)  [m]0bn.w#c.cv - [m]1.w#c.cv = 0
 ( 3)  [y]0bn.w#c.cv - [y]1.w#c.cv = 0
 ( 4)  [var(e.m)]0bn.w - [var(e.m)]1.w = 0
 ( 5)  [var(e.y)]0bn.w - [var(e.y)]1.w = 0
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4525824   .0821032     5.51   0.000      .291663    .6135017
      female |   .5435942   .0815035     6.67   0.000     .3838503    .7033381
    cv       |
         [*] |   .3576463   .0548017     6.53   0.000     .2502369    .4650557
    _cons    |
        male |   10.33924   4.225914     2.45   0.014     2.056604    18.62188
      female |   4.326879   4.000738     1.08   0.279    -3.514423    12.16818
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
         [*] |   .3384145   .0719076     4.71   0.000     .1974781    .4793508
    x        |
        male |   .4260495   .0896114     4.75   0.000     .2504144    .6016846
      female |   .3501396    .091638     3.82   0.000     .1705324    .5297469
    cv       |
         [*] |   .0503993   .0613771     0.82   0.412    -.0698976    .1706962
    _cons    |
        male |   10.18685   4.361284     2.34   0.020     1.638888    18.73481
      female |   12.17734   4.080339     2.98   0.003     4.180026    20.17466
-------------+----------------------------------------------------------------
Variance     |
  e.m        |
         [*] |   48.05346   4.805346                      39.50068    58.45812
  e.y        |
         [*] |   49.69406   4.969406                      40.84927    60.45394
------------------------------------------------------------------------------
Note: [*] identifies parameter estimates constrained to be equal across
      groups.
LR test of model vs. saturated: chi2(5)   =      7.16, Prob > chi2 = 0.2093

estat teffects

Direct effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4525824   .0821032     5.51   0.000      .291663    .6135017
      female |   .5435942   .0815035     6.67   0.000     .3838503    .7033381
    cv       |
        male |   .3576463   .0548017     6.53   0.000     .2502369    .4650557
      female |   .3576463   .0548017     6.53   0.000     .2502369    .4650557
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |   .3384145   .0719076     4.71   0.000     .1974781    .4793508
      female |   .3384145   .0719076     4.71   0.000     .1974781    .4793508
    x        |
        male |   .4260495   .0896114     4.75   0.000     .2504144    .6016846
      female |   .3501396    .091638     3.82   0.000     .1705324    .5297469
    cv       |
        male |   .0503993   .0613771     0.82   0.412    -.0698976    .1706962
      female |   .0503993   .0613771     0.82   0.412    -.0698976    .1706962
------------------------------------------------------------------------------


Indirect effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
         [*] |          0  (no path)
    cv       |
         [*] |          0  (no path)
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
         [*] |          0  (no path)
    x        |
        male |   .1531604   .0427916     3.58   0.000     .0692904    .2370304
      female |   .1839601   .0478402     3.85   0.000     .0901952    .2777251
    cv       |
        male |   .1210327    .031707     3.82   0.000     .0588882    .1831772
      female |   .1210327    .031707     3.82   0.000     .0588882    .1831772
------------------------------------------------------------------------------
Note: [*] identifies parameter estimates constrained to be equal across
      groups.


Total effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .4525824   .0821032     5.51   0.000      .291663    .6135017
      female |   .5435942   .0815035     6.67   0.000     .3838503    .7033381
    cv       |
        male |   .3576463   .0548017     6.53   0.000     .2502369    .4650557
      female |   .3576463   .0548017     6.53   0.000     .2502369    .4650557
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |   .3384145   .0719076     4.71   0.000     .1974781    .4793508
      female |   .3384145   .0719076     4.71   0.000     .1974781    .4793508
    x        |
        male |     .57921   .0879948     6.58   0.000     .4067433    .7516766
      female |   .5340998    .087352     6.11   0.000     .3628929    .7053066
    cv       |
        male |    .171432   .0587342     2.92   0.004     .0563151    .2865488
      female |    .171432   .0587342     2.92   0.004     .0563151    .2865488
------------------------------------------------------------------------------

This time the indirect effect of x on y for males is .1531604 while
for females it is .1839601.

Next up is Model 3.

Model 3

Here is the diagram for Model 3.

Image model3s-1

For Model 3 the interaction term is only in the equation for the dependent variable, y.
To compute the indirect effect we will need to constrain the coefficient for x in
both equations along with cv and the residuals. In addition we will need to
constrain the constant, _cons to be equal in both groups for the first equation.

sem (0: m <- x@b1 cv@c1 _cons@i1)(0: y <- m x@b2 cv@c2) ///
    (1: m <- x@b1 cv@c1 _cons@i1)(1: y <- m x@b2 cv@c2), group(w) ///
    variance(0: e.m@v1 e.y@v2) ///
    variance(1: e.m@v1 e.y@v2)

Endogenous variables

Observed:  m y

Exogenous variables

Observed:  x cv

Fitting target model:

Iteration 0:   log likelihood = -2809.2798  
Iteration 1:   log likelihood =  -2797.463  
Iteration 2:   log likelihood = -2796.0327  
Iteration 3:   log likelihood = -2796.0196  
Iteration 4:   log likelihood = -2796.0196  

Structural equation model                       Number of obs      =       200
Grouping variable  = w                          Number of groups   =         2
Estimation method  = ml
Log likelihood     = -2796.0196

 ( 1)  [m]0bn.w#c.x - [m]1.w#c.x = 0
 ( 2)  [m]0bn.w#c.cv - [m]1.w#c.cv = 0
 ( 3)  [y]0bn.w#c.x - [y]1.w#c.x = 0
 ( 4)  [y]0bn.w#c.cv - [y]1.w#c.cv = 0
 ( 5)  [var(e.m)]0bn.w - [var(e.m)]1.w = 0
 ( 6)  [var(e.y)]0bn.w - [var(e.y)]1.w = 0
 ( 7)  [m]0bn.w - [m]1.w = 0
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
         [*] |   .5038419   .0628899     8.01   0.000     .3805799    .6271038
    cv       |
         [*] |     .35414     .05488     6.45   0.000     .2465771    .4617029
    _cons    |
         [*] |   7.146537   3.017773     2.37   0.018     1.231809    13.06126
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |    .425432   .0861437     4.94   0.000     .2565935    .5942706
      female |   .2444712   .0863545     2.83   0.005     .0752194    .4137229
    x        |
         [*] |   .3979248   .0727133     5.47   0.000     .2554093    .5404402
    cv       |
         [*] |   .0489704   .0609254     0.80   0.422    -.0704413     .168382
    _cons    |
        male |    7.15329   4.182562     1.71   0.087     -1.04438    15.35096
      female |   14.60934    3.86371     3.78   0.000     7.036603    22.18207
-------------+----------------------------------------------------------------
Variance     |
  e.m        |
         [*] |    48.6004    4.86004                      39.95027    59.12348
  e.y        |
         [*] |   48.97042   4.897041                      40.25443    59.57361
------------------------------------------------------------------------------
Note: [*] identifies parameter estimates constrained to be equal across
      groups.
LR test of model vs. saturated: chi2(7)   =      6.49, Prob > chi2 = 0.4843

estat teffects

Direct effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .5038419   .0628899     8.01   0.000     .3805799    .6271038
      female |   .5038419   .0628899     8.01   0.000     .3805799    .6271038
    cv       |
        male |     .35414     .05488     6.45   0.000     .2465771    .4617029
      female |     .35414     .05488     6.45   0.000     .2465771    .4617029
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |    .425432   .0861437     4.94   0.000     .2565935    .5942706
      female |   .2444712   .0863545     2.83   0.005     .0752194    .4137229
    x        |
        male |   .3979248   .0727133     5.47   0.000     .2554093    .5404402
      female |   .3979248   .0727133     5.47   0.000     .2554093    .5404402
    cv       |
        male |   .0489704   .0609254     0.80   0.422    -.0704413     .168382
      female |   .0489704   .0609254     0.80   0.422    -.0704413     .168382
------------------------------------------------------------------------------


Indirect effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
         [*] |          0  (no path)
    cv       |
         [*] |          0  (no path)
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
         [*] |          0  (no path)
    x        |
        male |   .2143505   .0509868     4.20   0.000     .1144182    .3142827
      female |   .1231748   .0461456     2.67   0.008      .032731    .2136186
    cv       |
        male |   .1506625    .038416     3.92   0.000     .0753685    .2259565
      female |    .086577   .0333952     2.59   0.010     .0211236    .1520304
------------------------------------------------------------------------------
Note: [*] identifies parameter estimates constrained to be equal across
      groups.


Total effects
------------------------------------------------------------------------------
             |                 OIM
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural   |
  m <-       |
    x        |
        male |   .5038419   .0628899     8.01   0.000     .3805799    .6271038
      female |   .5038419   .0628899     8.01   0.000     .3805799    .6271038
    cv       |
        male |     .35414     .05488     6.45   0.000     .2465771    .4617029
      female |     .35414     .05488     6.45   0.000     .2465771    .4617029
  -----------+----------------------------------------------------------------
  y <-       |
    m        |
        male |    .425432   .0861437     4.94   0.000     .2565935    .5942706
      female |   .2444712   .0863545     2.83   0.005     .0752194    .4137229
    x        |
        male |   .6122752   .0745834     8.21   0.000     .4660944     .758456
      female |   .5210996   .0681111     7.65   0.000     .3876042     .654595
    cv       |
        male |   .1996329   .0622773     3.21   0.001     .0775716    .3216941
      female |   .1355474   .0595838     2.27   0.023     .0187652    .2523295
------------------------------------------------------------------------------

This time the indirect effect of x on y for males is .2143505 while
for females it is .1231748.