Go back

A wider array of residual structures is available using the more general efast() function. Just as in the hemisphere models, the residual structure in the general function is represented as residual covariances between the observed variables. For example, we can use the Holzinger & Swineford (1939) data to run an exploratory factor analysis with residual covariances between the x4 and x7 variables and the x5 and x9 variables:

res_struct <- list(
 c("x4", "x7"),
 c("x5", "x9")
)
fit <- efast(
  data    = lavaan::HolzingerSwineford1939[,7:15], 
  M       = 3, 
  rstruct = res_struct
)
summary(fit)
## lavaan 0.6-5 ended normally after 51 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free parameters                         38
##   Number of equality constraints                     3
##   Row rank of the constraints matrix                 3
##                                                       
##   Rotation method                       GEOMIN OBLIQUE
##   Geomin epsilon                                  0.01
##   Rotation algorithm (rstarts)               GPA (100)
##   Standardized metric                            FALSE
##   Row weights                                     None
##                                                       
##   Number of observations                           301
##                                                       
## Model Test User Model:
##                                                       
##   Test statistic                                 9.073
##   Degrees of freedom                                10
##   P-value (Chi-square)                           0.525
## 
## Parameter Estimates:
## 
##   Information                                 Observed
##   Observed information based on                Hessian
##   Standard errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   F1 =~ efa1                                          
##     x1                0.613    0.073    8.376    0.000
##     x2                0.486    0.075    6.468    0.000
##     x3                0.680    0.072    9.382    0.000
##     x4                0.048    0.030    1.622    0.105
##     x5               -0.103    0.043   -2.396    0.017
##     x6                0.062    0.039    1.595    0.111
##     x7               -0.116    0.075   -1.543    0.123
##     x8                0.124    0.115    1.075    0.282
##     x9                0.405    0.100    4.052    0.000
##   F2 =~ efa1                                          
##     x1                0.188    0.066    2.850    0.004
##     x2                0.046    0.054    0.852    0.394
##     x3               -0.069    0.053   -1.292    0.196
##     x4                0.835    0.051   16.244    0.000
##     x5                0.904    0.052   17.249    0.000
##     x6                0.803    0.051   15.705    0.000
##     x7                0.016    0.034    0.490    0.624
##     x8               -0.014    0.039   -0.352    0.725
##     x9                0.013    0.034    0.392    0.695
##   F3 =~ efa1                                          
##     x1                0.021    0.040    0.517    0.605
##     x2               -0.108    0.068   -1.591    0.112
##     x3                0.021    0.041    0.503    0.615
##     x4               -0.041    0.041   -1.007    0.314
##     x5                0.023    0.027    0.825    0.409
##     x6                0.016    0.035    0.476    0.634
##     x7                0.723    0.068   10.550    0.000
##     x8                0.692    0.093    7.475    0.000
##     x9                0.449    0.074    6.067    0.000
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##  .x4 ~~                                               
##    .x7                0.106    0.037    2.883    0.004
##  .x5 ~~                                               
##    .x9                0.056    0.033    1.712    0.087
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1       (v_1)    0.500    0.063    7.879       NA
##    .x2       (v_2)    0.759    0.073   10.348       NA
##    .x3       (v_3)    0.555    0.075    7.426       NA
##    .x4       (v_4)    0.282    0.035    7.965       NA
##    .x5       (v_5)    0.224    0.038    5.904       NA
##    .x6       (v_6)    0.309    0.035    8.745       NA
##    .x7       (v_7)    0.498    0.095    5.234       NA
##    .x8       (v_8)    0.465    0.079    5.881       NA
##    .x9       (v_9)    0.538    0.059    9.073       NA
##     F1                1.000                           
##     F2                1.000                           
##     F3                1.000

The lavaan syntax of any model from the efast package is available as a component of the fitted model (fit@external$syntax). This means that any EFAST model can be easily extended with further variables. An example in the case of the hemisphere model from the previous tutorials could be predicting participant phenotype on the basis of the estimated factors. This extension would amount to adding the following line to the current example model syntax:

phenotype_variable ~ F1 + F2 + F3 + F4 + F5 + F6

