[R] SEM standardized path coefficients

John Fox jfox at mcmaster.ca
Sat Aug 4 02:46:27 CEST 2012


Dear Allen,

There's enough wrong here that it's easier for me just to fix it.

First, if you're going to fit to a raw moment matrix, then (unless you want
to do regression through the origin), you'll need to specify an intercept:

------- snip ---------

> df <- read.csv('NDVI_lep_data.csv', header=TRUE)

> sem.mod.raw <- rawMoments(~ NDVI + All.S, data = df)
> sem.mod.raw

Raw Moments
            (Intercept)       NDVI     All.S
(Intercept)    1.000000  0.8841920  15.28161
NDVI           0.884192  0.7820657  13.53573
All.S         15.281609 13.5357259 245.71360

N =  29 
> 
> sem.mod <- specifyModel()
1: NDVI -> All.S, n2S, NA
2: (Intercept) -> All.S, intercept, NA
3: All.S <-> All.S, s2S, NA
4: 
Read 3 records

> sem.mod
  Path                 Parameter
1 NDVI -> All.S        n2S      
2 (Intercept) -> All.S intercept
3 All.S <-> All.S      s2S      

> sem1 <- sem(sem.mod, sem.mod.raw, N=29, raw=TRUE, 
+             fixed.x=c("(Intercept)", "NDVI"))
> summary(sem1)

Model fit to raw moment matrix.

 Model Chisquare =  1.0174e-11   Df =  0 Pr(>Chisq) = NA
 AIC =  6
 AICc =  0.96
 BIC =  10.102
 CAIC =  1.0174e-11

 Normalized Residuals
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-7.72e-13 -3.99e-13 -3.97e-13 -2.63e-13  0.00e+00  0.00e+00 

 Parameter Estimates
          Estimate Std Error z value Pr(>|z|)                         
n2S        88.262  35.8674    2.4608 0.01386342 All.S <--- NDVI       
intercept -62.759  31.7191   -1.9786 0.04786344 All.S <--- (Intercept)
s2S        10.081   2.6474    3.8079 0.00014016 All.S <--> All.S      

 Iterations =  0 

> summary(lm(All.S ~ NDVI, data=df)) # check

Call:
lm(formula = All.S ~ NDVI, data = df)

Residuals:
   Min     1Q Median     3Q    Max 
-5.474 -2.009 -1.337  3.978  5.298 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   -62.76      32.87  -1.909   0.0669 .
NDVI           88.26      37.17   2.374   0.0249 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 3.291 on 27 degrees of freedom
Multiple R-squared: 0.1727,	Adjusted R-squared: 0.1421 
F-statistic: 5.638 on 1 and 27 DF,  p-value: 0.02494

----------- snip -----------------

Here are other, more convenient, ways of getting the same thing (with output
not shown):

----------- snip -----------------

summary(sem(sem.mod, data=df, raw=TRUE, formula= ~ NDVI + All.S, 
    fixed.x=c("(Intercept)", "NDVI")))

sem.mod <- specifyEquations()
All.S = intercept*(Intercept) + n2S*NDVI

summary(sem(sem.mod, data=df, raw=TRUE, formula= ~ NDVI + All.S, 
            fixed.x=c("(Intercept)", "NDVI")))

----------- snip -----------------

To get standardized coefficients, however, you should fit to a covariance
matrix, rather than a raw moment matrix. As it turns out, this won't work
currently for your model specified as I've done it above, because the model
contains only one explicit parameter. This is unusual, which is probably why
the problem didn't surface previously. I've fixed specifyModel() so that it
will work in this situation, which then produces the following:

----------- snip -----------------

> sem.mod.noint <- specifyModel()
1: NDVI -> All.S, n2S
2: 
Read 1 record
NOTE: adding 1 variances to the model

