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 ------------------------------------------------------------------------------