rm(list=ls()) # Clean workspace
options(scipen=10000) # Set scientific notation
library(tidyverse)
library(lavaan) # For CFA
library(semTools) # For measurement of invariance in MGCFA
set.seed(121012) # For reproducibility
# Create simulated categorical dataset with missing values
popModel <- "
f1 =~ 0.6*y1 + 0.6*y2 + 0.6*y3 + 0.6*y4
y1 ~*~ 1*y1
y2 ~*~ 1*y2
y3 ~*~ 1*y3
y4 ~*~ 1*y4
f1 ~~ 1*f1
y1 | 0.5*t1
y2 | 0.25*t1
y3 | 0*t1
y4 | -0.5*t1
"
dat <- simulateData(popModel, sample.nobs = 200L)
miss.pat <- matrix(as.logical(rbinom(prod(dim(dat)), 1, 0.2)), nrow(dat), ncol(dat))
dat[miss.pat] <- NA
# Convert columns to factors with specified levels
dat$y1 <- factor(dat$y1, levels = c(1, 2))
dat$y2 <- factor(dat$y2, levels = c(1, 2))
dat$y3 <- factor(dat$y3, levels = c(1, 2))
dat$y4 <- factor(dat$y4, levels = c(1, 2))
# Define categories for a grouping variable school
schools <- c("Marx", "Durkheim", "Weber", "Comte")
# Sample the school categories randomly for each row
dat$school <- sample(schools, size = nrow(dat), replace = TRUE)
# Define Ordinal MG-CFA model
analyzeModel <- "
f1 =~ y1 + y2 + y3 + y4
y1 ~*~ 1*y1
y2 ~*~ 1*y2
y3 ~*~ 1*y3
y4 ~*~ 1*y4
"
# Create predictor matrix
predictormatrix<-quickpred(dat)
# Impute 5 datasets (common practice)
dat_imp <- mice(data = dat,
predictorMatrix = predictormatrix,
m = 5,
# Specify imputation method for ordinal data
method = "polr")
mice.imp <- NULL
for(i in 1:5) mice.imp[[i]] <- complete(dat_imp, action=i, inc=FALSE)
# run lavaan with previously imputed data using runMI
out2 <- semTools::runMI(analyzeModel,
data = mice.imp,
fun = "cfa",
meanstructure = TRUE,
group = "school", ordered = TRUE,
std.lv = TRUE)
detach("package:tidyverse", unload = TRUE)
library(semTools)
summary(out2)