# library(psych)
# library(kableExtra)
# library(ggplot2)
# library(tidyr)
# library(dplyr)
# library(gtools)
# library(nFactors)
# library(corrplot)
# library(sjPlot)
# library(afex)
# library(naniar)
# library(stringr)
# library(emmeans)
library(lavaan)
## This is lavaan 0.6-19
## lavaan is FREE software! Please report any bugs.
library(semPlot)
# library(sjPlot)
df <- read.csv(file="data_study2_clean.csv", header=T)
df$Q8_1 <- as.numeric(df$Q8_1)
df$Q8_2 <- as.numeric(df$Q8_2)
df$Q8_3 <- as.numeric(df$Q8_3)
df$Q8_4 <- as.numeric(df$Q8_4)
df$Q8_5 <- as.numeric(df$Q8_5)
df$Q8_6 <- as.numeric(df$Q8_6)
d <- na.omit(subset(df, select=c(grep("Q8_",colnames(df)))))
# specify model: latent variables =~ observed indicators
model <- '
exp_rej =~ Q8_1 + Q8_2 + Q8_3 + Q8_4 + Q8_5 + Q8_6
'
# fit CFA
fit <- cfa(model, data = d, std.lv = TRUE)
# summary with fit indices and standardized loadings
summary(fit, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 22 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 12
##
## Number of observations 184
##
## Model Test User Model:
##
## Test statistic 118.123
## Degrees of freedom 9
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 907.183
## Degrees of freedom 15
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.878
## Tucker-Lewis Index (TLI) 0.796
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1055.530
## Loglikelihood unrestricted model (H1) -996.468
##
## Akaike (AIC) 2135.059
## Bayesian (BIC) 2173.638
## Sample-size adjusted Bayesian (SABIC) 2135.631
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.257
## 90 Percent confidence interval - lower 0.217
## 90 Percent confidence interval - upper 0.299
## 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
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## exp_rej =~
## Q8_1 0.662 0.061 10.813 0.000 0.662 0.705
## Q8_2 0.549 0.050 11.068 0.000 0.549 0.717
## Q8_3 0.565 0.052 10.851 0.000 0.565 0.707
## Q8_4 0.902 0.054 16.658 0.000 0.902 0.935
## Q8_5 0.899 0.055 16.306 0.000 0.899 0.924
## Q8_6 0.810 0.060 13.474 0.000 0.810 0.822
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Q8_1 0.444 0.049 9.056 0.000 0.444 0.503
## .Q8_2 0.284 0.031 9.017 0.000 0.284 0.485
## .Q8_3 0.319 0.035 9.051 0.000 0.319 0.500
## .Q8_4 0.116 0.021 5.553 0.000 0.116 0.125
## .Q8_5 0.138 0.022 6.152 0.000 0.138 0.146
## .Q8_6 0.315 0.037 8.444 0.000 0.315 0.324
## exp_rej 1.000 1.000 1.000
# modindices(fit, sort. = T)
# basic path diagram
semPaths(
fit,
what = "std", # show standardized loadings
layout = "tree", # neat hierarchical layout
rotation = 2,
style = "lisrel", # clean style
residuals = FALSE, # hide residual arrows (optional)
intercepts = FALSE,
sizeMan = 6, # size of observed variables
sizeLat = 8, # size of latent variables
edge.label.cex = 0.9, # path label size
label.cex = 1.1, # node label size
nCharNodes = 0, # keep full variable names
mar = c(6, 6, 6, 6)
)
# specify model: latent variables =~ observed indicators
model <- '
act =~ Q8_1 + Q8_2 + Q8_3
look =~ Q8_4 + Q8_5 + Q8_6
Q8_2 ~~ Q8_3
'
# fit CFA
fit <- cfa(model, data = d, std.lv = TRUE)
# summary with fit indices and standardized loadings
summary(fit, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 34 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 14
##
## Number of observations 184
##
## Model Test User Model:
##
## Test statistic 6.205
## Degrees of freedom 7
## P-value (Chi-square) 0.516
##
## Model Test Baseline Model:
##
## Test statistic 907.183
## Degrees of freedom 15
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.002
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -999.571
## Loglikelihood unrestricted model (H1) -996.468
##
## Akaike (AIC) 2027.141
## Bayesian (BIC) 2072.151
## Sample-size adjusted Bayesian (SABIC) 2027.809
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.084
## P-value H_0: RMSEA <= 0.050 0.766
## P-value H_0: RMSEA >= 0.080 0.064
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.012
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## act =~
## Q8_1 0.702 0.064 10.980 0.000 0.702 0.747
## Q8_2 0.562 0.053 10.698 0.000 0.562 0.734
## Q8_3 0.568 0.055 10.248 0.000 0.568 0.711
## look =~
## Q8_4 0.909 0.054 16.845 0.000 0.909 0.943
## Q8_5 0.905 0.055 16.460 0.000 0.905 0.930
## Q8_6 0.811 0.060 13.489 0.000 0.811 0.823
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Q8_2 ~~
## .Q8_3 0.186 0.034 5.448 0.000 0.186 0.640
## act ~~
## look 0.930 0.036 26.177 0.000 0.930 0.930
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Q8_1 0.390 0.054 7.255 0.000 0.390 0.442
## .Q8_2 0.269 0.037 7.365 0.000 0.269 0.461
## .Q8_3 0.315 0.041 7.637 0.000 0.315 0.494
## .Q8_4 0.104 0.021 4.835 0.000 0.104 0.111
## .Q8_5 0.128 0.023 5.595 0.000 0.128 0.135
## .Q8_6 0.314 0.037 8.438 0.000 0.314 0.323
## act 1.000 1.000 1.000
## look 1.000 1.000 1.000
modindices(fit, sort. = T)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 21 look =~ Q8_2 2.677 -0.382 -0.382 -0.499 -0.499
## 23 Q8_1 ~~ Q8_2 2.677 0.039 0.039 0.120 0.120
## 24 Q8_1 ~~ Q8_3 2.677 -0.039 -0.039 -0.113 -0.113
## 22 look =~ Q8_3 2.677 0.386 0.386 0.483 0.483
## 25 Q8_1 ~~ Q8_4 2.380 0.037 0.037 0.186 0.186
## 27 Q8_1 ~~ Q8_6 1.347 -0.035 -0.035 -0.101 -0.101
## 17 act =~ Q8_4 1.021 0.233 0.233 0.242 0.242
## 36 Q8_5 ~~ Q8_6 1.021 0.027 0.027 0.137 0.137
## 28 Q8_2 ~~ Q8_4 0.772 -0.012 -0.012 -0.070 -0.070
## 35 Q8_4 ~~ Q8_6 0.633 -0.022 -0.022 -0.121 -0.121
## 18 act =~ Q8_5 0.633 -0.184 -0.184 -0.189 -0.189
## 26 Q8_1 ~~ Q8_5 0.534 -0.018 -0.018 -0.081 -0.081
## 31 Q8_3 ~~ Q8_4 0.378 0.009 0.009 0.048 0.048
## 30 Q8_2 ~~ Q8_6 0.240 0.009 0.009 0.030 0.030
## 19 act =~ Q8_6 0.072 -0.068 -0.068 -0.069 -0.069
## 34 Q8_4 ~~ Q8_5 0.072 -0.010 -0.010 -0.088 -0.088
## 29 Q8_2 ~~ Q8_5 0.044 -0.003 -0.003 -0.015 -0.015
## 33 Q8_3 ~~ Q8_6 0.015 0.002 0.002 0.008 0.008
## 32 Q8_3 ~~ Q8_5 0.010 0.001 0.001 0.007 0.007
# basic path diagram
semPaths(
fit,
what = "std", # show standardized loadings
layout = "tree", # neat hierarchical layout
rotation = 2,
style = "lisrel", # clean style
residuals = FALSE, # hide residual arrows (optional)
intercepts = FALSE,
sizeMan = 6, # size of observed variables
sizeLat = 8, # size of latent variables
edge.label.cex = 0.9, # path label size
label.cex = 1.1, # node label size
nCharNodes = 0, # keep full variable names
mar = c(6, 6, 6, 6)
)
This model fits very well but we have to drop _2 and _3 which are very interesting items. We’ll proceed without them, future work might look at breaking them out and expanding upon them to create their own factor, or perhaps using a different scale/measure that is a bit more robust/versatile.
# specify model: latent variables =~ observed indicators
model <- '
exp_rej =~ Q8_1 + Q8_4 + Q8_5 + Q8_6
'
# fit CFA
fit <- cfa(model, data = d, std.lv = TRUE)
# summary with fit indices and standardized loadings
summary(fit, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 22 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 8
##
## Number of observations 184
##
## Model Test User Model:
##
## Test statistic 2.491
## Degrees of freedom 2
## P-value (Chi-square) 0.288
##
## Model Test Baseline Model:
##
## Test statistic 567.985
## Degrees of freedom 6
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.999
## Tucker-Lewis Index (TLI) 0.997
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -735.843
## Loglikelihood unrestricted model (H1) -734.598
##
## Akaike (AIC) 1487.686
## Bayesian (BIC) 1513.406
## Sample-size adjusted Bayesian (SABIC) 1488.068
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.037
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.156
## P-value H_0: RMSEA <= 0.050 0.439
## P-value H_0: RMSEA >= 0.080 0.379
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.011
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## exp_rej =~
## Q8_1 0.653 0.062 10.594 0.000 0.653 0.695
## Q8_4 0.910 0.054 16.831 0.000 0.910 0.944
## Q8_5 0.905 0.055 16.393 0.000 0.905 0.930
## Q8_6 0.809 0.060 13.419 0.000 0.809 0.820
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Q8_1 0.457 0.050 9.071 0.000 0.457 0.517
## .Q8_4 0.101 0.023 4.409 0.000 0.101 0.109
## .Q8_5 0.128 0.024 5.292 0.000 0.128 0.135
## .Q8_6 0.318 0.038 8.411 0.000 0.318 0.327
## exp_rej 1.000 1.000 1.000
modindices(fit, sort. = T)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 15 Q8_5 ~~ Q8_6 2.398 0.051 0.051 0.250 0.250
## 10 Q8_1 ~~ Q8_4 2.398 0.041 0.041 0.191 0.191
## 13 Q8_4 ~~ Q8_5 1.008 -0.049 -0.049 -0.431 -0.431
## 12 Q8_1 ~~ Q8_6 1.008 -0.031 -0.031 -0.083 -0.083
## 14 Q8_4 ~~ Q8_6 0.647 -0.027 -0.027 -0.149 -0.149
## 11 Q8_1 ~~ Q8_5 0.647 -0.021 -0.021 -0.089 -0.089
# basic path diagram
semPaths(
fit,
what = "std", # show standardized loadings
layout = "tree", # neat hierarchical layout
rotation = 2,
style = "lisrel", # clean style
residuals = FALSE, # hide residual arrows (optional)
intercepts = FALSE,
sizeMan = 6, # size of observed variables
sizeLat = 8, # size of latent variables
edge.label.cex = 0.9, # path label size
label.cex = 1.1, # node label size
nCharNodes = 0, # keep full variable names
mar = c(6, 6, 6, 6)
)
Dropped some items with low factor loadings: Q30_3
Dropped Q30_11 and Q30_12 due to low factor loadings from potential language issues – communal may be unfamiliar term, use of idioms in 12
Moved Q30_5 from Breakdown to Disintegration from recommendations from MI
Dropped Q30_7 and Q30_9 – lower factor loadings, were correlated with other items
df$Q30_1 <- as.numeric(df$Q30_1)
df$Q30_2 <- as.numeric(df$Q30_2)
df$Q30_3 <- as.numeric(df$Q30_3)
df$Q30_4 <- as.numeric(df$Q30_4)
df$Q30_5 <- as.numeric(df$Q30_5)
df$Q30_6 <- as.numeric(df$Q30_6)
df$Q30_7 <- as.numeric(df$Q30_7)
df$Q30_8 <- as.numeric(df$Q30_8)
df$Q30_9 <- as.numeric(df$Q30_9)
df$Q30_10 <- as.numeric(df$Q30_10)
df$Q30_11 <- as.numeric(df$Q30_11)
df$Q30_12 <- as.numeric(df$Q30_12)
df$Q30_13 <- as.numeric(df$Q30_13)
df$Q30_14 <- as.numeric(df$Q30_14)
df$Q30_15 <- as.numeric(df$Q30_15)
d <- na.omit(subset(df, select=c(grep("Q30_",colnames(df)))))
# specify model: latent variables =~ observed indicators
model <- '
bd =~ Q30_1 + Q30_2 + Q30_4
dis =~ Q30_6 + Q30_8 + Q30_10 + Q30_13 + Q30_14 + Q30_15 + Q30_5
'
# fit CFA
fit <- cfa(model, data = d, std.lv = TRUE)
# summary with fit indices and standardized loadings
summary(fit, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 23 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 21
##
## Number of observations 184
##
## Model Test User Model:
##
## Test statistic 92.135
## Degrees of freedom 34
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 1093.481
## Degrees of freedom 45
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.945
## Tucker-Lewis Index (TLI) 0.927
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1958.648
## Loglikelihood unrestricted model (H1) -1912.580
##
## Akaike (AIC) 3959.295
## Bayesian (BIC) 4026.809
## Sample-size adjusted Bayesian (SABIC) 3960.297
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.096
## 90 Percent confidence interval - lower 0.073
## 90 Percent confidence interval - upper 0.120
## P-value H_0: RMSEA <= 0.050 0.001
## P-value H_0: RMSEA >= 0.080 0.881
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.050
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## bd =~
## Q30_1 0.642 0.062 10.324 0.000 0.642 0.704
## Q30_2 0.795 0.060 13.249 0.000 0.795 0.844
## Q30_4 0.754 0.065 11.588 0.000 0.754 0.767
## dis =~
## Q30_6 0.691 0.059 11.742 0.000 0.691 0.755
## Q30_8 0.579 0.052 11.122 0.000 0.579 0.727
## Q30_10 0.645 0.063 10.156 0.000 0.645 0.680
## Q30_13 0.697 0.058 12.106 0.000 0.697 0.772
## Q30_14 0.809 0.059 13.669 0.000 0.809 0.837
## Q30_15 0.716 0.059 12.148 0.000 0.716 0.774
## Q30_5 0.693 0.060 11.535 0.000 0.693 0.746
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## bd ~~
## dis 0.829 0.036 22.786 0.000 0.829 0.829
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Q30_1 0.419 0.052 8.097 0.000 0.419 0.504
## .Q30_2 0.254 0.044 5.733 0.000 0.254 0.287
## .Q30_4 0.398 0.054 7.377 0.000 0.398 0.412
## .Q30_6 0.359 0.043 8.440 0.000 0.359 0.429
## .Q30_8 0.300 0.035 8.623 0.000 0.300 0.472
## .Q30_10 0.484 0.055 8.851 0.000 0.484 0.538
## .Q30_13 0.330 0.040 8.315 0.000 0.330 0.404
## .Q30_14 0.281 0.037 7.564 0.000 0.281 0.300
## .Q30_15 0.344 0.041 8.300 0.000 0.344 0.402
## .Q30_5 0.383 0.045 8.505 0.000 0.383 0.443
## bd 1.000 1.000 1.000
## dis 1.000 1.000 1.000
modindices(fit, sort. = T)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 34 Q30_1 ~~ Q30_2 19.735 0.190 0.190 0.582 0.582
## 33 dis =~ Q30_4 19.735 0.745 0.745 0.758 0.758
## 27 bd =~ Q30_13 11.021 0.383 0.383 0.424 0.424
## 68 Q30_8 ~~ Q30_5 10.540 0.093 0.093 0.274 0.274
## 64 Q30_8 ~~ Q30_10 8.954 0.094 0.094 0.246 0.246
## 32 dis =~ Q30_2 7.310 -0.495 -0.495 -0.526 -0.526
## 35 Q30_1 ~~ Q30_4 7.310 -0.114 -0.114 -0.278 -0.278
## 78 Q30_15 ~~ Q30_5 6.481 -0.080 -0.080 -0.221 -0.221
## 42 Q30_1 ~~ Q30_5 5.648 0.080 0.080 0.200 0.200
## 66 Q30_8 ~~ Q30_14 5.353 -0.062 -0.062 -0.212 -0.212
## 54 Q30_4 ~~ Q30_13 4.932 0.071 0.071 0.196 0.196
## 76 Q30_14 ~~ Q30_15 4.722 0.064 0.064 0.207 0.207
## 30 bd =~ Q30_5 4.385 0.256 0.256 0.275 0.275
## 53 Q30_4 ~~ Q30_10 4.346 -0.078 -0.078 -0.178 -0.178
## 26 bd =~ Q30_10 3.949 -0.265 -0.265 -0.280 -0.280
## 36 Q30_1 ~~ Q30_6 3.947 -0.065 -0.065 -0.168 -0.168
## 43 Q30_2 ~~ Q30_4 3.471 -0.095 -0.095 -0.299 -0.299
## 31 dis =~ Q30_1 3.470 -0.271 -0.271 -0.297 -0.297
## 69 Q30_10 ~~ Q30_13 3.449 -0.062 -0.062 -0.156 -0.156
## 40 Q30_1 ~~ Q30_14 2.618 -0.049 -0.049 -0.144 -0.144
## 25 bd =~ Q30_8 2.555 -0.171 -0.171 -0.215 -0.215
## 57 Q30_4 ~~ Q30_5 2.377 0.053 0.053 0.135 0.135
## 49 Q30_2 ~~ Q30_15 2.238 -0.043 -0.043 -0.146 -0.146
## 61 Q30_6 ~~ Q30_14 2.044 0.043 0.043 0.134 0.134
## 63 Q30_6 ~~ Q30_5 2.024 -0.045 -0.045 -0.122 -0.122
## 75 Q30_13 ~~ Q30_5 2.023 -0.044 -0.044 -0.123 -0.123
## 29 bd =~ Q30_15 1.910 -0.163 -0.163 -0.176 -0.176
## 47 Q30_2 ~~ Q30_13 1.784 0.038 0.038 0.131 0.131
## 41 Q30_1 ~~ Q30_15 1.287 -0.037 -0.037 -0.096 -0.096
## 56 Q30_4 ~~ Q30_15 1.287 0.037 0.037 0.100 0.100
## 52 Q30_4 ~~ Q30_8 1.252 -0.034 -0.034 -0.097 -0.097
## 45 Q30_2 ~~ Q30_8 0.975 -0.026 -0.026 -0.095 -0.095
## 51 Q30_4 ~~ Q30_6 0.955 0.032 0.032 0.086 0.086
## 74 Q30_13 ~~ Q30_15 0.952 0.029 0.029 0.086 0.086
## 50 Q30_2 ~~ Q30_5 0.869 -0.028 -0.028 -0.090 -0.090
## 73 Q30_13 ~~ Q30_14 0.788 -0.026 -0.026 -0.084 -0.084
## 28 bd =~ Q30_14 0.573 -0.087 -0.087 -0.090 -0.090
## 55 Q30_4 ~~ Q30_14 0.441 0.021 0.021 0.062 0.062
## 72 Q30_10 ~~ Q30_5 0.418 0.023 0.023 0.054 0.054
## 44 Q30_2 ~~ Q30_6 0.396 0.018 0.018 0.061 0.061
## 46 Q30_2 ~~ Q30_10 0.349 -0.020 -0.020 -0.056 -0.056
## 38 Q30_1 ~~ Q30_10 0.235 0.018 0.018 0.040 0.040
## 37 Q30_1 ~~ Q30_8 0.215 0.014 0.014 0.039 0.039
## 67 Q30_8 ~~ Q30_15 0.187 -0.012 -0.012 -0.037 -0.037
## 58 Q30_6 ~~ Q30_8 0.183 -0.012 -0.012 -0.036 -0.036
## 71 Q30_10 ~~ Q30_15 0.180 0.015 0.015 0.036 0.036
## 65 Q30_8 ~~ Q30_13 0.108 -0.009 -0.009 -0.028 -0.028
## 59 Q30_6 ~~ Q30_10 0.075 -0.010 -0.010 -0.023 -0.023
## 70 Q30_10 ~~ Q30_14 0.075 0.009 0.009 0.024 0.024
## 62 Q30_6 ~~ Q30_15 0.071 0.008 0.008 0.023 0.023
## 48 Q30_2 ~~ Q30_14 0.013 -0.003 -0.003 -0.012 -0.012
## 39 Q30_1 ~~ Q30_13 0.013 0.004 0.004 0.010 0.010
## 77 Q30_14 ~~ Q30_5 0.006 -0.002 -0.002 -0.007 -0.007
## 60 Q30_6 ~~ Q30_13 0.000 0.000 0.000 -0.001 -0.001
## 24 bd =~ Q30_6 0.000 0.001 0.001 0.002 0.002
# basic path diagram
semPaths(
fit,
what = "std", # show standardized loadings
layout = "tree", # neat hierarchical layout
rotation = 2,
style = "lisrel", # clean style
residuals = FALSE, # hide residual arrows (optional)
intercepts = FALSE,
sizeMan = 6, # size of observed variables
sizeLat = 8, # size of latent variables
edge.label.cex = 0.9, # path label size
label.cex = 1.1, # node label size
nCharNodes = 0, # keep full variable names
mar = c(6, 6, 6, 6)
)