Below is the diagram of a simple structural equation model. The dependent variable is a latent variable Acad with three observed indicators, math, science and socst. There are two additional observed variables, the independent variable female and a mediator variable read. (Note, variables in squares are observed (manifest variables), those in circles are latent. The small circles with ε are error terms, i.e., residual variances).
We will analyze this model using the sem command with the hsbdemo dataset.
use https://stats.idre.ucla.edu/stat/data/hsbdemo, clear
sem (Acad->math science socst)(Acad<-read)(read<-female), ///
mean(female) var(female)
Endogenous variables
Observed: read
Measurement: math science socst
Latent: Acad
Exogenous variables
Observed: female
Fitting target model:
Iteration 0: log likelihood = -6737.783 (not concave)
[output omitted]
Iteration 13: log likelihood = -2949.3343
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -2949.3343
( 1) [math]Acad = 1
------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural |
read <- |
female | -1.090231 1.450201 -0.75 0.452 -3.932572 1.75211
_cons | 52.82418 1.070598 49.34 0.000 50.72584 54.92251
-----------+----------------------------------------------------------------
Acad <- |
read | .620298 .0461021 13.45 0.000 .5299395 .7106565
-------------+----------------------------------------------------------------
Measurement |
math <- |
Acad | 1 (constrained)
_cons | 20.24684 2.456312 8.24 0.000 15.43255 25.06112
-----------+----------------------------------------------------------------
science <- |
Acad | .9874351 .0908878 10.86 0.000 .8092984 1.165572
_cons | 19.85891 2.737663 7.25 0.000 14.49319 25.22463
-----------+----------------------------------------------------------------
socst <- |
Acad | .9940776 .1030617 9.65 0.000 .7920804 1.196075
_cons | 20.19871 3.181537 6.35 0.000 13.96301 26.4344
-------------+----------------------------------------------------------------
Mean |
female | .545 .0352119 15.48 0.000 .475986 .614014
-------------+----------------------------------------------------------------
Variance |
e.math | 31.77659 4.630872 23.8814 42.28192
e.science | 43.37236 5.487556 33.84678 55.57874
e.socst | 59.7846 7.011562 47.50727 75.23477
e.read | 104.3024 10.43024 85.73812 126.8862
e.Acad | 15.30659 3.693936 9.538023 24.56398
female | .247975 .0247975 .2038392 .3016672
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(5) = 12.25, Prob > chi2 = 0.0315
estat gof
----------------------------------------------------------------------------
Fit statistic | Value Description
---------------------+------------------------------------------------------
Likelihood ratio |
chi2_ms(5) | 12.251 model vs. saturated
p > chi2 | 0.032
chi2_bs(10) | 361.012 baseline vs. saturated
p > chi2 | 0.000
----------------------------------------------------------------------------
The estat gof makes reference to three different models; 1) the model (the one we just ran), 2) the saturated model, and 3) the baseline model. Before we discuss the saturated and baseline models, let’s look a little closer at the above model.
In the above model we estimated 15 parameters; 2 structural coefficients, 1 structural intercept, 2 measurement coefficients (loadings), 3 measurement intercepts, 6 variances and 1 mean. The log likelihood for our model was -2949.3343.
The saturated model
Now let’s move on to the saturated model. A saturated model perfectly reproduces all of the variances, covariance and means of the observed variables. Here is a simple way to produce a saturated model.
sem (<-read math science socst female)
Exogenous variables
Observed: read math science socst female
Fitting target model:
Iteration 0: log likelihood = -2943.2087
Iteration 1: log likelihood = -2943.2087
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -2943.2087
------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
Mean |
read | 52.23 .7231774 72.22 0.000 50.8126 53.6474
math | 52.645 .6607911 79.67 0.000 51.34987 53.94013
science | 51.85 .6983463 74.25 0.000 50.48127 53.21873
socst | 52.405 .757235 69.21 0.000 50.92085 53.88915
female | .545 .0352119 15.48 0.000 .475986 .614014
-------------+----------------------------------------------------------------
Variance |
read | 104.5971 10.45971 85.98041 127.2447
math | 87.32898 8.732897 71.78574 106.2377
science | 97.5375 9.75375 80.17731 118.6566
socst | 114.681 11.4681 94.2695 139.512
female | .247975 .0247975 .2038392 .3016672
-------------+----------------------------------------------------------------
Covariance |
read |
math | 63.29665 8.105808 7.81 0.000 47.40956 79.18374
science | 63.6495 8.441978 7.54 0.000 47.10353 80.19547
socst | 68.06685 9.118222 7.46 0.000 50.19546 85.93824
female | -.27035 .3606283 -0.75 0.453 -.9771685 .4364685
-----------+----------------------------------------------------------------
math |
science | 58.21175 7.715717 7.54 0.000 43.08922 73.33428
socst | 54.48877 8.057294 6.76 0.000 38.69677 70.28078
female | -.136525 .3291963 -0.41 0.678 -.7817379 .5086879
-----------+----------------------------------------------------------------
science |
socst | 49.19075 8.247856 5.96 0.000 33.02525 65.35625
female | -.62825 .3505821 -1.79 0.073 -1.315378 .0588783
-----------+----------------------------------------------------------------
socst |
female | .279275 .3775977 0.74 0.460 -.460803 1.019353
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0) = 0.00, Prob > chi2 = .
A saturated model has the best fit possible since it perfectly reproduces all of the variances, covariances and means. That’s why the saturated model above has a chi-square of zero with zero degrees of freedom. Since you can’t do any better than a saturated model, it becomes the standard for comparison with the models that you estimate.
For the saturated model we estimated 20 parameters; 5 variances, 10 covariances and 5 means. You can compute the number of parameters in a saturated model of k observed variables by the formula k*(k+1)/2 + k. In our example, it is 5*(5+1)/2 + 5 = 20. The log likelihood for this model is -2943.2087.
To test how well our model compares to a saturated model, we compute chi-square as follows, minus two times the differences in the log likelihoods; -2*(-2949.3343 – -2943.2087) = 12.2512. The degrees of freedom for this chi-square is the difference in the number of parameters estimated in the two model (20 – 15 = 5). Thus, our model fits significantly poorer than a saturated model (p = .0315). But, that’s not surprising since our model was only for demonstration purposes.
The baseline model
So, that brings us to the baseline model. This is defined in the Stata [SEM] Structural Equation Modeling Reference Manual as a model which includes the means and variances of all observed variables plus the covariances of all observed exogenous variables. Since there is only one observed exogenous variable, female, in our model, there will be no covariances in our baseline model.
sem (<-read math science socst female), ///
covstr(read math science socst female, diagonal)
Exogenous variables
Observed: read math science socst female
Fitting target model:
Iteration 0: log likelihood = -3123.7147
Iteration 1: log likelihood = -3123.7147
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -3123.7147
( 1) [cov(read,math)]_cons = 0
( 2) [cov(read,science)]_cons = 0
( 3) [cov(read,socst)]_cons = 0
( 4) [cov(read,female)]_cons = 0
( 5) [cov(math,science)]_cons = 0
( 6) [cov(math,socst)]_cons = 0
( 7) [cov(math,female)]_cons = 0
( 8) [cov(science,socst)]_cons = 0
( 9) [cov(science,female)]_cons = 0
(10) [cov(socst,female)]_cons = 0
------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
Mean |
read | 52.23 .7231774 72.22 0.000 50.8126 53.6474
math | 52.645 .6607911 79.67 0.000 51.34987 53.94013
science | 51.85 .6983463 74.25 0.000 50.48127 53.21873
socst | 52.405 .757235 69.21 0.000 50.92085 53.88915
female | .545 .0352119 15.48 0.000 .475986 .614014
-------------+----------------------------------------------------------------
Variance |
read | 104.5971 10.45971 85.98041 127.2447
math | 87.32898 8.732898 71.78574 106.2377
science | 97.5375 9.75375 80.17731 118.6566
socst | 114.681 11.4681 94.2695 139.512
female | .247975 .0247975 .2038392 .3016672
-------------+----------------------------------------------------------------
Covariance |
read |
math | 0 (constrained)
science | 0 (constrained)
socst | 0 (constrained)
female | 0 (constrained)
-----------+----------------------------------------------------------------
math |
science | 0 (constrained)
socst | 0 (constrained)
female | 0 (constrained)
-----------+----------------------------------------------------------------
science |
socst | 0 (constrained)
female | 0 (constrained)
-----------+----------------------------------------------------------------
socst |
female | 0 (constrained)
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(10) = 361.01, Prob > chi2 = 0.0000
For the baseline model we estimated 10 parameters; 5 variances and 5 means. In comparing this model with the saturated model there was a difference of 10 degrees of freedom, 20 – 10 = 10. Again, we compute chi-square as minus two times the difference in the log likelihoods, -2*(-3123.7147 – -2943.2087) = 361.012.
Although our model did not fit all that well compared to the saturated model, the fit of the baseline model compared to the saturated model is much worse, with chi2(10) = 361.012, p = 0.0000.
The two chi-square values from the estat gof for our model versus a saturated model and baseline versus saturated model help us to understand how well our model fits the data.
The saturated model revisited
When we looked at the saturated model above we used a very simple model with only observed variables. Now we are going to try to come up with a saturated model that is more closely related to our original model. We will begin by looking at just the measurement part of our model. Here is the diagram.
Followed by the sem code.
sem (Acad->math science socst)
Endogenous variables
Measurement: math science socst
Exogenous variables
Latent: Acad
Fitting target model:
Iteration 0: log likelihood = -2141.1294
Iteration 1: log likelihood = -2141.1294
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -2141.1294
( 1) [math]Acad = 1
------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
Measurement |
math <- |
Acad | 1 (constrained)
_cons | 52.645 .6607911 79.67 0.000 51.34987 53.94013
-----------+----------------------------------------------------------------
science <- |
Acad | .9027685 .1108342 8.15 0.000 .6855374 1.12
_cons | 51.85 .6983463 74.25 0.000 50.48127 53.21873
-----------+----------------------------------------------------------------
socst <- |
Acad | .8450313 .110572 7.64 0.000 .6283142 1.061748
_cons | 52.405 .757235 69.21 0.000 50.92085 53.88915
-------------+----------------------------------------------------------------
Variance |
e.math | 22.84761 7.002427 12.53029 41.66011
e.science | 44.98577 7.024159 33.12585 61.09185
e.socst | 68.63626 8.333688 54.10062 87.07729
Acad | 64.48137 10.71715 46.55433 89.31172
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0) = 0.00, Prob > chi2 = .
As you can see, the measure model with three indicators is itself a saturated model. To be saturated it should have 3*4/2 + 3 = 9 parameters being estimated, which is the case.
Now, let’s add read to our model like this.
sem (Acad->math science socst)(Acad<-read)(science<-read)(socst<-read), ///
mean(read) difficult
Endogenous variables
Observed: science socst
Measurement: math
Latent: Acad
Exogenous variables
Observed: read
Fitting target model:
Iteration 0: log likelihood = -3698.205 (not concave)
[output omitted]
Iteration 28: log likelihood = -2802.3352
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -2802.3352
( 1) [math]Acad = 1
-------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
--------------+----------------------------------------------------------------
Structural |
science <- |
Acad | .5843354 .3233183 1.81 0.071 -.0493567 1.218028
read | .2549117 .2019701 1.26 0.207 -.1409425 .6507659
_cons | 20.06696 2.821788 7.11 0.000 14.53636 25.59757
------------+----------------------------------------------------------------
socst <- |
Acad | .3945619 .2262457 1.74 0.081 -.0488715 .8379953
read | .4119847 .148232 2.78 0.005 .1214554 .702514
_cons | 18.41618 3.087163 5.97 0.000 12.36546 24.46691
------------+----------------------------------------------------------------
Acad <- |
read | .6051473 .04841 12.50 0.000 .5102655 .700029
--------------+----------------------------------------------------------------
Measurement |
math <- |
Acad | 1 (constrained)
_cons | 21.03816 2.57647 8.17 0.000 15.98837 26.08795
--------------+----------------------------------------------------------------
mean(read)| 52.23 .7231774 72.22 0.000 50.8126 53.6474
--------------+----------------------------------------------------------------
var(e.math)| 15.32121 18.29777 1.474762 159.171
var(e.science)| 47.29731 7.818624 34.20787 65.39535
var(e.socst)| 65.13928 7.105546 52.60074 80.66665
var(e.Acad)| 33.70397 18.81883 11.28255 100.6827
var(read)| 104.5971 10.45971 85.98041 127.2447
-------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0) = 0.00, Prob > chi2 = .
This model has four observed variables. Thus, we should estimate 4*5/2 + 4 = 14 parameters. We achieved this by adding direct paths from read to science and to socst. We could have also achieved the same result by adding two covariances, say e.math*e.science and e.math*e.socst, to our model instead of the direct effects.
Finally, let’s add female to our model. We now have as many observed variables as our original model.
The above diagram translates to the following code.
sem (Acad -> math science socst)(Acad<-read)(Acad<-female)(read<-female) ///
(math<- female read)(socst<-female read), ///
mean(female) var(female)
Endogenous variables
Observed: math socst read
Measurement: science
Latent: Acad
Exogenous variables
Observed: female
Fitting target model:
Iteration 0: log likelihood = -3111.6647 (not concave)
[output omitted]
Iteration 58: log likelihood = -2943.2087
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -2943.2087
( 1) [math]Acad = 1
------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural |
math <- |
read | -.3219013 .4660796 -0.69 0.490 -1.235401 .5915979
Acad | 1 (constrained)
female | 2.990358 2.137855 1.40 0.162 -1.199762 7.180477
_cons | 20.9637 2.663851 7.87 0.000 15.74265 26.18475
-----------+----------------------------------------------------------------
socst <- |
read | .250464 .1525691 1.64 0.101 -.0485661 .549494
Acad | .436786 .2230541 1.96 0.050 -.0003919 .8739639
female | 3.099202 1.37288 2.26 0.024 .4084072 5.789998
_cons | 17.16439 3.172945 5.41 0.000 10.94553 23.38325
-----------+----------------------------------------------------------------
read <- |
female | -1.090232 1.450201 -0.75 0.452 -3.932574 1.75211
_cons | 52.82418 1.070598 49.34 0.000 50.72584 54.92251
-----------+----------------------------------------------------------------
Acad <- |
read | .9273316 .4666623 1.99 0.047 .0126903 1.841973
female | -2.880859 2.192737 -1.31 0.189 -7.178543 1.416826
-------------+----------------------------------------------------------------
Measurement |
science <- |
Acad | .6509763 .3226734 2.02 0.044 .018548 1.283405
_cons | 21.34222 2.895969 7.37 0.000 15.66623 27.01822
-------------+----------------------------------------------------------------
Mean |
female | .545 .0352119 15.48 0.000 .475986 .614014
-------------+----------------------------------------------------------------
Variance |
e.math | 18.69062 14.85898 3.934787 88.78225
e.science | 45.08212 7.703921 32.25118 63.01778
e.socst | 63.76156 6.970891 51.46349 78.99847
e.read | 104.3024 10.43024 85.73812 126.8862
e.Acad | 30.33159 15.41889 11.19933 82.1483
female | .247975 .0247975 .2038392 .3016672
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(0) = 0.00, Prob > chi2 = .
This time there are five observed variables which means that we need to estimate 5*6/2 + 5 = 20 parameters for a saturated model. We did this by adding direct paths from female to Acad, math, and socst and direct paths from read to math and socst. This is the same result that was obtained with the simpler approach used earlier for the saturated model.
The baseline model revisited
We know that the baseline model estimates five means and five variances and no covariances, because there is only one observed exogenous variables, for a total of 10 total parameters. We can get this from our original model by constraining all of the measurement coefficients (loadings) to be one and all of the path coefficients to be zero. Here is a diagram of the model.
And, here is one way to accomplish this.
sem (Acad ->math@1 science@1 socst@1) (read<-female@0), ///
var(Acad@0 female) mean(female)
Endogenous variables
Observed: read
Measurement: math science socst
Exogenous variables
Observed: female
Latent: Acad
Fitting target model:
Iteration 0: log likelihood = -3257.7854
[omitted output]
Iteration 4: log likelihood = -3123.7147
Structural equation model Number of obs = 200
Estimation method = ml
Log likelihood = -3123.7147
( 1) [math]Acad = 1
( 2) [science]Acad = 1
( 3) [socst]Acad = 1
( 4) [var(Acad)]_cons = 0
------------------------------------------------------------------------------
| OIM
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
Structural |
read <- |
_cons | 52.23 .7231774 72.22 0.000 50.8126 53.6474
-------------+----------------------------------------------------------------
Measurement |
math <- |
Acad | 1 (constrained)
_cons | 52.645 .6607909 79.67 0.000 51.34987 53.94013
-----------+----------------------------------------------------------------
science <- |
Acad | 1 (constrained)
_cons | 51.85 .6983462 74.25 0.000 50.48127 53.21873
-----------+----------------------------------------------------------------
socst <- |
Acad | 1 (constrained)
_cons | 52.405 .757235 69.21 0.000 50.92085 53.88915
-------------+----------------------------------------------------------------
Mean |
female | .545 .0352119 15.48 0.000 .475986 .614014
-------------+----------------------------------------------------------------
Variance |
e.math | 87.32893 8.732889 71.78572 106.2376
e.science | 97.53748 9.753746 80.17729 118.6565
e.socst | 114.681 11.4681 94.2695 139.512
e.read | 104.5971 10.45971 85.98041 127.2447
female | .247975 .0247975 .2038392 .3016672
Acad | 0 (constrained)
------------------------------------------------------------------------------
LR test of model vs. saturated: chi2(10) = 361.01, Prob > chi2 = 0.0000
In this model the term (read<-female@0) estimates an intercept (mean) but no structural coefficient. There is no term that predicting Acad from read which is equivalent to setting that structural coefficient to zero. We added terms for the mean and variance of female. Finally, by convention, the variance of the latent variables is constrained to zero, which we did.





