[R] Total (un)standardized effects in SEM?

John Fox jfox at mcmaster.ca
Fri Aug 25 16:30:32 CEST 2006


Dear Rense,

(This question was posted a few days ago when I wasn't reading my email.)

So-called effect decompositions are simple functions of the structural
coefficients of the model, which in a model fit by sem() are contained in
the $A component of the returned object. (See ?sem.) One approach,
therefore, would be to put the coefficients in the appropriate locations of
the estimated Beta, Gamma, Lamda-x, and Lambda-y matrices of the LISREL
model, and then to compute the "effects" in the usual manner.

It should be possible to do this for the RAM formulation of the model as
well, simply by distinguishing exogenous from endogenous variables. Here's
an illustration using model C in the LISREL 7 Manual, pp. 169-177, for the
Wheaton et al. "stability of alienation" data (a common example--I happen to
have an old LISREL manual handy):

> S.wh <- matrix(c(
+    11.834,     0,        0,        0,       0,        0,
+     6.947,    9.364,     0,        0,       0,        0,
+     6.819,    5.091,   12.532,     0,       0,        0,
+     4.783,    5.028,    7.495,    9.986,    0,        0,
+    -3.839,   -3.889,   -3.841,   -3.625,   9.610,     0,
+    -2.190,   -1.883,   -2.175,   -1.878,   3.552,    4.503), 
+   6, 6)
> 
> rownames(S.wh) <- colnames(S.wh) <- 
+     c('Anomia67','Powerless67','Anomia71','Powerless71','Education','SEI')

> 
> model.wh <- specify.model()
1:     Alienation67   ->  Anomia67,      NA,     1
2:     Alienation67   ->  Powerless67,   lam1,   NA
3:     Alienation71   ->  Anomia71,      NA,     1
4:     Alienation71   ->  Powerless71,   lam2,   NA 
5:     SES            ->  Education,     NA,     1     
6:     SES            ->  SEI,           lam3,   NA
7:     SES            ->  Alienation67,  gam1,   NA
8:     Alienation67   ->  Alienation71,  beta,   NA
9:     SES            ->  Alienation71,  gam2,   NA
10:     Anomia67       <-> Anomia67,      the1,   NA
11:     Anomia71       <-> Anomia71,      the3,   NA
12:     Powerless67    <-> Powerless67,   the2,   NA
13:     Powerless71    <-> Powerless71,   the4,   NA
14:     Education      <-> Education,     thd1,   NA
15:     SEI            <-> SEI,           thd2,   NA
16:     Anomia67       <-> Anomia71,      the13,  NA
17:     Alienation67   <-> Alienation67,  psi1,   NA
18:     Alienation71   <-> Alienation71,  psi2,   NA
19:     SES            <-> SES,           phi,    NA
20:     
Read 19 records
> 
> sem.wh <- sem(model.wh, S.wh, 932)
> 
> summary(sem.wh)

 Model Chisquare =  6.3349   Df =  5 Pr(>Chisq) = 0.27498
 Chisquare (null model) =  17973   Df =  15
 Goodness-of-fit index =  0.99773
 Adjusted goodness-of-fit index =  0.99046
 RMSEA index =  0.016934   90 % CI: (NA, 0.05092)
 Bentler-Bonnett NFI =  0.99965
 Tucker-Lewis NNFI =  0.99978
 Bentler CFI =  0.99993
 BIC =  -27.852 

 Normalized Residuals
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-9.57e-01 -1.34e-01 -4.24e-02 -9.17e-02  6.43e-05  5.47e-01 

 Parameter Estimates
      Estimate Std Error z value  Pr(>|z|)                                 
lam1   1.02656 0.053424   19.2152 0.0000e+00 Powerless67 <--- Alienation67 
lam2   0.97089 0.049608   19.5712 0.0000e+00 Powerless71 <--- Alienation71 
lam3   0.51632 0.042247   12.2214 0.0000e+00 SEI <--- SES                  
gam1  -0.54981 0.054298  -10.1258 0.0000e+00 Alienation67 <--- SES         
beta   0.61732 0.049486   12.4746 0.0000e+00 Alienation71 <--- Alienation67
gam2  -0.21151 0.049862   -4.2419 2.2164e-05 Alienation71 <--- SES         
the1   5.06546 0.373464   13.5635 0.0000e+00 Anomia67 <--> Anomia67        
the3   4.81176 0.397345   12.1098 0.0000e+00 Anomia71 <--> Anomia71        
the2   2.21438 0.319740    6.9256 4.3423e-12 Powerless67 <--> Powerless67  
the4   2.68322 0.331274    8.0997 4.4409e-16 Powerless71 <--> Powerless71  
thd1   2.73051 0.517737    5.2739 1.3353e-07 Education <--> Education      
thd2   2.66905 0.182260   14.6442 0.0000e+00 SEI <--> SEI                  
the13  1.88739 0.241627    7.8112 5.7732e-15 Anomia71 <--> Anomia67        
psi1   4.70477 0.427511   11.0050 0.0000e+00 Alienation67 <--> Alienation67
psi2   3.86642 0.343971   11.2406 0.0000e+00 Alienation71 <--> Alienation71
phi    6.87948 0.659208   10.4360 0.0000e+00 SES <--> SES                  

 Iterations =  58 
> 
> A <- sem.wh$A  # structural coefficients
> exog <- apply(A, 1, function(x) all(x == 0))
> endog <- !exog

> (B <- A[endog, endog, drop=FALSE])  # direct effects, endogenous ->
endogenous
             Anomia67 Powerless67 Anomia71 Powerless71 Education SEI
Anomia67            0           0        0           0         0   0
Powerless67         0           0        0           0         0   0
Anomia71            0           0        0           0         0   0
Powerless71         0           0        0           0         0   0
Education           0           0        0           0         0   0
SEI                 0           0        0           0         0   0
Alienation67        0           0        0           0         0   0
Alienation71        0           0        0           0         0   0
             Alienation67 Alienation71
Anomia67        1.0000000     0.000000
Powerless67     1.0265597     0.000000
Anomia71        0.0000000     1.000000
Powerless71     0.0000000     0.970892
Education       0.0000000     0.000000
SEI             0.0000000     0.000000
Alienation67    0.0000000     0.000000
Alienation71    0.6173153     0.000000

> (C <- A[endog, exog, drop=FALSE]) # direct effects, exogenous ->
endogenous
                    SES
Anomia67      0.0000000
Powerless67   0.0000000
Anomia71      0.0000000
Powerless71   0.0000000
Education     1.0000000
SEI           0.5163168
Alienation67 -0.5498096
Alienation71 -0.2115088

> I <- diag(nrow(B))
> IBinv <- solve(I - B)
> (Ty <- IBinv - I)  # total effects, endogenous -> endogenous
             Anomia67 Powerless67 Anomia71 Powerless71 Education SEI
Anomia67            0           0        0           0         0   0
Powerless67         0           0        0           0         0   0
Anomia71            0           0        0           0         0   0
Powerless71         0           0        0           0         0   0
Education           0           0        0           0         0   0
SEI                 0           0        0           0         0   0
Alienation67        0           0        0           0         0   0
Alienation71        0           0        0           0         0   0
             Alienation67 Alienation71
Anomia67        1.0000000     0.000000
Powerless67     1.0265597     0.000000
Anomia71        0.6173153     1.000000
Powerless71     0.5993465     0.970892
Education       0.0000000     0.000000
SEI             0.0000000     0.000000
Alienation67    0.0000000     0.000000
Alienation71    0.6173153     0.000000

> (Tx <- IBinv %*% C) # total effects, exogenous -> endogenous
                    SES
Anomia67     -0.5498096
Powerless67  -0.5644124
Anomia71     -0.5509147
Powerless71  -0.5348786
Education     1.0000000
SEI           0.5163168
Alienation67 -0.5498096
Alienation71 -0.5509147

> Ty - B  # indirect effects, endogenous -> endogenous
             Anomia67 Powerless67 Anomia71 Powerless71 Education SEI
Anomia67            0           0        0           0         0   0
Powerless67         0           0        0           0         0   0
Anomia71            0           0        0           0         0   0
Powerless71         0           0        0           0         0   0
Education           0           0        0           0         0   0
SEI                 0           0        0           0         0   0
Alienation67        0           0        0           0         0   0
Alienation71        0           0        0           0         0   0
             Alienation67 Alienation71
Anomia67        0.0000000            0
Powerless67     0.0000000            0
Anomia71        0.6173153            0
Powerless71     0.5993465            0
Education       0.0000000            0
SEI             0.0000000            0
Alienation67    0.0000000            0
Alienation71    0.0000000            0

> Tx - C # indirect effects, exogenous -> endogenous
                    SES
Anomia67     -0.5498096
Powerless67  -0.5644124
Anomia71     -0.5509147
Powerless71  -0.5348786
Education     0.0000000
SEI           0.0000000
Alienation67  0.0000000
Alienation71 -0.3394059

These results agree with those in the LISREL manual (and for another example
there as well), but I haven't checked the method carefully.

It would, of course, be simple to encapsulate the steps above in a function,
but here's a caveat: The idea of indirect and total effects makes sense to
me for a recursive model, and for the exogenous variables in a nonrecursive
model, where they are the reduced-form coefficients (supposing, of course,
that the model makes sense in the first place, which is often problematic),
but not for the endogenous variables in a nonrecursive model. That is why I
haven't put such a function in the sem package; perhaps I should reconsider.

Having said that, I'm ashamed to add that I believe that I was the person
who suggested the definition of total and indirect effects currently used
for these models.

Finally, you can get standardized effects similarly by using standardized
structural coefficients. In the sem package, these are computed and printed
by standardized.eoefficients(). This function doesn't return the
standardized A matrix in a usable form, but could be made to do so.

Regards,
 John

--------------------------------
John Fox
Department of Sociology
McMaster University
Hamilton, Ontario
Canada L8S 4M4
905-525-9140x23604
http://socserv.mcmaster.ca/jfox



More information about the R-help mailing list