Mediation with svyset Data

Current versions of Stata support svy: sem and estat teffects without complaint. There is no longer a need to use gsem and manual calculation. However, this document may still be useful as either a guide to using estat teffects or manually calculating them if you need to use gsem for another reason.

Mediation models in Stata are fit with the sem command. sem does not support svyset data, so instead you use gsem (e.g. svy: gsem ...). However, gsem does not support estat teffects which calculates direct, indirect and total effects.

This document shows how to manually calculate these effects using nlcom.

Note that this is a case where all variables are continuous and all models are linear - we are only using gsem for it’s support of svy:, not it’s support of GLMs. Indirect effects are a more complicated topic in those models which we do not address here. Additionally, we’ll trust Stata to compute standard errors rather than getting into any sticky issues of bootstrapping.

Standard Mediation

First, let’s estimate the direct, indirect and total effects without the use of the survey design to show equivalence.

. webuse gsem_multmed
(Fictional job-performance data)

The model we’ll be fitting is

Here, “satis” is a potential mediator between “support” and “perform”. The direct effect is the arrow between “support” and “perform”, the indirect effect is the arrows from “support” to “perform” which passes through “satis”, and the total effect is the sum of the direct and indirect effects.

. sem (perform <- satis support) (satis <- support)

Endogenous variables
  Observed: perform satis

Exogenous variables
  Observed: support

Fitting target model:
Iteration 0:  Log likelihood = -3779.9224
Iteration 1:  Log likelihood = -3779.9224

Structural equation model                                Number of obs = 1,500
Estimation method: ml

Log likelihood = -3779.9224

------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |   .8984401   .0251903    35.67   0.000      .849068    .9478123
     support |   .6161077   .0303143    20.32   0.000     .5566927    .6755227
       _cons |   4.981054   .0150589   330.77   0.000     4.951539    5.010569
  -----------+----------------------------------------------------------------
  satis      |
     support |   .2288945   .0305047     7.50   0.000     .1691064    .2886826
       _cons |    .019262   .0154273     1.25   0.212    -.0109749    .0494989
-------------+----------------------------------------------------------------
var(e.perf~m)|   .3397087   .0124044                      .3162461     .364912
 var(e.satis)|   .3569007   .0130322                      .3322507    .3833795
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0) = 0.00                 Prob > chi2 = .

The direct, indirect and total effects can be estimated via estat teffects.

. estat teffects


Direct effects
------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |   .8984401   .0251903    35.67   0.000      .849068    .9478123
     support |   .6161077   .0303143    20.32   0.000     .5566927    .6755227
  -----------+----------------------------------------------------------------
  satis      |
     support |   .2288945   .0305047     7.50   0.000     .1691064    .2886826
------------------------------------------------------------------------------


Indirect effects
------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |          0  (no path)
     support |    .205648   .0280066     7.34   0.000      .150756      .26054
  -----------+----------------------------------------------------------------
  satis      |
     support |          0  (no path)
------------------------------------------------------------------------------


Total effects
------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |   .8984401   .0251903    35.67   0.000      .849068    .9478123
     support |   .8217557   .0404579    20.31   0.000     .7424597    .9010516
  -----------+----------------------------------------------------------------
  satis      |
     support |   .2288945   .0305047     7.50   0.000     .1691064    .2886826
------------------------------------------------------------------------------

Let’s calculate them manually. First we’ll re-display the SEM results with the coeflegend to obtain the names to access the coefficients.

. sem, coeflegend

Structural equation model                                Number of obs = 1,500
Estimation method: ml

Log likelihood = -3779.9224

------------------------------------------------------------------------------
             | Coefficient  Legend
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |   .8984401  _b[perform:satis]
     support |   .6161077  _b[perform:support]
       _cons |   4.981054  _b[perform:_cons]
  -----------+----------------------------------------------------------------
  satis      |
     support |   .2288945  _b[satis:support]
       _cons |    .019262  _b[satis:_cons]