The extended model can then be fitted by a call to the fitting function from the lavaan package:

lavaan(
  model          = extended_model, 
  data           = raw_data, 
  auto.fix.first = FALSE, 
  auto.var       = TRUE, 
  auto.efa       = TRUE, 
  information    = "observed", 
  std.ov         = TRUE
)

By adding this extension, lavaan will in one step find those factors that best explain the covariance between brain regions and the phenotype of interest, reasonably similar to the idea of PLS regression. In this way, the EFAST model can serve as a starting point for an ESEM with structural parameters.

Full syntax

Below is the full syntax for the the fitted EFAST model on the brain imaging data from both hemispheres, with 6 latent factors and a symmetry structure. Within this syntax, the efast package adds additional constraints to aid in convergence of the parameters. In addition, syntax is added for the lateralization indices.

cat(efast_hemi_fit@external$syntax)
## # Exploratory factor model
## # ------------------------
##  efa('efa1')*F1 +
## efa('efa1')*F2 +
## efa('efa1')*F3 +
## efa('efa1')*F4 +
## efa('efa1')*F5 +
## efa('efa1')*F6 =~ lh_ROI1 + lh_ROI2 + lh_ROI3 + lh_ROI4 + lh_ROI5 + lh_ROI6 + lh_ROI7 + lh_ROI8 + lh_ROI9 + lh_ROI10 + lh_ROI11 + lh_ROI12 + lh_ROI13 + lh_ROI14 + lh_ROI15 + lh_ROI16 + lh_ROI17 + lh_ROI18 + lh_ROI19 + lh_ROI20 + lh_ROI21 + lh_ROI22 + lh_ROI23 + lh_ROI24 + lh_ROI25 + lh_ROI26 + lh_ROI27 + lh_ROI28 + lh_ROI29 + lh_ROI30 + lh_ROI31 + lh_ROI32 + lh_ROI33 + lh_ROI34 + rh_ROI1 + rh_ROI2 + rh_ROI3 + rh_ROI4 + rh_ROI5 + rh_ROI6 + rh_ROI7 + rh_ROI8 + rh_ROI9 + rh_ROI10 + rh_ROI11 + rh_ROI12 + rh_ROI13 + rh_ROI14 + rh_ROI15 + rh_ROI16 + rh_ROI17 + rh_ROI18 + rh_ROI19 + rh_ROI20 + rh_ROI21 + rh_ROI22 + rh_ROI23 + rh_ROI24 + rh_ROI25 + rh_ROI26 + rh_ROI27 + rh_ROI28 + rh_ROI29 + rh_ROI30 + rh_ROI31 + rh_ROI32 + rh_ROI33 + rh_ROI34
## 
## # Uniqueness constraints
## # ----------------------
## lh_ROI1 ~~ lower(-13993.4797637206)*lh_ROI1 + upper(293863.075038132)*lh_ROI1 + v_1*lh_ROI1
## lh_ROI2 ~~ lower(-10348.4890982868)*lh_ROI2 + upper(217318.271064024)*lh_ROI2 + v_2*lh_ROI2
## lh_ROI3 ~~ lower(-78770.6806573636)*lh_ROI3 + upper(1654184.29380464)*lh_ROI3 + v_3*lh_ROI3
## lh_ROI4 ~~ lower(-19950.7650556666)*lh_ROI4 + upper(418966.066168999)*lh_ROI4 + v_4*lh_ROI4
## lh_ROI5 ~~ lower(-13910.3532508319)*lh_ROI5 + upper(292117.41826747)*lh_ROI5 + v_5*lh_ROI5
## lh_ROI6 ~~ lower(-115142.590773976)*lh_ROI6 + upper(2417994.40625349)*lh_ROI6 + v_6*lh_ROI6
## lh_ROI7 ~~ lower(-210606.806054634)*lh_ROI7 + upper(4422742.92714732)*lh_ROI7 + v_7*lh_ROI7
## lh_ROI8 ~~ lower(-221098.516745292)*lh_ROI8 + upper(4643068.85165114)*lh_ROI8 + v_8*lh_ROI8
## lh_ROI9 ~~ lower(-12151.0395052477)*lh_ROI9 + upper(255171.829610202)*lh_ROI9 + v_9*lh_ROI9
## lh_ROI10 ~~ lower(-207095.453392982)*lh_ROI10 + upper(4349004.52125262)*lh_ROI10 + v_10*lh_ROI10
## lh_ROI11 ~~ lower(-51555.0119607649)*lh_ROI11 + upper(1082655.25117606)*lh_ROI11 + v_11*lh_ROI11
## lh_ROI12 ~~ lower(-60131.865595877)*lh_ROI12 + upper(1262769.17751342)*lh_ROI12 + v_12*lh_ROI12
## lh_ROI13 ~~ lower(-28010.1118856976)*lh_ROI13 + upper(588212.34959965)*lh_ROI13 + v_13*lh_ROI13
## lh_ROI14 ~~ lower(-182904.802717737)*lh_ROI14 + upper(3841000.85707249)*lh_ROI14 + v_14*lh_ROI14
## lh_ROI15 ~~ lower(-5153.22029385318)*lh_ROI15 + upper(108217.626170917)*lh_ROI15 + v_15*lh_ROI15
## lh_ROI16 ~~ lower(-16444.0318799443)*lh_ROI16 + upper(345324.669478831)*lh_ROI16 + v_16*lh_ROI16
## lh_ROI17 ~~ lower(-37342.4691991103)*lh_ROI17 + upper(784191.853181317)*lh_ROI17 + v_17*lh_ROI17
## lh_ROI18 ~~ lower(-7015.71966636367)*lh_ROI18 + upper(147330.112993637)*lh_ROI18 + v_18*lh_ROI18
## lh_ROI19 ~~ lower(-25643.7505564725)*lh_ROI19 + upper(538518.761685923)*lh_ROI19 + v_19*lh_ROI19
## lh_ROI20 ~~ lower(-9042.01372368027)*lh_ROI20 + upper(189882.288197286)*lh_ROI20 + v_20*lh_ROI20
## lh_ROI21 ~~ lower(-127658.334582129)*lh_ROI21 + upper(2680825.02622471)*lh_ROI21 + v_21*lh_ROI21
## lh_ROI22 ~~ lower(-16921.4960697826)*lh_ROI22 + upper(355351.417465434)*lh_ROI22 + v_22*lh_ROI22
## lh_ROI23 ~~ lower(-218655.864028077)*lh_ROI23 + upper(4591773.14458961)*lh_ROI23 + v_23*lh_ROI23
## lh_ROI24 ~~ lower(-107174.503076179)*lh_ROI24 + upper(2250664.56459975)*lh_ROI24 + v_24*lh_ROI24
## lh_ROI25 ~~ lower(-14590.4025267503)*lh_ROI25 + upper(306398.453061756)*lh_ROI25 + v_25*lh_ROI25
## lh_ROI26 ~~ lower(-308126.642933268)*lh_ROI26 + upper(6470659.50159863)*lh_ROI26 + v_26*lh_ROI26
## lh_ROI27 ~~ lower(-567444.02485212)*lh_ROI27 + upper(11916324.5218945)*lh_ROI27 + v_27*lh_ROI27
## lh_ROI28 ~~ lower(-223464.980403162)*lh_ROI28 + upper(4692764.58846639)*lh_ROI28 + v_28*lh_ROI28
## lh_ROI29 ~~ lower(-210371.067759917)*lh_ROI29 + upper(4417792.42295826)*lh_ROI29 + v_29*lh_ROI29
## lh_ROI30 ~~ lower(-214454.957333775)*lh_ROI30 + upper(4503554.10400927)*lh_ROI30 + v_30*lh_ROI30
## lh_ROI31 ~~ lower(-1033.35313157121)*lh_ROI31 + upper(21700.4157629955)*lh_ROI31 + v_31*lh_ROI31
## lh_ROI32 ~~ lower(-10741.3946362945)*lh_ROI32 + upper(225569.287362184)*lh_ROI32 + v_32*lh_ROI32
## lh_ROI33 ~~ lower(-3326.22796602778)*lh_ROI33 + upper(69850.7872865835)*lh_ROI33 + v_33*lh_ROI33
## lh_ROI34 ~~ lower(-35248.8350583003)*lh_ROI34 + upper(740225.536224306)*lh_ROI34 + v_34*lh_ROI34
## rh_ROI1 ~~ lower(-8308.46604839357)*rh_ROI1 + upper(174477.787016265)*rh_ROI1 + v_35*rh_ROI1
## rh_ROI2 ~~ lower(-12682.6731196199)*rh_ROI2 + upper(266336.135512018)*rh_ROI2 + v_36*rh_ROI2
## rh_ROI3 ~~ lower(-68191.5082601337)*rh_ROI3 + upper(1432021.67346281)*rh_ROI3 + v_37*rh_ROI3
## rh_ROI4 ~~ lower(-22596.6657219375)*rh_ROI4 + upper(474529.980160688)*rh_ROI4 + v_38*rh_ROI4
## rh_ROI5 ~~ lower(-13260.9639400389)*rh_ROI5 + upper(278480.242740816)*rh_ROI5 + v_39*rh_ROI5
## rh_ROI6 ~~ lower(-132429.7822454)*rh_ROI6 + upper(2781025.42715339)*rh_ROI6 + v_40*rh_ROI6
## rh_ROI7 ~~ lower(-330061.515346262)*rh_ROI7 + upper(6931291.8222715)*rh_ROI7 + v_41*rh_ROI7
## rh_ROI8 ~~ lower(-198919.257321719)*rh_ROI8 + upper(4177304.40375609)*rh_ROI8 + v_42*rh_ROI8
## rh_ROI9 ~~ lower(-10465.2466173908)*rh_ROI9 + upper(219770.178965206)*rh_ROI9 + v_43*rh_ROI9
## rh_ROI10 ~~ lower(-193979.371828728)*rh_ROI10 + upper(4073566.80840328)*rh_ROI10 + v_44*rh_ROI10
## rh_ROI11 ~~ lower(-46341.8529746432)*rh_ROI11 + upper(973178.912467507)*rh_ROI11 + v_45*rh_ROI11
## rh_ROI12 ~~ lower(-74702.136392697)*rh_ROI12 + upper(1568744.86424664)*rh_ROI12 + v_46*rh_ROI12
## rh_ROI13 ~~ lower(-27133.1357428076)*rh_ROI13 + upper(569795.850598959)*rh_ROI13 + v_47*rh_ROI13
## rh_ROI14 ~~ lower(-183454.30280325)*rh_ROI14 + upper(3852540.35886825)*rh_ROI14 + v_48*rh_ROI14
## rh_ROI15 ~~ lower(-3845.01451602437)*rh_ROI15 + upper(80745.3048365117)*rh_ROI15 + v_49*rh_ROI15
## rh_ROI16 ~~ lower(-20965.0817647794)*rh_ROI16 + upper(440266.717060367)*rh_ROI16 + v_50*rh_ROI16
## rh_ROI17 ~~ lower(-25604.0486305311)*rh_ROI17 + upper(537685.021241152)*rh_ROI17 + v_51*rh_ROI17
## rh_ROI18 ~~ lower(-8597.79324472772)*rh_ROI18 + upper(180553.658139282)*rh_ROI18 + v_52*rh_ROI18
## rh_ROI19 ~~ lower(-27421.0207770316)*rh_ROI19 + upper(575841.436317664)*rh_ROI19 + v_53*rh_ROI19
## rh_ROI20 ~~ lower(-12157.7757815127)*rh_ROI20 + upper(255313.291411766)*rh_ROI20 + v_54*rh_ROI20
## rh_ROI21 ~~ lower(-110791.519558372)*rh_ROI21 + upper(2326621.91072582)*rh_ROI21 + v_55*rh_ROI21
## rh_ROI22 ~~ lower(-15549.1515378846)*rh_ROI22 + upper(326532.182295576)*rh_ROI22 + v_56*rh_ROI22
## rh_ROI23 ~~ lower(-231805.083435852)*rh_ROI23 + upper(4867906.75215289)*rh_ROI23 + v_57*rh_ROI23
## rh_ROI24 ~~ lower(-117592.187142819)*rh_ROI24 + upper(2469435.92999919)*rh_ROI24 + v_58*rh_ROI24
## rh_ROI25 ~~ lower(-11094.130509664)*rh_ROI25 + upper(232976.740702944)*rh_ROI25 + v_59*rh_ROI25
## rh_ROI26 ~~ lower(-285948.505148891)*rh_ROI26 + upper(6004918.60812672)*rh_ROI26 + v_60*rh_ROI26
## rh_ROI27 ~~ lower(-532983.270280952)*rh_ROI27 + upper(11192648.6759)*rh_ROI27 + v_61*rh_ROI27
## rh_ROI28 ~~ lower(-200782.024915205)*rh_ROI28 + upper(4216422.52321931)*rh_ROI28 + v_62*rh_ROI28
## rh_ROI29 ~~ lower(-149451.871560063)*rh_ROI29 + upper(3138489.30276133)*rh_ROI29 + v_63*rh_ROI29
## rh_ROI30 ~~ lower(-150501.390735376)*rh_ROI30 + upper(3160529.20544289)*rh_ROI30 + v_64*rh_ROI30
## rh_ROI31 ~~ lower(-1672.58158915659)*rh_ROI31 + upper(35124.2133722883)*rh_ROI31 + v_65*rh_ROI31
## rh_ROI32 ~~ lower(-7090.08683440532)*rh_ROI32 + upper(148891.823522512)*rh_ROI32 + v_66*rh_ROI32
## rh_ROI33 ~~ lower(-1679.18589887011)*rh_ROI33 + upper(35262.9038762722)*rh_ROI33 + v_67*rh_ROI33
## rh_ROI34 ~~ lower(-41686.0171759037)*rh_ROI34 + upper(875406.360693978)*rh_ROI34 + v_68*rh_ROI34
## 
## # Hemisphere model
## # ----------------
## lh_ROI1 ~~ cov_ROI1*rh_ROI1
## lh_ROI2 ~~ cov_ROI2*rh_ROI2
## lh_ROI3 ~~ cov_ROI3*rh_ROI3
## lh_ROI4 ~~ cov_ROI4*rh_ROI4
## lh_ROI5 ~~ cov_ROI5*rh_ROI5
## lh_ROI6 ~~ cov_ROI6*rh_ROI6
## lh_ROI7 ~~ cov_ROI7*rh_ROI7
## lh_ROI8 ~~ cov_ROI8*rh_ROI8
## lh_ROI9 ~~ cov_ROI9*rh_ROI9
## lh_ROI10 ~~ cov_ROI10*rh_ROI10
## lh_ROI11 ~~ cov_ROI11*rh_ROI11
## lh_ROI12 ~~ cov_ROI12*rh_ROI12
## lh_ROI13 ~~ cov_ROI13*rh_ROI13
## lh_ROI14 ~~ cov_ROI14*rh_ROI14
## lh_ROI15 ~~ cov_ROI15*rh_ROI15
## lh_ROI16 ~~ cov_ROI16*rh_ROI16
## lh_ROI17 ~~ cov_ROI17*rh_ROI17
## lh_ROI18 ~~ cov_ROI18*rh_ROI18
## lh_ROI19 ~~ cov_ROI19*rh_ROI19
## lh_ROI20 ~~ cov_ROI20*rh_ROI20
## lh_ROI21 ~~ cov_ROI21*rh_ROI21
## lh_ROI22 ~~ cov_ROI22*rh_ROI22
## lh_ROI23 ~~ cov_ROI23*rh_ROI23
## lh_ROI24 ~~ cov_ROI24*rh_ROI24
## lh_ROI25 ~~ cov_ROI25*rh_ROI25
## lh_ROI26 ~~ cov_ROI26*rh_ROI26
## lh_ROI27 ~~ cov_ROI27*rh_ROI27
## lh_ROI28 ~~ cov_ROI28*rh_ROI28
## lh_ROI29 ~~ cov_ROI29*rh_ROI29
## lh_ROI30 ~~ cov_ROI30*rh_ROI30
## lh_ROI31 ~~ cov_ROI31*rh_ROI31
## lh_ROI32 ~~ cov_ROI32*rh_ROI32
## lh_ROI33 ~~ cov_ROI33*rh_ROI33
## lh_ROI34 ~~ cov_ROI34*rh_ROI34
## 
## # Lateralization index code
## # -----------------------------------
## LI_ROI1 := 1 - cov_ROI1 / (sqrt(v_1) * sqrt(v_35))
## LI_ROI2 := 1 - cov_ROI2 / (sqrt(v_2) * sqrt(v_36))
## LI_ROI3 := 1 - cov_ROI3 / (sqrt(v_3) * sqrt(v_37))
## LI_ROI4 := 1 - cov_ROI4 / (sqrt(v_4) * sqrt(v_38))
## LI_ROI5 := 1 - cov_ROI5 / (sqrt(v_5) * sqrt(v_39))
## LI_ROI6 := 1 - cov_ROI6 / (sqrt(v_6) * sqrt(v_40))
## LI_ROI7 := 1 - cov_ROI7 / (sqrt(v_7) * sqrt(v_41))
## LI_ROI8 := 1 - cov_ROI8 / (sqrt(v_8) * sqrt(v_42))
## LI_ROI9 := 1 - cov_ROI9 / (sqrt(v_9) * sqrt(v_43))
## LI_ROI10 := 1 - cov_ROI10 / (sqrt(v_10) * sqrt(v_44))
## LI_ROI11 := 1 - cov_ROI11 / (sqrt(v_11) * sqrt(v_45))
## LI_ROI12 := 1 - cov_ROI12 / (sqrt(v_12) * sqrt(v_46))
## LI_ROI13 := 1 - cov_ROI13 / (sqrt(v_13) * sqrt(v_47))
## LI_ROI14 := 1 - cov_ROI14 / (sqrt(v_14) * sqrt(v_48))
## LI_ROI15 := 1 - cov_ROI15 / (sqrt(v_15) * sqrt(v_49))
## LI_ROI16 := 1 - cov_ROI16 / (sqrt(v_16) * sqrt(v_50))
## LI_ROI17 := 1 - cov_ROI17 / (sqrt(v_17) * sqrt(v_51))
## LI_ROI18 := 1 - cov_ROI18 / (sqrt(v_18) * sqrt(v_52))
## LI_ROI19 := 1 - cov_ROI19 / (sqrt(v_19) * sqrt(v_53))
## LI_ROI20 := 1 - cov_ROI20 / (sqrt(v_20) * sqrt(v_54))
## LI_ROI21 := 1 - cov_ROI21 / (sqrt(v_21) * sqrt(v_55))
## LI_ROI22 := 1 - cov_ROI22 / (sqrt(v_22) * sqrt(v_56))
## LI_ROI23 := 1 - cov_ROI23 / (sqrt(v_23) * sqrt(v_57))
## LI_ROI24 := 1 - cov_ROI24 / (sqrt(v_24) * sqrt(v_58))
## LI_ROI25 := 1 - cov_ROI25 / (sqrt(v_25) * sqrt(v_59))
## LI_ROI26 := 1 - cov_ROI26 / (sqrt(v_26) * sqrt(v_60))
## LI_ROI27 := 1 - cov_ROI27 / (sqrt(v_27) * sqrt(v_61))
## LI_ROI28 := 1 - cov_ROI28 / (sqrt(v_28) * sqrt(v_62))
## LI_ROI29 := 1 - cov_ROI29 / (sqrt(v_29) * sqrt(v_63))
## LI_ROI30 := 1 - cov_ROI30 / (sqrt(v_30) * sqrt(v_64))
## LI_ROI31 := 1 - cov_ROI31 / (sqrt(v_31) * sqrt(v_65))
## LI_ROI32 := 1 - cov_ROI32 / (sqrt(v_32) * sqrt(v_66))
## LI_ROI33 := 1 - cov_ROI33 / (sqrt(v_33) * sqrt(v_67))
## LI_ROI34 := 1 - cov_ROI34 / (sqrt(v_34) * sqrt(v_68))