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.
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.
## # 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))