-------------+----------------------------------------------------------------
var(e.perf~m)|   .3397087  _b[/var(e.perform)]
 var(e.satis)|   .3569007  _b[/var(e.satis)]
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0) = 0.00                 Prob > chi2 = .

The main effects are directly from the model, but for completeness let’s obtain it.

. estat teffects, noindirect nototal


Direct effects
------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |   .8984401   .0251903    35.67   0.000      .849068    .9478123
     support |   .6161077   .0303143    20.32   0.000     .5566927    .6755227
  -----------+----------------------------------------------------------------
  satis      |
     support |   .2288945   .0305047     7.50   0.000     .1691064    .2886826
------------------------------------------------------------------------------

. nlcom _b[perform:support]

       _nl_1: _b[perform:support]

------------------------------------------------------------------------------
             | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
       _nl_1 |   .6161077   .0303143    20.32   0.000     .5566927    .6755227
------------------------------------------------------------------------------

For the indirect effect, we’ll simply multiply the path from “support” to “satis” and from “satis” to “perform”.

. estat teffects, nodirect nototal


Indirect effects
------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |          0  (no path)
     support |    .205648   .0280066     7.34   0.000      .150756      .26054
  -----------+----------------------------------------------------------------
  satis      |
     support |          0  (no path)
------------------------------------------------------------------------------

. nlcom _b[perform:satis]*_b[satis:support]

       _nl_1: _b[perform:satis]*_b[satis:support]

------------------------------------------------------------------------------
             | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
       _nl_1 |    .205648   .0280066     7.34   0.000      .150756      .26054
------------------------------------------------------------------------------

Finally, we can sum those for the direct effect.

. estat teffects, nodirect noindirect


Total effects
------------------------------------------------------------------------------
             |                 OIM
             | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
Structural   |
  perform    |
       satis |   .8984401   .0251903    35.67   0.000      .849068    .9478123
     support |   .8217557   .0404579    20.31   0.000     .7424597    .9010516
  -----------+----------------------------------------------------------------
  satis      |
     support |   .2288945   .0305047     7.50   0.000     .1691064    .2886826
------------------------------------------------------------------------------

. nlcom _b[perform:satis]*_b[satis:support] + _b[perform:support]

       _nl_1: _b[perform:satis]*_b[satis:support] + _b[perform:support]

------------------------------------------------------------------------------
             | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
       _nl_1 |   .8217557   .0404579    20.31   0.000     .7424597    .9010516
------------------------------------------------------------------------------

With Survey Data

We’ll reproduce the above results with survey set data. The actually svyset here is nonsense, this test data is not actual survey data.

. svyset branch [pweight = perform]

Sampling weights: perform
             VCE: linearized
     Single unit: missing
        Strata 1: 
 Sampling unit 1: branch
           FPC 1: 

Finally, all three effects can be calculated via the same nlcom commands.

. svy: gsem (perform <- satis support) (satis <- support)
(running gsem on estimation sample)

Survey: Generalized structural equation model

Number of strata =  1                              Number of obs   =     1,500
Number of PSUs   = 75                              Population size = 7,507.976
                                                   Design df       =        74

Response: perform
Family:   Gaussian
Link:     Identity

Response: satis
Family:   Gaussian
Link:     Identity

------------------------------------------------------------------------------
             |             Linearized
             | Coefficient  std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
perform      |
       satis |   .8768337   .0478296    18.33   0.000      .781531    .9721363
     support |   .6105411   .0276199    22.11   0.000     .5555072     .665575
       _cons |   5.051254   .0414936   121.74   0.000     4.968576    5.133932
-------------+----------------------------------------------------------------
satis        |
     support |    .212986   .0261195     8.15   0.000     .1609418    .2650301
       _cons |   .0841272   .0583215     1.44   0.153     -.032081    .2003353
-------------+----------------------------------------------------------------
var(e.perf~m)|   .3284831   .0241911                      .2836511    .3804009
 var(e.satis)|   .3570689   .0353162                      .2931998    .4348508
------------------------------------------------------------------------------

This work is licensed under CC BY-NC 4.0 Creative Commons BY-NC image