Skip to content

Instantly share code, notes, and snippets.

@favstats
Last active February 21, 2020 00:48
Show Gist options
  • Select an option

  • Save favstats/7f07365653846f6b4f176ace2f3edd50 to your computer and use it in GitHub Desktop.

Select an option

Save favstats/7f07365653846f6b4f176ace2f3edd50 to your computer and use it in GitHub Desktop.
Function performs multiple group analysis to check for measurement invariance
library(tidyverse)
library(lavaan)
measurement_invariance <- function(model, data, group, fit_measures) {
## Configural Model
model1 <- cfa(model = model, data = data, group = group)
## Weak/metric invariance
model2 <- cfa(model = model, data = data, group = group, group.equal=c("loadings"))
## Strong/scalar invariance
model3 <- cfa(model = model, data = data, group = group, group.equal=c("loadings", "intercepts"))
## Strict invariance
model4 <- cfa(model = model, data = data, group = group, group.equal=c("loadings", "intercepts", "residuals"))
table_knitr <- bind_rows(
fitmeasures(model1, fit.measures = fit_measures),
fitmeasures(model2, fit.measures = fit_measures),
fitmeasures(model3, fit.measures = fit_measures),
fitmeasures(model4, fit.measures = fit_measures)
) %>%
mutate(diff_chisq = chisq - lag(chisq)) %>%
mutate(diff_df = df - lag(df)) %>%
mutate(diff_rmsea = rmsea - lag(rmsea)) %>%
mutate(diff_aic = aic - lag(aic))
cat("[Weak/Metric Invariance]:\n\n")
conf <- anova(model1, model2)
print(conf)
if (conf$`Pr(>Chisq)`[2] > 0.1) {
cat("\nInsignificant Chi Squared change indicates weak/metric invariance!\n")
} else if (conf$`Pr(>Chisq)`[2] <= 0.1) {
cat("\nWeak/metric invariance could not be established!\n")
return(table_knitr)
}
cat("\n\n[Strong/Scalar invariance]:\n\n")
conf <- anova(model2, model3)
print(conf)
if (conf$`Pr(>Chisq)`[2] > 0.1) {
cat("\nInsignificant Chi Squared change indicates strong/scalar invariance!\n")
} else if (conf$`Pr(>Chisq)`[2] <= 0.1) {
cat("\nStrong/scalar invariance could not be established!\n")
return(table_knitr)
}
cat("\n\n[Strict invariance]:\n\n")
conf <- anova(model3, model4)
print(conf)
if (conf$`Pr(>Chisq)`[2] > 0.1) {
cat("\nInsignificant Chi Squared change indicates strict invariance!\n")
} else if (conf$`Pr(>Chisq)`[2] <= 0.1) {
cat("\nStrict invariance could not be established!\n")
return(table_knitr)
}
return(table_knitr)
}
## Example
HS.model <- ' visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9 '
## define which fitmeasures you want
fit_measures <- c("chisq", "df", "pvalue", "cfi", "rmsea", "AIC")
## Check for measurement invariance
measurement_invariance(HS.model,
group = "school",
data = HolzingerSwineford1939,
fit_measures = fit_measures)
@favstats
Copy link
Copy Markdown
Author

Output:

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment