Regressions vs. Path Analysis (or SEM)
Model Identification


out of possible 15 relationships
15 - 12 =3 (df)
| $\chi^2$ | $\text{CFI}$ | $\text{TLI}$ | $\text{RMSEA}$ | $\text{SRMR}$ |
| $p \ge .05$ | $p \ge .90$ | $p \ge .95$ | $p \le .08$ | $p \le .08$ |
Then what is SEM (Structural Equation Modeling)
######################################################
## data file: PlannedBehavior.csv
######################################################
######################################################
install.packages("readr")
library(readr)
df <- read.csv("http://commres.net/wiki/_media/r/plannedbehavior.csv")
head(df)
str(df)
# path analysis in R using lavaan package
# install.packages("lavaan")
library(lavaan)
# Model speficiation
specmod <- "
intention ~ attitude + norms + control
"
# Estimate model
fitmod <- sem(specmod, data=df)
# summarize the result
summary(fitmod, fit.measures=TRUE, rsquare=TRUE)
# Model speficiation 2
specmod2 <- "
intention ~ attitude + norms + control
attitude ~~ norms + control
norms ~~ control
"
fitmod2 <- sem(specmod2, data=df)
# summarize the result
summary(fitmod2, fit.measures=TRUE, rsquare=TRUE)
fitmod3 <- lm(intention~attitude+norms+control, data=df) summary(fitmod3)
# pbt model
specmod4 <- "
# Directional relations (path)
intention ~ attitude + norms + control
behavior ~ intention
# Covariances
attitude ~~ norms + control
norms ~~ control
"
fitmod4 <- sem(specmod4, data=df)
summary(fitmod4, fit.measures=TRUE, rsquare=TRUE)
# my own
# pbt model
specmod5 <- '
# Directional relations (path)
intention ~ a*attitude + b*norms + c*control
behavior ~ d*intention
# Covariances
attitude ~~ norms + control
norms ~~ control
ad := a*d
bd := b*d
cd := c*d
'
fitmod5 <- sem(specmod5, data=df)
summary(fitmod5, fit.measures=TRUE, rsquare=TRUE)
> df <- read.csv("http://commres.net/wiki/_media/r/plannedbehavior.csv")
> head(df)
attitude norms control intention behavior
1 2.31 2.31 2.03 2.50 2.62
2 4.66 4.01 3.63 3.99 3.64
3 3.85 3.56 4.20 4.35 3.83
4 4.24 2.25 2.84 1.51 2.25
5 2.91 3.31 2.40 1.45 2.00
6 2.99 2.51 2.95 2.59 2.20
> str(df)
'data.frame': 199 obs. of 5 variables:
$ attitude : num 2.31 4.66 3.85 4.24 2.91 2.99 3.96 3.01 4.77 3.67 ...
$ norms : num 2.31 4.01 3.56 2.25 3.31 2.51 4.65 2.98 3.09 3.63 ...
$ control : num 2.03 3.63 4.2 2.84 2.4 2.95 3.77 1.9 3.83 5 ...
$ intention: num 2.5 3.99 4.35 1.51 1.45 2.59 4.08 2.58 4.87 3.09 ...
$ behavior : num 2.62 3.64 3.83 2.25 2 2.2 4.41 4.15 4.35 3.95 ...
>
> # path analysis in R using lavaan package
> # install.packages("lavaan")
> library(lavaan)
This is lavaan 0.6-9
lavaan is FREE software! Please report any bugs.
Warning message:
패키지 ‘lavaan’는 R 버전 4.1.2에서 작성되었습니다
>
> # Model speficiation
> specmod <- "
+ intention ~ attitude + norms + control
+ "
> # Estimate model
> fitmod <- sem(specmod, data=df)
>
> # summarize the result
> summary(fitmod, fit.measures=TRUE, rsquare=TRUE)
lavaan 0.6-9 ended normally after 11 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 4
Number of observations 199
Model Test User Model:
Test statistic 0.000
Degrees of freedom 0
Model Test Baseline Model:
Test statistic 91.633
Degrees of freedom 3
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 1.000
Tucker-Lewis Index (TLI) 1.000
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -219.244
Loglikelihood unrestricted model (H1) -219.244
Akaike (AIC) 446.489
Bayesian (BIC) 459.662
Sample-size adjusted Bayesian (BIC) 446.990
Root Mean Square Error of Approximation:
RMSEA 0.000
90 Percent confidence interval - lower 0.000
90 Percent confidence interval - upper 0.000
P-value RMSEA <= 0.05 NA
Standardized Root Mean Square Residual:
SRMR 0.000
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|)
intention ~
attitude 0.352 0.058 6.068 0.000
norms 0.153 0.059 2.577 0.010
control 0.275 0.058 4.740 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.intention 0.530 0.053 9.975 0.000
R-Square:
Estimate
intention 0.369
> # Model speficiation 2
> specmod2 <- "
+ intention ~ attitude + norms + control
+ attitude ~~ norms + control
+ norms ~~ control
+ "
> fitmod2 <- sem(specmod2, data=df)
>
> # summarize the result
> summary(fitmod2, fit.measures=TRUE, rsquare=TRUE)
lavaan 0.6-9 ended normally after 17 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 10
Number of observations 199
Model Test User Model:
Test statistic 0.000
Degrees of freedom 0
Model Test Baseline Model:
Test statistic 136.306
Degrees of freedom 6
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 1.000
Tucker-Lewis Index (TLI) 1.000
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1011.828
Loglikelihood unrestricted model (H1) -1011.828
Akaike (AIC) 2043.656
Bayesian (BIC) 2076.589
Sample-size adjusted Bayesian (BIC) 2044.908
Root Mean Square Error of Approximation:
RMSEA 0.000
90 Percent confidence interval - lower 0.000
90 Percent confidence interval - upper 0.000
P-value RMSEA <= 0.05 NA
Standardized Root Mean Square Residual:
SRMR 0.000
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|)
intention ~
attitude 0.352 0.058 6.068 0.000
norms 0.153 0.059 2.577 0.010
control 0.275 0.058 4.740 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
attitude ~~
norms 0.200 0.064 3.128 0.002
control 0.334 0.070 4.748 0.000
norms ~~
control 0.220 0.065 3.411 0.001
Variances:
Estimate Std.Err z-value P(>|z|)
.intention 0.530 0.053 9.975 0.000
attitude 0.928 0.093 9.975 0.000
norms 0.830 0.083 9.975 0.000
control 0.939 0.094 9.975 0.000
R-Square:
Estimate
intention 0.369
> fitmod3 <- lm(intention~attitude+norms+control, data=df)
> summary(fitmod3)
Call:
lm(formula = intention ~ attitude + norms + control, data = df)
Residuals:
Min 1Q Median 3Q Max
-1.80282 -0.52734 -0.06018 0.51228 1.85202
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.58579 0.23963 2.445 0.0154 *
attitude 0.35232 0.05866 6.006 9.13e-09 ***
norms 0.15250 0.05979 2.550 0.0115 *
control 0.27502 0.05862 4.692 5.09e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7356 on 195 degrees of freedom
Multiple R-squared: 0.369, Adjusted R-squared: 0.3593
F-statistic: 38.01 on 3 and 195 DF, p-value: < 2.2e-16
>
> # pbt model
> specmod4 <- "
+ # Directional relations (path)
+ intention ~ attitude + norms + control
+ behavior ~ intention
+ # Covariances
+ attitude ~~ norms + control
+ norms ~~ control
+ "
> fitmod4 <- sem(specmod4, data=df)
> summary(fitmod4, fit.measures=TRUE, rsquare=TRUE)
lavaan 0.6-9 ended normally after 17 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 12
Number of observations 199
# chi-square test
# p-value is over .05 indicating . . . .
Model Test User Model:
Test statistic 2.023
Degrees of freedom 3
P-value (Chi-square) 0.568
Model Test Baseline Model:
Test statistic 182.295
Degrees of freedom 10
P-value 0.000
# CFI >_ .90
# TLI >_ .95
# The two indicate that the model fits to the data well
User Model versus Baseline Model:
Comparative Fit Index (CFI) 1.000
Tucker-Lewis Index (TLI) 1.019
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1258.517
Loglikelihood unrestricted model (H1) -1257.506
Akaike (AIC) 2541.035
Bayesian (BIC) 2580.555
Sample-size adjusted Bayesian (BIC) 2542.538
# RMSEA <_ .08
#
Root Mean Square Error of Approximation:
RMSEA 0.000
90 Percent confidence interval - lower 0.000
90 Percent confidence interval - upper 0.103
P-value RMSEA <= 0.05 0.735
# SRMR <_ .08 meets the standard
#
Standardized Root Mean Square Residual:
SRMR 0.019
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|)
intention ~
attitude 0.352 0.058 6.068 0.000
norms 0.153 0.059 2.577 0.010
control 0.275 0.058 4.740 0.000
behavior ~
intention 0.453 0.065 7.014 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
attitude ~~
norms 0.200 0.064 3.128 0.002
control 0.334 0.070 4.748 0.000
norms ~~
control 0.220 0.065 3.411 0.001
Variances:
Estimate Std.Err z-value P(>|z|)
.intention 0.530 0.053 9.975 0.000
.behavior 0.699 0.070 9.975 0.000
attitude 0.928 0.093 9.975 0.000
norms 0.830 0.083 9.975 0.000
control 0.939 0.094 9.975 0.000
R-Square:
Estimate
intention 0.369
behavior 0.198
> specmod5 <- "
+ # Directional relations (path)
+ intention ~ attitude + norms + control
+ behavior ~ intention + norms
+ # Covariances
+ attitude ~~ norms + control
+ norms ~~ control
+ "
> fitmod5 <- sem(specmod5, data=df)
> summary(fitmod5, fit.measures=TRUE, rsquare=TRUE)
lavaan 0.6-12 ended normally after 18 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 13
Number of observations 199
Model Test User Model:
Test statistic 1.781
Degrees of freedom 2
P-value (Chi-square) 0.410
Model Test Baseline Model:
Test statistic 182.295
Degrees of freedom 10
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 1.000
Tucker-Lewis Index (TLI) 1.006
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1258.396
Loglikelihood unrestricted model (H1) -1257.506
Akaike (AIC) 2542.792
Bayesian (BIC) 2585.605
Sample-size adjusted Bayesian (BIC) 2544.421
Root Mean Square Error of Approximation:
RMSEA 0.000
90 Percent confidence interval - lower 0.000
90 Percent confidence interval - upper 0.136
P-value RMSEA <= 0.05 0.569
Standardized Root Mean Square Residual:
SRMR 0.018
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|)
intention ~
attitude 0.352 0.058 6.068 0.000
norms 0.153 0.059 2.577 0.010
control 0.275 0.058 4.740 0.000
behavior ~
intention 0.443 0.068 6.525 0.000
norms 0.034 0.068 0.493 0.622
Covariances:
Estimate Std.Err z-value P(>|z|)
attitude ~~
norms 0.200 0.064 3.128 0.002
control 0.334 0.070 4.748 0.000
norms ~~
control 0.220 0.065 3.411 0.001
Variances:
Estimate Std.Err z-value P(>|z|)
.intention 0.530 0.053 9.975 0.000
.behavior 0.698 0.070 9.975 0.000
attitude 0.928 0.093 9.975 0.000
norms 0.830 0.083 9.975 0.000
control 0.939 0.094 9.975 0.000
R-Square:
Estimate
intention 0.369
behavior 0.199
Path analysis in R with Lavaan (introduction)
By Mike Crowson, Ph.D.
September 17, 2019
install.packages("lavaan")
# processdata<-read.csv("path analysis dataN BinW.csv", header=TRUE, sep=",")
processdata<-read.csv("http://commres.net/wiki/_media/r/path_analysis_datan_binw.csv",
header=TRUE, sep=",", fileEncoding="UTF-8-BOM")
str(processdata)
library(lavaan)
# model specification model <- ' #equation where interest is predicted by ses # & mastery and performance goals interest ~ mastery + perfgoal + ses # equation where achieve is predicted by # interest and anxiety achieve ~ anxiety + interest + mastery # equation where anxiety is predicted # by mastery and performance goals anxiety ~ perfgoal + mastery # estimating the variances of # the exogenous variables (ses, mastery,performance) mastery ~~ mastery perfgoal ~~ perfgoal ses ~~ ses # estimtating the covariances of the exogenous # variables (ses, mastery,performance) mastery ~~ perfgoal + ses perfgoal ~~ ses # estimating the residual variances # for endogenous variables (interest, anxiety, achieve) interest ~~ interest anxiety ~~ anxiety achieve ~~ achieve # estimating the covariance of residuals # for interest and anxiety interest ~~ anxiety '
fit<-lavaan(model, data=processdata)
summary(fit, fit.measures=TRUE)
summary(fit, fit.measures=TRUE, standardized=TRUE, rsquare=TRUE)
parameterEstimates(fit)
fitMeasures(fit)
modificationIndices(fit)
output
> # install.packages("lavaan")
>
> # processdata<-read.csv("path analysis dataN BinW.csv", header=TRUE, sep=",")
> processdata<-read.csv("http://commres.net/wiki/_media/r/path_analysis_datan_binw.csv",
+ header=TRUE, sep=",", fileEncoding="UTF-8-BOM")
>
> str(processdata)
'data.frame': 140 obs. of 9 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ ses : int 1 0 0 1 1 1 0 0 1 1 ...
$ genderid: int 1 0 1 1 1 1 0 0 0 0 ...
$ perfgoal: num 29.5 29.5 30.4 33.5 28.7 ...
$ achieve : num 6.12 1.62 4.5 2.38 5.12 ...
$ mastery : num 5.71 1.43 1.29 2.29 4.57 ...
$ interest: num 6 4 2 4 5.5 4 4 5 4.5 4 ...
$ anxiety : num 1.67 6.33 3.67 3.67 3.67 ...
$ pgoal_MS: int 0 0 1 1 0 1 0 1 0 0 ...
> library(lavaan)
>
> # model specification
> model <- '
+ # equation where interest is predicted by ses
+ # & mastery and performance goals
+ interest ~ mastery + perfgoal + ses
+
+ # equation where achieve is predicted by
+ # interest and anxiety
+ achieve ~ anxiety + interest + mastery
+
+ # equation where anxiety is predicted
+ # by mastery and performance goals
+ anxiety ~ perfgoal + mastery
+
+ # estimating the variances of
+ # the exogenous variables (ses, mastery,performance)
+ mastery ~~ mastery
+ perfgoal ~~ perfgoal
+ ses ~~ ses
+
+ # estimtating the covariances of the exogenous
+ # variables (ses, mastery,performance)
+ mastery ~~ perfgoal + ses
+ perfgoal ~~ ses
+
+ # estimating the residual variances
+ # for endogenous variables (interest, anxiety, achieve)
+ interest ~~ interest
+ anxiety ~~ anxiety
+ achieve ~~ achieve
+
+ # estimating the covariance of residuals
+ # for interest and anxiety
+ interest ~~ anxiety '
>
> fit<-lavaan(model, data=processdata)
> summary(fit, fit.measures=TRUE)
lavaan 0.6.16 ended normally after 27 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 18
Number of observations 140
Model Test User Model:
Test statistic 29.231
Degrees of freedom 3
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 202.409
Degrees of freedom 15
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.860
Tucker-Lewis Index (TLI) 0.300
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1391.274
Loglikelihood unrestricted model (H1) -1376.659
Akaike (AIC) 2818.548
Bayesian (BIC) 2871.498
Sample-size adjusted Bayesian (SABIC) 2814.548
Root Mean Square Error of Approximation:
RMSEA 0.250
90 Percent confidence interval - lower 0.172
90 Percent confidence interval - upper 0.336
P-value H_0: RMSEA <= 0.050 0.000
P-value H_0: RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
SRMR 0.074
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|)
interest ~
mastery 0.708 0.088 8.066 0.000
perfgoal -0.035 0.040 -0.879 0.380
ses 0.520 0.242 2.154 0.031
achieve ~
anxiety -0.040 0.054 -0.747 0.455
interest 0.211 0.060 3.527 0.000
mastery 0.345 0.079 4.358 0.000
anxiety ~
perfgoal 0.025 0.045 0.556 0.578
mastery -0.387 0.097 -4.009 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
mastery ~~
perfgoal -0.935 0.361 -2.590 0.010
ses 0.170 0.061 2.805 0.005
perfgoal ~~
ses -0.226 0.128 -1.768 0.077
.interest ~~
.anxiety 0.059 0.181 0.329 0.742
Variances:
Estimate Std.Err z-value P(>|z|)
mastery 1.944 0.232 8.367 0.000
perfgoal 8.936 1.068 8.367 0.000
ses 0.249 0.030 8.367 0.000
.interest 1.895 0.227 8.367 0.000
.anxiety 2.410 0.288 8.367 0.000
.achieve 0.988 0.118 8.367 0.000
> summary(fit, fit.measures=TRUE, standardized=TRUE, rsquare=TRUE)
lavaan 0.6.16 ended normally after 27 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 18
Number of observations 140
Model Test User Model:
Test statistic 29.231
Degrees of freedom 3
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 202.409
Degrees of freedom 15
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.860
Tucker-Lewis Index (TLI) 0.300
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1391.274
Loglikelihood unrestricted model (H1) -1376.659
Akaike (AIC) 2818.548
Bayesian (BIC) 2871.498
Sample-size adjusted Bayesian (SABIC) 2814.548
Root Mean Square Error of Approximation:
RMSEA 0.250
90 Percent confidence interval - lower 0.172
90 Percent confidence interval - upper 0.336
P-value H_0: RMSEA <= 0.050 0.000
P-value H_0: RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
SRMR 0.074
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
interest ~
mastery 0.708 0.088 8.066 0.000 0.708 0.558
perfgoal -0.035 0.040 -0.879 0.380 -0.035 -0.060
ses 0.520 0.242 2.154 0.031 0.520 0.147
achieve ~
anxiety -0.040 0.054 -0.747 0.455 -0.040 -0.053
interest 0.211 0.060 3.527 0.000 0.211 0.294
mastery 0.345 0.079 4.358 0.000 0.345 0.379
anxiety ~
perfgoal 0.025 0.045 0.556 0.578 0.025 0.045
mastery -0.387 0.097 -4.009 0.000 -0.387 -0.327
Covariances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
mastery ~~
perfgoal -0.935 0.361 -2.590 0.010 -0.935 -0.224
ses 0.170 0.061 2.805 0.005 0.170 0.244
perfgoal ~~
ses -0.226 0.128 -1.768 0.077 -0.226 -0.151
.interest ~~
.anxiety 0.059 0.181 0.329 0.742 0.059 0.028
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
mastery 1.944 0.232 8.367 0.000 1.944 1.000
perfgoal 8.936 1.068 8.367 0.000 8.936 1.000
ses 0.249 0.030 8.367 0.000 0.249 1.000
.interest 1.895 0.227 8.367 0.000 1.895 0.606
.anxiety 2.410 0.288 8.367 0.000 2.410 0.884
.achieve 0.988 0.118 8.367 0.000 0.988 0.613
R-Square:
Estimate
interest 0.394
anxiety 0.116
achieve 0.387
>
> parameterEstimates(fit)
lhs op rhs est se z pvalue ci.lower ci.upper
1 interest ~ mastery 0.708 0.088 8.066 0.000 0.536 0.880
2 interest ~ perfgoal -0.035 0.040 -0.879 0.380 -0.114 0.043
3 interest ~ ses 0.520 0.242 2.154 0.031 0.047 0.994
4 achieve ~ anxiety -0.040 0.054 -0.747 0.455 -0.146 0.066
5 achieve ~ interest 0.211 0.060 3.527 0.000 0.094 0.328
6 achieve ~ mastery 0.345 0.079 4.358 0.000 0.190 0.500
7 anxiety ~ perfgoal 0.025 0.045 0.556 0.578 -0.063 0.113
8 anxiety ~ mastery -0.387 0.097 -4.009 0.000 -0.576 -0.198
9 mastery ~~ mastery 1.944 0.232 8.367 0.000 1.488 2.399
10 perfgoal ~~ perfgoal 8.936 1.068 8.367 0.000 6.842 11.029
11 ses ~~ ses 0.249 0.030 8.367 0.000 0.191 0.308
12 mastery ~~ perfgoal -0.935 0.361 -2.590 0.010 -1.642 -0.227
13 mastery ~~ ses 0.170 0.061 2.805 0.005 0.051 0.288
14 perfgoal ~~ ses -0.226 0.128 -1.768 0.077 -0.476 0.024
15 interest ~~ interest 1.895 0.227 8.367 0.000 1.451 2.339
16 anxiety ~~ anxiety 2.410 0.288 8.367 0.000 1.845 2.974
17 achieve ~~ achieve 0.988 0.118 8.367 0.000 0.757 1.220
18 interest ~~ anxiety 0.059 0.181 0.329 0.742 -0.295 0.414
> fitMeasures(fit)
npar fmin chisq
18.000 0.104 29.231
df pvalue baseline.chisq
3.000 0.000 202.409
baseline.df baseline.pvalue cfi
15.000 0.000 0.860
tli nnfi rfi
0.300 0.300 0.278
nfi pnfi ifi
0.856 0.171 0.868
rni logl unrestricted.logl
0.860 -1391.274 -1376.659
aic bic ntotal
2818.548 2871.498 140.000
bic2 rmsea rmsea.ci.lower
2814.548 0.250 0.172
rmsea.ci.upper rmsea.ci.level rmsea.pvalue
0.336 0.900 0.000
rmsea.close.h0 rmsea.notclose.pvalue rmsea.notclose.h0
0.050 1.000 0.080
rmr rmr_nomean srmr
0.122 0.122 0.074
srmr_bentler srmr_bentler_nomean crmr
0.074 0.074 0.088
crmr_nomean srmr_mplus srmr_mplus_nomean
0.088 0.074 0.074
cn_05 cn_01 gfi
38.428 55.335 0.941
agfi pgfi mfi
0.587 0.134 0.911
ecvi
0.466
> modificationIndices(fit)
lhs op rhs mi epc sepc.lv sepc.all sepc.nox
19 interest ~~ achieve 25.396 -2.899 -2.899 -2.118 -2.118
23 achieve ~~ anxiety 6.669 6.803 6.803 4.408 4.408
24 achieve ~~ mastery 22.476 -1.743 -1.743 -1.257 -1.257
25 achieve ~~ perfgoal 2.763 -0.406 -0.406 -0.137 -0.137
26 achieve ~~ ses 20.541 0.186 0.186 0.376 0.376
27 anxiety ~~ mastery 0.921 0.765 0.765 0.354 0.354
28 anxiety ~~ perfgoal 0.921 -3.576 -3.576 -0.771 -0.771
29 anxiety ~~ ses 0.921 -0.061 -0.061 -0.078 -0.078
30 interest ~ achieve 25.396 -2.933 -2.933 -2.106 -2.106
32 achieve ~ perfgoal 4.551 -0.062 -0.062 -0.146 -0.146
33 achieve ~ ses 22.431 0.837 0.837 0.329 0.329
34 anxiety ~ interest 0.921 -0.502 -0.502 -0.538 -0.538
35 anxiety ~ achieve 1.119 1.922 1.922 1.478 1.478
36 anxiety ~ ses 0.921 -0.261 -0.261 -0.079 -0.079
37 mastery ~ interest 0.923 12.889 12.889 16.348 16.348
38 mastery ~ achieve 22.801 -1.774 -1.774 -1.616 -1.616
39 mastery ~ anxiety 0.921 0.318 0.318 0.376 0.376
43 perfgoal ~ achieve 2.745 -0.410 -0.410 -0.174 -0.174
44 perfgoal ~ anxiety 0.921 -1.484 -1.484 -0.820 -0.820
47 ses ~ interest 0.923 -1.021 -1.021 -3.618 -3.618
48 ses ~ achieve 20.964 0.190 0.190 0.484 0.484
49 ses ~ anxiety 0.921 -0.025 -0.025 -0.083 -0.083
>
>
# model specification model<-' # equation where interest is predicted by ses & mastery and # performance goals interest ~ mastery + perfgoal + ses # equation where achieve is predicted by interest and anxiety achieve~anxiety+interest+mastery #equation where anxiety is predicted by mastery and performance goals anxiety~perfgoal+mastery # estimtating the variances of the exogenous variables (ses, mastery,performance) mastery~~mastery perfgoal~~perfgoal ses~~ses # estimtating the covariances of the exogenous variables (ses, mastery,performance) mastery~~perfgoal+ses perfgoal~~ses # The auto.var argument when fitting the model can be used so that # you do not have to directly request estimation of residual variances # Estimating the covariance of residuals for interest and anxiety interest~~anxiety' fit<-lavaan(model, data=processdata, auto.var=TRUE) summary(fit, fit.measures=TRUE, standardized=TRUE, rsquare=TRUE)
install.packages("semPlot")
library("semPlot")
semPaths(fit,what="paths",whatLabels="par",style="lisrel",layout="tree",
rotation=2)
install.packages("lavaanPlot")
library(lavaanPlot)
lavaanPlot(model = fit,
node_options = list(shape = "box", fontname = "Helvetica"),
edge_options = list(color = "grey"),
coefs = TRUE,
covs = TRUE,
stars = c("regress"))
Resources on the use of lavaan:
Using the 'semPlot' package
Using the 'lavaanPlot' package
Raw data for all examples can be downloaded at…
A copy of the Powerpoint of the model specification can be downloaded at…
Basics of path analysis using Lavaan.txt
Displaying Basics of path analysis using Lavaan.txt.
CODING
processdata<-read.csv("http://commres.net/wiki/_media/r/path_analysis_datan_binw.csv",
header=TRUE, sep=",", fileEncoding="UTF-8-BOM")
str(processdata)
library(lavaan)
model <- '
interest ~ mastery + perfgoal + ses
achieve ~ anxiety + interest + mastery
anxiety ~ perfgoal + mastery
# variances
mastery ~~ mastery
perfgoal ~~ perfgoal
ses ~~ ses
mastery ~~ perfgoal + ses
perfgoal ~~ ses
interest ~~ interest
anxiety ~~ anxiety
achieve ~~ achieve
interest~~anxiety
'
fit <- lavaan(model, data=processdata)
fit <- sem(model, data=processdata)
summary(fit, fit.measures=TRUE)
summary(fit, fit.measures=TRUE, standardized=TRUE, rsquare=TRUE)
parameterEstimates(fit)
fitMeasures(fit)
modificationIndices(fit)
install.packages("semPlot")
library("semPlot")
semPaths(fit,what="paths",whatLabels="par",style="lisrel",layout="tree",
rotation=2)
install.packages("lavaanPlot")
library(lavaanPlot)
lavaanPlot(
model = fit,
node_options = list(shape = "box", fontname = "Helvetica"),
edge_options = list(color = "grey"),
coefs = TRUE, covs=TRUE,
stars = c("regress"))
model <- '
# labeling path from mastery to interest
interest ~ a*mastery + perfgoal + ses
# labeling path from interest to achieve.
# Adding labeled path from
# mastery to achieve
achieve ~ e*anxiety + b*interest + c*mastery
# predicting anxiety and labeling path from mastery
anxiety ~ perfgoal + d*mastery
# estimtating the variances and covariances of
# the exogenous variables (ses, mastery,performance)
mastery~~mastery
perfgoal~~perfgoal
ses~~ses
mastery~~perfgoal+ses
perfgoal~~ses
# estimating the variances of residuals
# for endogenous variables
# (interest, anxiety, achieve)
interest~~interest
anxiety~~anxiety
achieve~~achieve
# estimating the covariance of residuals
# for interest and anxiety
interest~~anxiety
# calculating specific indirect effect
# of mastery on achieve via interest
SIE1:=a*b
# calculating specific indirect effect of
# mastery on achieve via anxiety
SIE2:=d*e
# calculating total indirect effect of
# mastery on achievement via mediators
TIE:=SIE1+SIE2
# calculating total effect of mastery on achieve
TE:=TIE+c'
# using naive bootstrap to obtain standard errors
fit <- sem(model, data=processdata, se="bootstrap")
summary(fit,fit.measures=TRUE)
# using 'parameterEstimates' function will give
# us confidence intervals based on naive bootstrap.
# A standard approach to testing indirect effects.
parameterEstimates(fit)
processdata <- read.csv("http://commres.net/wiki/_media/r/path_analysis_datan_binw.csv")
str(processdata)
# install.packages("MVN")
library(MVN)
newdata <- processdata[c("achieve", "interest", "anxiety")]
str(newdata)
Use the 'mvn' function to evalue normality
Multivariate normality is evidenced by p-values associated with multivariate skewness and kurtosis statistics that are > .05. In those cases where both the skewness and kurtosis results are non-significant (p's > .05), then the data are assumed to follow a multivariate normal distribution where p > .05 (Korkmaz, Goksuluk, & Zarasiz, 2014, 2019).
You can also use plots to explore possible multivariate outliers. Moreover, you can examine univariate tests of normality (the default is Shapiro-Wilk test, but can be changed if desired). A significant test result regarding a specific variable indicates a significant departure from normality.
mvn(newdata, mvnTest="mardia") mvn(newdata, multivariatePlot="qq") mvn(newdata, multivariateOutlierMethod="quan")
You can generate univariate plot as well to evaluate distribution of the endogenous variables for non-normality. Skewness values approaching 2 or kurtoisis values over 7 may be considered indicative of more “significant problems” with non-normality (Curran, et al., 1996).
mvn(newdata, univariatePlot="histogram")
mvn(newdata, univariatePlot="box")
model <- '
interest ~ mastery + perfgoal + ses
achieve ~ anxiety + interest + mastery
anxiety ~ perfgoal + mastery
# variances
mastery ~~ mastery
perfgoal ~~ perfgoal
ses ~~ ses
mastery ~~ perfgoal + ses
perfgoal ~~ ses
interest ~~ interest
anxiety ~~ anxiety
achieve ~~ achieve
interest~~anxiety
'
We will fit the model using the 'estimator' argument at set it equal to “MLM.” This will result in the Satorra-Bentler model chi-square being computed. We will also use the 'se' argument and set it to “roburst.”
fit <- sem(model, data=processdata, estimator = "MLM", se="roburst") summary(fit,fit.measures=TRUE)
reference
see lme4 tutorial
Using mtcars in R
?mtcars mtcars str(mtcars) df <- mtcars
# model specfication model <-' mpg ~ hp + gear + cyl + disp + carb + am + wt hp ~ cyl + disp + carb ' # model fit fit <- cfa(model, data = mtcars) summary(fit, fit.measures = TRUE, standardized=T, rsquare=T) semPaths(fit, 'std', layout = 'circle')