Structural Equation Modeling | Exercises 1
1 What we are going to do
- Ex.1 – Local Model Fit
- Ex.2 – Calculate the model-implied covariance matrix
- Ex.3 – 1-factor- vs 2-factor-model
- Ex.4 – Fit a second-order CFA
- Ex.5 – Compare second-order with first-order CFA
2 Dataset
The data set used throughout is still the European Social Survey ESS4-2008 Edition 4.5. We will restrict the analysis to the Belgian case.
Codebook:
- gvslvol Standard of living for the old, governments’ responsibility (0 Not governments’ responsibility at all - 10 Entirely governments’ responsibility) 
- gvslvue Standard of living for the unemployed, governments’ responsibility (0 Not governments’ responsibility at all - 10 Entirely governments’ responsibility) 
- gvhlthc Health care for the sick, governments’ responsibility (0 Not governments’ responsibility at all - 10 Entirely governments’ responsibility) 
- gvcldcr Child care services for working parents, governments’ responsibility (0 Not governments’ responsibility at all - 10 Entirely governments’ responsibility) 
- gvjbevn Job for everyone, governments’ responsibility (0 Not governments’ responsibility at all - 10 Entirely governments’ responsibility) 
- gvpdlwk Paid leave from work to care for sick family, governments’ responsibility (0 Not governments’ responsibility at all - 10 Entirely governments’ responsibility) 
- sbstrec Social benefits/services place too great strain on economy (1 Agree strongly - 5 Disagree strongly) 
- sbbsntx Social benefits/services cost businesses too much in taxes/charges (1 Agree strongly - 5 Disagree strongly) 
- sbprvpv Social benefits/services prevent widespread poverty (1 Agree strongly - 5 Disagree strongly) 
- sbeqsoc Social benefits/services lead to a more equal society (1 Agree strongly - 5 Disagree strongly) 
- sbcwkfm Social benefits/services make it easier to combine work and family (1 Agree strongly - 5 Disagree strongly) 
- sblazy Social benefits/services make people lazy (1 Agree strongly - 5 Disagree strongly) 
- sblwcoa Social benefits/services make people less willing care for one another (1 Agree strongly - 5 Disagree strongly) 
- sblwlka Social benefits/services make people less willing look after themselves/family (1 Agree strongly - 5 Disagree strongly) 
3 Environment preparation
First, let’s load the necessary packages to load, manipulate, visualize and analyse the data.
# Uncomment this once if you need to install the packages on your system 
### DATA MANIPULATION ###
# install.packages("haven")                 # data import from spss
# install.packages("dplyr")                 # data manipulation
# install.packages("psych")                 # descriptives
# install.packages("stringr")               # string manipulation
# ### MODELING ###
# install.packages("lavaan")                # SEM modelling
# install.packages("lavaan.survey")         # Wrapper around packages lavaan and survey
# ### VISUALIZATION ###
# install.packages("tidySEM")               # plotting SEM models
# install.packages("corrplot")              # correlation plots
# Load the packages 
### DATA MANIPULATION ###
library("haven")        
library("dplyr")      
library("psych")
library('stringr')
### MODELING ###
library("lavaan")       
### VISUALIZATION ###
library("tidySEM")
library("corrplot")     4 Ex.1 – Local Model Fit
- Fit the welfare support model with 6 items
- Modify the model by allowing error correlations and refit the model
- Review the parameter estimates and compare to the first model
- Review the fit statistics (global and local)
- Verify that the new model indeed fits the data better (perform a chi-squared difference test)
- Consider modifying the model even further based on the MIs, revise the model further. Describe its implications (OPTIONAL)
ess_df <- haven::read_sav("https://github.com/albertostefanelli/SEM_labs/raw/master/data/ESS4_belgium.sav")
model_ws_6_1 <-'welf_supp =~ gvslvol + gvslvue + gvhlthc + gvcldcr + gvjbevn + gvpdlwk'
fit_ws_6_1 <- cfa(,               # model formula
                 data=            # data frame
  )5 Ex.2 – Calculate the model-implied covariance matrix
- For the previous models, request the model-implied covariance of the matrix using lavaan’s inspect function.
- Calculate the model-implied covariance matrix using the formula:
- Compare the two matrices
- Calculate the differences between the two matrices (OPTIONAL)
# model-implied var-covariance matrix for observed variables
inspect(, "cov.ov") 6 Ex.3 – 1-factor- vs 3-factor-model
- Using the welfare criticism items, fit a 1-factor model.
- Using the welfare criticism items, fit a 3-factor model.
- Verify whether a 1-factor CFA model is appropriate.
- Review the model parameters.
- Compare the model fit statistics using a tabular form.
 
- Modify the 3-factor model by dropping items and/or allowing error correlations and compare it with the original model (OPTIONAL)
model_wc_1_factor <-'
wc_crit =~ 
'7 Ex.4 – Second order model
- Fit a second-order model with the three dimensions of welfare criticism.
- Review the model output using the summary function. Does the model fit well?
- Review the \(R^2\) values of the first-order latent variables. Which first-order factor is explained best by the second-order factor?
- Request model modification indices and explore model modifications.
- Remove low loadings and see if the model improves (OPTIONAL)
model_wc_2_order <-'
## Economic criticism ##
wc_econo =~
## Social criticism ## 
wc_socia =~ 
##  Moral criticism ##
wc_moral =~
## Second Order Welfare Criticism ## 
wc_crit =~ 
'8 Ex.5 – Compare first-order with second-order model
- How many degrees of freedom are lost between the two models? Why?
- Statistically compare model fit: does the second-order factor model fit significantly worse than the first-order factor model?
- Refit the first-order model without latent factor correlations and compare the fit (OPTIONAL)
anova(, )