library(mosaic)
library(ggplot2)
library(dplyr)
library(psych)
#install.packages("lavaan")
library(lavaan)
#install.packages("semPlot")
library(semPlot)
Now, instead of taking a shot in the dark about the factor structure, we are going in with a clear idea about which items we things load on which factors. Our goal is to test how well our model of the factor structure actually fits the data.
First we specify the model.
bf_model <- ' agreeable =~ A1 + A2 + A3 + A4 + A5
conscient =~ C1 + C2 + C3 + C4 + C5
extrov =~ E1 + E2 + E3 + E4 + E5
neurot =~ N1 + N2 + N3 + N4 + N5
openness =~ O1 + O2 + O3 + O4 + O5 '
Plot the model to make sure it is what you want. Here we are using the semPaths()
and semPlotModel()
from the semPlot
package. The rotation = 2
option forces the exogenous variables to be on the left side.
semPaths(semPlotModel(bf_model), rotation = 2)
Then fit the CFA model with cfa()
and ask for the relevant output.
bf_fit <- cfa(bf_model, data = bfi)
summary(bf_fit, fit.measures = TRUE, rsq=TRUE)
## lavaan (0.5-23.1097) converged normally after 55 iterations
##
## Used Total
## Number of observations 2436 2800
##
## Estimator ML
## Minimum Function Test Statistic 4165.467
## Degrees of freedom 265
## P-value (Chi-square) 0.000
##
## Model test baseline model:
##
## Minimum Function Test Statistic 18222.116
## Degrees of freedom 300
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.782
## Tucker-Lewis Index (TLI) 0.754
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -99840.238
## Loglikelihood unrestricted model (H1) -97757.504
##
## Number of free parameters 60
## Akaike (AIC) 199800.476
## Bayesian (BIC) 200148.363
## Sample-size adjusted Bayesian (BIC) 199957.729
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.078
## 90 Percent Confidence Interval 0.076 0.080
## P-value RMSEA <= 0.05 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.075
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|)
## agreeable =~
## A1 1.000
## A2 -1.579 0.108 -14.650 0.000
## A3 -2.030 0.134 -15.093 0.000
## A4 -1.564 0.115 -13.616 0.000
## A5 -1.804 0.121 -14.852 0.000
## conscient =~
## C1 1.000
## C2 1.148 0.057 20.152 0.000
## C3 1.036 0.054 19.172 0.000
## C4 -1.421 0.065 -21.924 0.000
## C5 -1.489 0.072 -20.694 0.000
## extrov =~
## E1 1.000
## E2 1.226 0.051 23.899 0.000
## E3 -0.921 0.041 -22.431 0.000
## E4 -1.121 0.047 -23.977 0.000
## E5 -0.808 0.039 -20.648 0.000
## neurot =~
## N1 1.000
## N2 0.947 0.024 39.899 0.000
## N3 0.884 0.025 35.919 0.000
## N4 0.692 0.025 27.753 0.000
## N5 0.628 0.026 24.027 0.000
## openness =~
## O1 1.000
## O2 -1.020 0.068 -14.962 0.000
## O3 1.373 0.072 18.942 0.000
## O4 0.437 0.048 9.160 0.000
## O5 -0.960 0.060 -16.056 0.000
##
## Covariances:
## Estimate Std.Err z-value P(>|z|)
## agreeable ~~
## conscient -0.110 0.012 -9.254 0.000
## extrov 0.304 0.025 12.293 0.000
## neurot 0.141 0.018 7.712 0.000
## openness -0.093 0.011 -8.446 0.000
## conscient ~~
## extrov -0.224 0.020 -11.121 0.000
## neurot -0.250 0.025 -10.117 0.000
## openness 0.130 0.014 9.190 0.000
## extrov ~~
## neurot 0.292 0.032 9.131 0.000
## openness -0.265 0.021 -12.347 0.000
## neurot ~~
## openness -0.093 0.022 -4.138 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|)
## .A1 1.745 0.052 33.725 0.000
## .A2 0.807 0.028 28.396 0.000
## .A3 0.754 0.032 23.339 0.000
## .A4 1.632 0.051 31.796 0.000
## .A5 0.852 0.032 26.800 0.000
## .C1 1.063 0.035 30.073 0.000
## .C2 1.130 0.039 28.890 0.000
## .C3 1.170 0.039 30.194 0.000
## .C4 0.960 0.040 24.016 0.000
## .C5 1.640 0.059 27.907 0.000
## .E1 1.814 0.058 31.047 0.000
## .E2 1.332 0.049 26.928 0.000
## .E3 1.108 0.038 29.522 0.000
## .E4 1.088 0.041 26.732 0.000
## .E5 1.251 0.040 31.258 0.000
## .N1 0.793 0.037 21.575 0.000
## .N2 0.836 0.036 23.458 0.000
## .N3 1.222 0.043 28.271 0.000
## .N4 1.654 0.052 31.977 0.000
## .N5 1.969 0.060 32.889 0.000
## .O1 0.865 0.032 27.216 0.000
## .O2 1.990 0.063 31.618 0.000
## .O3 0.691 0.039 17.717 0.000
## .O4 1.346 0.040 34.036 0.000
## .O5 1.380 0.045 30.662 0.000
## agreeable 0.234 0.030 7.839 0.000
## conscient 0.463 0.036 12.810 0.000
## extrov 0.846 0.062 13.693 0.000
## neurot 1.689 0.073 23.034 0.000
## openness 0.404 0.033 12.156 0.000
##
## R-Square:
## Estimate
## A1 0.118
## A2 0.420
## A3 0.562
## A4 0.260
## A5 0.472
## C1 0.303
## C2 0.350
## C3 0.298
## C4 0.493
## C5 0.385
## E1 0.318
## E2 0.488
## E3 0.393
## E4 0.494
## E5 0.306
## N1 0.680
## N2 0.644
## N3 0.519
## N4 0.328
## N5 0.253
## O1 0.318
## O2 0.174
## O3 0.524
## O4 0.054
## O5 0.212
inspect(bf_fit, what = "std") #for standardized estimates
## $lambda
## agrebl cnscnt extrov neurot opnnss
## A1 0.344 0.000 0.000 0.000 0.000
## A2 -0.648 0.000 0.000 0.000 0.000
## A3 -0.749 0.000 0.000 0.000 0.000
## A4 -0.510 0.000 0.000 0.000 0.000
## A5 -0.687 0.000 0.000 0.000 0.000
## C1 0.000 0.551 0.000 0.000 0.000
## C2 0.000 0.592 0.000 0.000 0.000
## C3 0.000 0.546 0.000 0.000 0.000
## C4 0.000 -0.702 0.000 0.000 0.000
## C5 0.000 -0.620 0.000 0.000 0.000
## E1 0.000 0.000 0.564 0.000 0.000
## E2 0.000 0.000 0.699 0.000 0.000
## E3 0.000 0.000 -0.627 0.000 0.000
## E4 0.000 0.000 -0.703 0.000 0.000
## E5 0.000 0.000 -0.553 0.000 0.000
## N1 0.000 0.000 0.000 0.825 0.000
## N2 0.000 0.000 0.000 0.803 0.000
## N3 0.000 0.000 0.000 0.721 0.000
## N4 0.000 0.000 0.000 0.573 0.000
## N5 0.000 0.000 0.000 0.503 0.000
## O1 0.000 0.000 0.000 0.000 0.564
## O2 0.000 0.000 0.000 0.000 -0.418
## O3 0.000 0.000 0.000 0.000 0.724
## O4 0.000 0.000 0.000 0.000 0.233
## O5 0.000 0.000 0.000 0.000 -0.461
##
## $theta
## A1 A2 A3 A4 A5 C1 C2 C3 C4 C5 E1 E2
## A1 0.882
## A2 0.000 0.580
## A3 0.000 0.000 0.438
## A4 0.000 0.000 0.000 0.740
## A5 0.000 0.000 0.000 0.000 0.528
## C1 0.000 0.000 0.000 0.000 0.000 0.697
## C2 0.000 0.000 0.000 0.000 0.000 0.000 0.650
## C3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.702
## C4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.507
## C5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.615
## E1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.682
## E2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.512
## E3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E3 E4 E5 N1 N2 N3 N4 N5 O1 O2 O3 O4
## A1
## A2
## A3
## A4
## A5
## C1
## C2
## C3
## C4
## C5
## E1
## E2
## E3 0.607
## E4 0.000 0.506
## E5 0.000 0.000 0.694
## N1 0.000 0.000 0.000 0.320
## N2 0.000 0.000 0.000 0.000 0.356
## N3 0.000 0.000 0.000 0.000 0.000 0.481
## N4 0.000 0.000 0.000 0.000 0.000 0.000 0.672
## N5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.747
## O1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.682
## O2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.826
## O3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.476
## O4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.946
## O5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O5
## A1
## A2
## A3
## A4
## A5
## C1
## C2
## C3
## C4
## C5
## E1
## E2
## E3
## E4
## E5
## N1
## N2
## N3
## N4
## N5
## O1
## O2
## O3
## O4
## O5 0.788
##
## $psi
## agrebl cnscnt extrov neurot opnnss
## agreeable 1.000
## conscient -0.334 1.000
## extrov 0.683 -0.357 1.000
## neurot 0.223 -0.283 0.244 1.000
## openness -0.303 0.301 -0.453 -0.112 1.000
Because our model is not a great fit to our data, we might want to ask for the modification indicies with the modindices()
function. lavaan
will give you a set of changes you can make that will increase the fit on the model. The mi
value is the amount a reduction in the chi-square statistics that each change would bring—so the higher the better because a reduction in chi-square means and increase in fit!
modindices(bf_fit) %>%
arrange(desc(mi)) %>%
select(lhs, op, rhs, mi) %>%
head(10)
## lhs op rhs mi
## 1 N1 ~~ N2 418.8124
## 2 extrov =~ N4 200.7898
## 3 openness =~ E3 153.7152
## 4 N3 ~~ N4 134.1036
## 5 openness =~ E4 122.5581
## 6 conscient =~ E5 121.4990
## 7 extrov =~ O3 114.2021
## 8 extrov =~ O4 113.8627
## 9 neurot =~ C5 108.7538
## 10 extrov =~ A5 108.5874
Maybe we want to add error covariances based on modification indices. I recommend only doing this if it makes theoretical sense. Also, what ever theoretical rule you use to justify making these error correlations, if it applies to other sets of items, then add the correlations there too. Be consistent! If you just make changes based on the modification indicies without thinking carefully about the theory behind them, then you are doing exploratory factor analysis.
bf_model_re1 <- ' agreeable =~ A1 + A2 + A3 + A4 + A5
conscient =~ C1 + C2 + C3 + C4 + C5
extrov =~ E1 + E2 + E3 + E4 + E5
neurot =~ N1 + N2 + N3 + N4 + N5
openness =~ O1 + O2 + O3 + O4 + O5
N1 ~~ N2
N3 ~~ N4'
How would you ask for a diagram of this model?
#diagram here.
bf_fit_re1 <- cfa(bf_model_re1, data = bfi)
summary(bf_fit_re1, fit.measures = TRUE, rsq=TRUE)
## lavaan (0.5-23.1097) converged normally after 57 iterations
##
## Used Total
## Number of observations 2436 2800
##
## Estimator ML
## Minimum Function Test Statistic 3808.150
## Degrees of freedom 263
## P-value (Chi-square) 0.000
##
## Model test baseline model:
##
## Minimum Function Test Statistic 18222.116
## Degrees of freedom 300
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.802
## Tucker-Lewis Index (TLI) 0.774
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -99661.580
## Loglikelihood unrestricted model (H1) -97757.504
##
## Number of free parameters 62
## Akaike (AIC) 199447.159
## Bayesian (BIC) 199806.642
## Sample-size adjusted Bayesian (BIC) 199609.654
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.074
## 90 Percent Confidence Interval 0.072 0.076
## P-value RMSEA <= 0.05 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.073
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|)
## agreeable =~
## A1 1.000
## A2 -1.591 0.109 -14.606 0.000
## A3 -2.046 0.136 -15.039 0.000
## A4 -1.569 0.116 -13.566 0.000
## A5 -1.801 0.122 -14.774 0.000
## conscient =~
## C1 1.000
## C2 1.147 0.057 19.964 0.000
## C3 1.042 0.055 19.069 0.000
## C4 -1.441 0.066 -21.863 0.000
## C5 -1.512 0.073 -20.685 0.000
## extrov =~
## E1 1.000
## E2 1.234 0.051 24.092 0.000
## E3 -0.911 0.041 -22.370 0.000
## E4 -1.120 0.047 -24.074 0.000
## E5 -0.805 0.039 -20.678 0.000
## neurot =~
## N1 1.000
## N2 0.937 0.025 37.799 0.000
## N3 1.261 0.053 23.708 0.000
## N4 1.071 0.049 21.667 0.000
## N5 0.861 0.038 22.879 0.000
## openness =~
## O1 1.000
## O2 -1.016 0.068 -14.911 0.000
## O3 1.377 0.073 18.930 0.000
## O4 0.442 0.048 9.251 0.000
## O5 -0.958 0.060 -16.032 0.000
##
## Covariances:
## Estimate Std.Err z-value P(>|z|)
## .N1 ~~
## .N2 0.735 0.046 15.889 0.000
## .N3 ~~
## .N4 -0.134 0.052 -2.565 0.010
## agreeable ~~
## conscient -0.108 0.012 -9.225 0.000
## extrov 0.302 0.025 12.257 0.000
## neurot 0.102 0.015 6.975 0.000
## openness -0.093 0.011 -8.437 0.000
## conscient ~~
## extrov -0.222 0.020 -11.116 0.000
## neurot -0.220 0.021 -10.395 0.000
## openness 0.128 0.014 9.138 0.000
## extrov ~~
## neurot 0.298 0.028 10.596 0.000
## openness -0.264 0.021 -12.318 0.000
## neurot ~~
## openness -0.072 0.018 -3.964 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|)
## .A1 1.747 0.052 33.734 0.000
## .A2 0.802 0.028 28.294 0.000
## .A3 0.746 0.032 23.110 0.000
## .A4 1.632 0.051 31.798 0.000
## .A5 0.860 0.032 26.959 0.000
## .C1 1.070 0.035 30.215 0.000
## .C2 1.141 0.039 29.091 0.000
## .C3 1.172 0.039 30.258 0.000
## .C4 0.950 0.040 23.849 0.000
## .C5 1.624 0.058 27.777 0.000
## .E1 1.812 0.058 31.087 0.000
## .E2 1.311 0.049 26.774 0.000
## .E3 1.122 0.038 29.759 0.000
## .E4 1.086 0.040 26.820 0.000
## .E5 1.254 0.040 31.329 0.000
## .N1 1.415 0.055 25.794 0.000
## .N2 1.413 0.052 26.915 0.000
## .N3 0.843 0.065 12.874 0.000
## .N4 1.237 0.063 19.494 0.000
## .N5 1.843 0.060 30.884 0.000
## .O1 0.866 0.032 27.241 0.000
## .O2 1.994 0.063 31.661 0.000
## .O3 0.688 0.039 17.600 0.000
## .O4 1.344 0.040 34.018 0.000
## .O5 1.382 0.045 30.693 0.000
## agreeable 0.232 0.030 7.804 0.000
## conscient 0.455 0.036 12.704 0.000
## extrov 0.849 0.062 13.733 0.000
## neurot 1.068 0.069 15.442 0.000
## openness 0.403 0.033 12.144 0.000
##
## R-Square:
## Estimate
## A1 0.117
## A2 0.423
## A3 0.566
## A4 0.260
## A5 0.467
## C1 0.298
## C2 0.344
## C3 0.297
## C4 0.499
## C5 0.390
## E1 0.319
## E2 0.497
## E3 0.386
## E4 0.495
## E5 0.305
## N1 0.430
## N2 0.399
## N3 0.668
## N4 0.498
## N5 0.301
## O1 0.318
## O2 0.173
## O3 0.526
## O4 0.055
## O5 0.211
inspect(bf_fit_re1, what = "std")
## $lambda
## agrebl cnscnt extrov neurot opnnss
## A1 0.343 0.000 0.000 0.000 0.000
## A2 -0.650 0.000 0.000 0.000 0.000
## A3 -0.752 0.000 0.000 0.000 0.000
## A4 -0.510 0.000 0.000 0.000 0.000
## A5 -0.683 0.000 0.000 0.000 0.000
## C1 0.000 0.546 0.000 0.000 0.000
## C2 0.000 0.587 0.000 0.000 0.000
## C3 0.000 0.545 0.000 0.000 0.000
## C4 0.000 -0.706 0.000 0.000 0.000
## C5 0.000 -0.625 0.000 0.000 0.000
## E1 0.000 0.000 0.565 0.000 0.000
## E2 0.000 0.000 0.705 0.000 0.000
## E3 0.000 0.000 -0.621 0.000 0.000
## E4 0.000 0.000 -0.704 0.000 0.000
## E5 0.000 0.000 -0.552 0.000 0.000
## N1 0.000 0.000 0.000 0.656 0.000
## N2 0.000 0.000 0.000 0.631 0.000
## N3 0.000 0.000 0.000 0.818 0.000
## N4 0.000 0.000 0.000 0.705 0.000
## N5 0.000 0.000 0.000 0.548 0.000
## O1 0.000 0.000 0.000 0.000 0.564
## O2 0.000 0.000 0.000 0.000 -0.416
## O3 0.000 0.000 0.000 0.000 0.725
## O4 0.000 0.000 0.000 0.000 0.235
## O5 0.000 0.000 0.000 0.000 -0.460
##
## $theta
## A1 A2 A3 A4 A5 C1 C2 C3 C4 C5
## A1 0.883
## A2 0.000 0.577
## A3 0.000 0.000 0.434
## A4 0.000 0.000 0.000 0.740
## A5 0.000 0.000 0.000 0.000 0.533
## C1 0.000 0.000 0.000 0.000 0.000 0.702
## C2 0.000 0.000 0.000 0.000 0.000 0.000 0.656
## C3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.703
## C4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.501
## C5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.610
## E1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E1 E2 E3 E4 E5 N1 N2 N3 N4 N5
## A1
## A2
## A3
## A4
## A5
## C1
## C2
## C3
## C4
## C5
## E1 0.681
## E2 0.000 0.503
## E3 0.000 0.000 0.614
## E4 0.000 0.000 0.000 0.505
## E5 0.000 0.000 0.000 0.000 0.695
## N1 0.000 0.000 0.000 0.000 0.000 0.570
## N2 0.000 0.000 0.000 0.000 0.000 0.520 0.601
## N3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.332
## N4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.131 0.502
## N5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.699
## O1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O1 O2 O3 O4 O5
## A1
## A2
## A3
## A4
## A5
## C1
## C2
## C3
## C4
## C5
## E1
## E2
## E3
## E4
## E5
## N1
## N2
## N3
## N4
## N5
## O1 0.682
## O2 0.000 0.827
## O3 0.000 0.000 0.474
## O4 0.000 0.000 0.000 0.945
## O5 0.000 0.000 0.000 0.000 0.789
##
## $psi
## agrebl cnscnt extrov neurot opnnss
## agreeable 1.000
## conscient -0.333 1.000
## extrov 0.680 -0.358 1.000
## neurot 0.204 -0.315 0.313 1.000
## openness -0.304 0.299 -0.451 -0.110 1.000
modindices(bf_fit_re1) %>%
arrange(desc(mi)) %>%
select(lhs, op, rhs, mi) %>%
head(10)
## lhs op rhs mi
## 1 openness =~ E3 160.1243
## 2 extrov =~ N4 157.7845
## 3 neurot =~ O4 146.2368
## 4 neurot =~ C5 135.1787
## 5 neurot =~ C2 131.4783
## 6 conscient =~ E5 124.7340
## 7 extrov =~ O4 123.9378
## 8 openness =~ E4 119.2854
## 9 extrov =~ A5 117.0221
## 10 C1 ~~ C2 113.4368
We might also want to remove A1 – “Am indifferent to the feelings of others,” and O4 – “Spend time reflecting on things,” based on crappy loadings.
bf_model_re2 <- ' agreeable =~ A2 + A3 + A4 + A5
conscient =~ C1 + C2 + C3 + C4 + C5
extrov =~ E1 + E2 + E3 + E4 + E5
neurot =~ N1 + N2 + N3 + N4 + N5
openness =~ O1 + O2 + O3 + O5
N1 ~~ N2
N3 ~~ N4'
bf_fit_re2 <- cfa(bf_model_re2, data = bfi)
summary(bf_fit_re2, fit.measures = TRUE, rsq=TRUE)
## lavaan (0.5-23.1097) converged normally after 51 iterations
##
## Used Total
## Number of observations 2454 2800
##
## Estimator ML
## Minimum Function Test Statistic 3145.804
## Degrees of freedom 218
## P-value (Chi-square) 0.000
##
## Model test baseline model:
##
## Minimum Function Test Statistic 17305.746
## Degrees of freedom 253
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.828
## Tucker-Lewis Index (TLI) 0.801
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -92351.755
## Loglikelihood unrestricted model (H1) -90778.853
##
## Number of free parameters 58
## Akaike (AIC) 184819.510
## Bayesian (BIC) 185156.227
## Sample-size adjusted Bayesian (BIC) 184971.947
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.074
## 90 Percent Confidence Interval 0.072 0.076
## P-value RMSEA <= 0.05 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.068
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|)
## agreeable =~
## A2 1.000
## A3 1.317 0.050 26.458 0.000
## A4 1.023 0.050 20.395 0.000
## A5 1.195 0.047 25.593 0.000
## conscient =~
## C1 1.000
## C2 1.149 0.057 20.078 0.000
## C3 1.045 0.054 19.183 0.000
## C4 -1.435 0.065 -21.951 0.000
## C5 -1.506 0.073 -20.751 0.000
## extrov =~
## E1 1.000
## E2 1.239 0.051 24.081 0.000
## E3 -0.924 0.041 -22.528 0.000
## E4 -1.130 0.047 -24.134 0.000
## E5 -0.815 0.039 -20.764 0.000
## neurot =~
## N1 1.000
## N2 0.944 0.025 37.718 0.000
## N3 1.265 0.053 23.692 0.000
## N4 1.068 0.049 21.602 0.000
## N5 0.865 0.038 22.888 0.000
## openness =~
## O1 1.000
## O2 -1.027 0.069 -14.809 0.000
## O3 1.389 0.075 18.478 0.000
## O5 -0.940 0.060 -15.592 0.000
##
## Covariances:
## Estimate Std.Err z-value P(>|z|)
## .N1 ~~
## .N2 0.730 0.046 15.799 0.000
## .N3 ~~
## .N4 -0.121 0.052 -2.333 0.020
## agreeable ~~
## conscient 0.171 0.016 10.921 0.000
## extrov -0.475 0.028 -16.868 0.000
## neurot -0.158 0.021 -7.639 0.000
## openness 0.144 0.015 9.584 0.000
## conscient ~~
## extrov -0.218 0.020 -11.040 0.000
## neurot -0.216 0.021 -10.317 0.000
## openness 0.132 0.014 9.315 0.000
## extrov ~~
## neurot 0.296 0.028 10.644 0.000
## openness -0.278 0.022 -12.706 0.000
## neurot ~~
## openness -0.090 0.018 -4.933 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|)
## .A2 0.844 0.029 28.941 0.000
## .A3 0.767 0.033 23.287 0.000
## .A4 1.631 0.051 31.781 0.000
## .A5 0.831 0.032 26.084 0.000
## .C1 1.069 0.035 30.303 0.000
## .C2 1.139 0.039 29.150 0.000
## .C3 1.172 0.039 30.328 0.000
## .C4 0.950 0.040 23.977 0.000
## .C5 1.629 0.058 27.923 0.000
## .E1 1.816 0.058 31.341 0.000
## .E2 1.321 0.049 27.153 0.000
## .E3 1.106 0.037 29.828 0.000
## .E4 1.082 0.040 27.022 0.000
## .E5 1.254 0.040 31.486 0.000
## .N1 1.425 0.055 25.951 0.000
## .N2 1.407 0.052 26.838 0.000
## .N3 0.850 0.065 13.012 0.000
## .N4 1.251 0.063 19.798 0.000
## .N5 1.836 0.059 30.931 0.000
## .O1 0.876 0.032 27.275 0.000
## .O2 1.995 0.063 31.654 0.000
## .O3 0.698 0.040 17.329 0.000
## .O5 1.400 0.045 30.962 0.000
## agreeable 0.547 0.036 15.372 0.000
## conscient 0.456 0.036 12.768 0.000
## extrov 0.836 0.061 13.715 0.000
## neurot 1.061 0.069 15.411 0.000
## openness 0.396 0.033 11.949 0.000
##
## R-Square:
## Estimate
## A2 0.393
## A3 0.553
## A4 0.260
## A5 0.485
## C1 0.299
## C2 0.346
## C3 0.298
## C4 0.497
## C5 0.389
## E1 0.315
## E2 0.493
## E3 0.392
## E4 0.497
## E5 0.307
## N1 0.427
## N2 0.402
## N3 0.666
## N4 0.492
## N5 0.302
## O1 0.311
## O2 0.173
## O3 0.523
## O5 0.200
inspect(bf_fit_re2, what = "std")
## $lambda
## agrebl cnscnt extrov neurot opnnss
## A2 0.627 0.000 0.000 0.000 0.000
## A3 0.744 0.000 0.000 0.000 0.000
## A4 0.510 0.000 0.000 0.000 0.000
## A5 0.696 0.000 0.000 0.000 0.000
## C1 0.000 0.547 0.000 0.000 0.000
## C2 0.000 0.588 0.000 0.000 0.000
## C3 0.000 0.546 0.000 0.000 0.000
## C4 0.000 -0.705 0.000 0.000 0.000
## C5 0.000 -0.623 0.000 0.000 0.000
## E1 0.000 0.000 0.561 0.000 0.000
## E2 0.000 0.000 0.702 0.000 0.000
## E3 0.000 0.000 -0.626 0.000 0.000
## E4 0.000 0.000 -0.705 0.000 0.000
## E5 0.000 0.000 -0.554 0.000 0.000
## N1 0.000 0.000 0.000 0.653 0.000
## N2 0.000 0.000 0.000 0.634 0.000
## N3 0.000 0.000 0.000 0.816 0.000
## N4 0.000 0.000 0.000 0.701 0.000
## N5 0.000 0.000 0.000 0.550 0.000
## O1 0.000 0.000 0.000 0.000 0.558
## O2 0.000 0.000 0.000 0.000 -0.416
## O3 0.000 0.000 0.000 0.000 0.723
## O5 0.000 0.000 0.000 0.000 -0.447
##
## $theta
## A2 A3 A4 A5 C1 C2 C3 C4 C5 E1
## A2 0.607
## A3 0.000 0.447
## A4 0.000 0.000 0.740
## A5 0.000 0.000 0.000 0.515
## C1 0.000 0.000 0.000 0.000 0.701
## C2 0.000 0.000 0.000 0.000 0.000 0.654
## C3 0.000 0.000 0.000 0.000 0.000 0.000 0.702
## C4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.503
## C5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.611
## E1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.685
## E2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N4 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## N5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## E2 E3 E4 E5 N1 N2 N3 N4 N5 O1
## A2
## A3
## A4
## A5
## C1
## C2
## C3
## C4
## C5
## E1
## E2 0.507
## E3 0.000 0.608
## E4 0.000 0.000 0.503
## E5 0.000 0.000 0.000 0.693
## N1 0.000 0.000 0.000 0.000 0.573
## N2 0.000 0.000 0.000 0.000 0.515 0.598
## N3 0.000 0.000 0.000 0.000 0.000 0.000 0.334
## N4 0.000 0.000 0.000 0.000 0.000 0.000 -0.118 0.508
## N5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.698
## O1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.689
## O2 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## O2 O3 O5
## A2
## A3
## A4
## A5
## C1
## C2
## C3
## C4
## C5
## E1
## E2
## E3
## E4
## E5
## N1
## N2
## N3
## N4
## N5
## O1
## O2 0.827
## O3 0.000 0.477
## O5 0.000 0.000 0.800
##
## $psi
## agrebl cnscnt extrov neurot opnnss
## agreeable 1.000
## conscient 0.343 1.000
## extrov -0.702 -0.352 1.000
## neurot -0.208 -0.311 0.314 1.000
## openness 0.310 0.309 -0.483 -0.139 1.000
It is still not a great fit to the data, but I don’t think I’d want to make any of these modifications.
modindices(bf_fit_re2) %>%
arrange(desc(mi)) %>%
select(lhs, op, rhs, mi) %>%
head(10)
## lhs op rhs mi
## 1 extrov =~ N4 160.70218
## 2 openness =~ E3 140.06928
## 3 neurot =~ C5 135.79120
## 4 openness =~ E4 129.60464
## 5 neurot =~ C2 128.91871
## 6 conscient =~ E5 127.34527
## 7 C1 ~~ C2 110.30471
## 8 O2 ~~ O5 98.82617
## 9 extrov =~ A5 89.36109
## 10 extrov =~ N3 87.78938
We can compare the CFIs for the 3 models with the fitmeasures()
function.
fitmeasures(bf_fit)[9]
## cfi
## 0.7823657
fitmeasures(bf_fit_re1)[9]
## cfi
## 0.8021913
fitmeasures(bf_fit_re2)[9]
## cfi
## 0.8283089
In real life you should not proceed to the structural equation modeling phase unless you have a good fitting measurement model (CFA). For demonstration purposes let’s add gender, age, and education into the model as predictors of the 5 personality factors.
bf_model_sem <- ' agreeable =~ A2 + A3 + A4 + A5
conscient =~ C1 + C2 + C3 + C4 + C5
extrov =~ E1 + E2 + E3 + E4 + E5
neurot =~ N1 + N2 + N3 + N4 + N5
openness =~ O1 + O2 + O3 + O5
N1 ~~ N2
N3 ~~ N4
agreeable ~ age + gender + education
conscient ~ age + gender + education
extrov ~ age + gender + education
neurot ~ age + gender + education
openness ~ age + gender + education
age ~~ gender
age ~~ education
gender ~~ education
'
Let’s make the graph.
semPaths(semPlotModel(bf_model_sem), rotation = 2)
Instead of the cfa()
function we will use the sem()
function.
bf_fit_sem <- sem(bf_model_sem, data = bfi)
summary(bf_fit_sem, fit.measures = TRUE, rsq=TRUE)
## lavaan (0.5-23.1097) converged normally after 91 iterations
##
## Used Total
## Number of observations 2253 2800
##
## Estimator ML
## Minimum Function Test Statistic 3288.796
## Degrees of freedom 272
## P-value (Chi-square) 0.000
##
## Model test baseline model:
##
## Minimum Function Test Statistic 16549.044
## Degrees of freedom 325
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.814
## Tucker-Lewis Index (TLI) 0.778
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -97728.434
## Loglikelihood unrestricted model (H1) -96084.035
##
## Number of free parameters 79
## Akaike (AIC) 195614.867
## Bayesian (BIC) 196066.749
## Sample-size adjusted Bayesian (BIC) 195815.753
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.070
## 90 Percent Confidence Interval 0.068 0.072
## P-value RMSEA <= 0.05 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.064
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|)
## agreeable =~
## A2 1.000
## A3 1.307 0.053 24.813 0.000
## A4 1.019 0.053 19.300 0.000
## A5 1.191 0.050 23.956 0.000
## conscient =~
## C1 1.000
## C2 1.161 0.063 18.400 0.000
## C3 1.093 0.061 17.948 0.000
## C4 -1.488 0.073 -20.360 0.000
## C5 -1.588 0.082 -19.397 0.000
## extrov =~
## E1 1.000
## E2 1.234 0.054 22.996 0.000
## E3 -0.954 0.043 -22.002 0.000
## E4 -1.139 0.049 -23.207 0.000
## E5 -0.826 0.041 -20.101 0.000
## neurot =~
## N1 1.000
## N2 0.952 0.027 35.750 0.000
## N3 1.230 0.052 23.636 0.000
## N4 0.996 0.048 20.889 0.000
## N5 0.885 0.040 22.366 0.000
## openness =~
## O1 1.000
## O2 -1.040 0.071 -14.575 0.000
## O3 1.364 0.074 18.319 0.000
## O5 -0.961 0.063 -15.359 0.000
##
## Regressions:
## Estimate Std.Err z-value P(>|z|)
## agreeable ~
## age 0.008 0.002 4.738 0.000
## gender 0.343 0.038 9.110 0.000
## education -0.011 0.016 -0.704 0.481
## conscient ~
## age 0.007 0.002 4.440 0.000
## gender 0.129 0.034 3.852 0.000
## education 0.002 0.014 0.142 0.887
## extrov ~
## age -0.004 0.002 -2.155 0.031
## gender -0.263 0.046 -5.661 0.000
## education 0.002 0.020 0.095 0.924
## neurot ~
## age -0.012 0.002 -5.049 0.000
## gender 0.286 0.052 5.480 0.000
## education -0.016 0.022 -0.735 0.462
## openness ~
## age 0.003 0.002 1.850 0.064
## gender -0.139 0.035 -3.993 0.000
## education 0.065 0.015 4.289 0.000
##
## Covariances:
## Estimate Std.Err z-value P(>|z|)
## .N1 ~~
## .N2 0.674 0.047 14.403 0.000
## .N3 ~~
## .N4 -0.034 0.050 -0.679 0.497
## age ~~
## gender 0.234 0.106 2.219 0.026
## education 2.943 0.257 11.443 0.000
## gender ~~
## education 0.004 0.011 0.386 0.699
## .agreeable ~~
## .conscient 0.140 0.015 9.615 0.000
## .extrov -0.439 0.027 -16.045 0.000
## .neurot -0.156 0.021 -7.488 0.000
## .openness 0.132 0.015 8.947 0.000
## .conscient ~~
## .extrov -0.195 0.019 -10.234 0.000
## .neurot -0.207 0.021 -9.907 0.000
## .openness 0.120 0.014 8.691 0.000
## .extrov ~~
## .neurot 0.291 0.028 10.240 0.000
## .openness -0.279 0.022 -12.501 0.000
## .neurot ~~
## .openness -0.084 0.019 -4.405 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|)
## .A2 0.821 0.030 27.790 0.000
## .A3 0.776 0.034 23.026 0.000
## .A4 1.556 0.051 30.440 0.000
## .A5 0.840 0.033 25.484 0.000
## .C1 1.065 0.036 29.356 0.000
## .C2 1.162 0.041 28.345 0.000
## .C3 1.164 0.040 28.954 0.000
## .C4 0.932 0.041 22.805 0.000
## .C5 1.608 0.061 26.441 0.000
## .E1 1.791 0.059 30.139 0.000
## .E2 1.333 0.050 26.474 0.000
## .E3 1.050 0.037 28.208 0.000
## .E4 1.063 0.041 25.982 0.000
## .E5 1.216 0.040 30.125 0.000
## .N1 1.367 0.056 24.554 0.000
## .N2 1.376 0.054 25.388 0.000
## .N3 0.912 0.064 14.318 0.000
## .N4 1.358 0.063 21.647 0.000
## .N5 1.777 0.061 29.202 0.000
## .O1 0.859 0.033 26.292 0.000
## .O2 1.960 0.065 30.283 0.000
## .O3 0.693 0.040 17.468 0.000
## .O5 1.395 0.047 29.596 0.000
## age 113.628 3.385 33.563 0.000
## gender 0.221 0.007 33.563 0.000
## education 1.235 0.037 33.563 0.000
## .agreeable 0.484 0.033 14.452 0.000
## .conscient 0.406 0.035 11.741 0.000
## .extrov 0.800 0.061 13.120 0.000
## .neurot 1.050 0.069 15.153 0.000
## .openness 0.388 0.033 11.681 0.000
##
## R-Square:
## Estimate
## A2 0.387
## A3 0.532
## A4 0.257
## A5 0.466
## C1 0.281
## C2 0.325
## C3 0.299
## C4 0.497
## C5 0.395
## E1 0.314
## E2 0.483
## E3 0.415
## E4 0.500
## E5 0.314
## N1 0.442
## N2 0.417
## N3 0.643
## N4 0.442
## N5 0.323
## O1 0.317
## O2 0.180
## O3 0.518
## O5 0.209
## agreeable 0.066
## conscient 0.023
## extrov 0.022
## neurot 0.031
## openness 0.028
#standardized item loadings
inspect(bf_fit_sem, what = "std")$lambda
## agrebl cnscnt extrov neurot opnnss age gender eductn
## A2 0.622 0.000 0.000 0.000 0.000 0 0 0
## A3 0.730 0.000 0.000 0.000 0.000 0 0 0
## A4 0.507 0.000 0.000 0.000 0.000 0 0 0
## A5 0.683 0.000 0.000 0.000 0.000 0 0 0
## C1 0.000 0.530 0.000 0.000 0.000 0 0 0
## C2 0.000 0.570 0.000 0.000 0.000 0 0 0
## C3 0.000 0.547 0.000 0.000 0.000 0 0 0
## C4 0.000 -0.705 0.000 0.000 0.000 0 0 0
## C5 0.000 -0.628 0.000 0.000 0.000 0 0 0
## E1 0.000 0.000 0.560 0.000 0.000 0 0 0
## E2 0.000 0.000 0.695 0.000 0.000 0 0 0
## E3 0.000 0.000 -0.644 0.000 0.000 0 0 0
## E4 0.000 0.000 -0.707 0.000 0.000 0 0 0
## E5 0.000 0.000 -0.561 0.000 0.000 0 0 0
## N1 0.000 0.000 0.000 0.665 0.000 0 0 0
## N2 0.000 0.000 0.000 0.646 0.000 0 0 0
## N3 0.000 0.000 0.000 0.802 0.000 0 0 0
## N4 0.000 0.000 0.000 0.665 0.000 0 0 0
## N5 0.000 0.000 0.000 0.568 0.000 0 0 0
## O1 0.000 0.000 0.000 0.000 0.563 0 0 0
## O2 0.000 0.000 0.000 0.000 -0.425 0 0 0
## O3 0.000 0.000 0.000 0.000 0.719 0 0 0
## O5 0.000 0.000 0.000 0.000 -0.457 0 0 0
## age 0.000 0.000 0.000 0.000 0.000 1 0 0
## gender 0.000 0.000 0.000 0.000 0.000 0 1 0
## education 0.000 0.000 0.000 0.000 0.000 0 0 1
#standardized path estimates
inspect(bf_fit_sem, what = "std")$beta
## agrebl cnscnt extrov neurot opnnss age gender eductn
## agreeable 0 0 0 0 0 0.117 0.224 -0.017
## conscient 0 0 0 0 0 0.113 0.094 0.004
## extrov 0 0 0 0 0 -0.053 -0.136 0.002
## neurot 0 0 0 0 0 -0.122 0.129 -0.018
## openness 0 0 0 0 0 0.049 -0.103 0.114
## age 0 0 0 0 0 0.000 0.000 0.000
## gender 0 0 0 0 0 0.000 0.000 0.000
## education 0 0 0 0 0 0.000 0.000 0.000
#correlations bewteen latent variables and exogenous variables
inspect(bf_fit_sem, what = "std")$psi
## agrebl cnscnt extrov neurot opnnss age gender eductn
## agreeable 0.934
## conscient 0.316 0.977
## extrov -0.705 -0.342 0.978
## neurot -0.219 -0.317 0.317 0.969
## openness 0.304 0.302 -0.502 -0.131 0.972
## age 0.000 0.000 0.000 0.000 0.000 1.000
## gender 0.000 0.000 0.000 0.000 0.000 0.047 1.000
## education 0.000 0.000 0.000 0.000 0.000 0.248 0.008 1.000