> sem2 <- sem(sem.mod.noint, data=df, formula= ~ NDVI + All.S, 
+     fixed.x="NDVI")
> summary(sem2)

 Model Chisquare =  0   Df =  0 Pr(>Chisq) = NA
 Chisquare (null model) =  5.3098   Df =  1
 Goodness-of-fit index =  1
 AIC =  4
 AICc =  0.46154
 BIC =  6.7346
 CAIC =  0

 Normalized Residuals
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      0       0       0       0       0       0 

 Parameter Estimates
         Estimate Std Error z value Pr(>|z|)                   
n2S      88.262   36.5022   2.4180  0.01560679 All.S <--- NDVI 
V[All.S] 10.441    2.7905   3.7417  0.00018281 All.S <--> All.S

 Iterations =  0 

> standardizedCoefficients(sem2)
                  Std. Estimate                 
n2S           n2S     0.4156191  All.S <--- NDVI
V[All.S] V[All.S]     0.8272607 All.S <--> All.S
                      1.0000000   NDVI <--> NDVI

> with(df, cor(NDVI, All.S))  # check
[1] 0.4156191

----------- snip -----------------

I'll fix specifyModel() so that it works for a model with one explicit
parameter in the next version of the sem package. In the meantime, you can
duplicate what I've done as follows (output not shown):

----------- snip -----------------

sem.mod.noint.2 <- specifyModel()
NDVI -> All.S, n2S
All.S <-> All.S, err.All.S

sem3 <- sem(sem.mod.noint.2, data=df, formula= ~ NDVI + All.S, 
            fixed.x="NDVI")
summary(sem3)

----------- snip -----------------

Best,
 John

-------------------------------------------------------
John Fox
Senator William McMaster Professor of Social Statistics
Department of Sociology
McMaster Univeristy
Hamilton, Ontario, Canada


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
> On Behalf Of Hurlbert, Allen Hartley
> Sent: August-03-12 5:37 PM
> To: r-help at r-project.org
> Subject: [R] SEM standardized path coefficients
> 
> Hello,
> 
> I have conducted an SEM in which the resultant standardized path
> coefficients are much higher than would be expected from the raw
> correlation matrix. To explore further, I stripped the model down to a
simple
> bivariate relationship between two variables (NDVI, and species richness),
> where it's my understanding that the SEM's standardized path coefficient
> should equal the correlation coefficient.
> 
> The datafile can be downloaded at
> http://labs.bio.unc.edu/Hurlbert/pubs/NDVI_lep_data.csv
> The model specification file can be downloaded at
> http://labs.bio.unc.edu/Hurlbert/pubs/SEM_NDVI_AllS_model.txt
> and is simply:
> 
> NDVI -> All.S, n2S, NA
> All.S -> All.S, S2S, NA
> NDVI <-> NDVI, n2n, 1
> 
> df = read.csv('NDVI_lep_data.csv',header=T)
> cor(df[,c('NDVI','All.S')])
> 
> yields:
> 
> 
>            NDVI     All.S
> 
> NDVI  1.0000000 0.4156191
> 
> All.S 0.4156191 1.0000000
> 
> But, conducting an SEM yields:
> 
> sem.mod = specifyModel('SEM_NDVI_AllS_model.txt')
> sem.mod.cov = rawMoments(~ NDVI + All.S, data = df) sem.mod.cov =
> sem.mod.cov[-1,-1] sem.mod.cov
> 
> 
>             NDVI     All.S
> 
> NDVI   0.7820657  13.53573
> 
> All.S 13.5357259 245.71360
> 
> sem1 = sem(sem.mod, sem.mod.cov, N=29)
> stdCoef(sem1)
> 
> 
> n2S n2S    0.97643950  All.S <--- NDVI
> 
> n2n n2n    1.00000000   NDVI <--> NDVI
> 
> s2S s2S    0.04656591 All.S <--> All.S
> 
> I am using version 3.0 of sem on R-14.0.
> 
> Thanks for any insight anyone can provide.
> 
> Allen Hurlbert, Ph.D.
> Department of Biology
> University of North Carolina
> Chapel Hill, NC 27599-3280
> Tel: 919.843.9930
> Wilson Hall 331
> 
> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list