CPA, 2024
\(^1\)McGill University
\(^2\)London School of Economics and Political Science
(Both authors contributed equally to this research)
Software?
General procedure:
FORTRAN, MCMC (kind of slow)
RAMONA 4.0 for DOS
Only SRMR studied/supported
ECDF of index
fitMeasures
These examples (from Preacher, 2006) have the same df
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
library(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
fitmeasures()
is supportedlibrary(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
fitmeasures()
is supportedlibrary(ockhamSEM)
set.seed(1234)
mat <- diag(3) # identity matrix
colnames(mat) <- rownames(mat) <- paste0("V", seq(1, 3))
mod1 <- 'V3 ~ V1 + V2
V1 ~~ 0*V2'
mod2 <- 'V3 ~ V1
V2 ~ V3'
mod1.fit <- sem(mod1, sample.cov=mat, sample.nobs=500)
mod2.fit <- sem(mod2, sample.cov=mat, sample.nobs=500)
res <- run.fitprop(
mod1.fit, mod2.fit, # models
fit.measure=c("srmr","cfi"), # fit indices
rmethod="onion", # method for R matrices
reps=1000) # number of replications
[1] "Generate matrices"
[1] "Fitting models"
fitmeasures()
is supported
Quantiles for each model and fit measure:
Model 1
srmr cfi
0% 0.001 1.000
10% 0.041 0.994
20% 0.091 0.969
30% 0.132 0.923
40% 0.176 0.852
50% 0.219 0.778
60% 0.269 0.682
70% 0.315 0.574
80% 0.406 0.415
90% 0.635 0.227
100% 11.059 0.000
Model 2
srmr cfi
0% 0.000 1.000
10% 0.031 0.982
20% 0.051 0.936
30% 0.079 0.870
40% 0.105 0.763
50% 0.134 0.656
60% 0.162 0.521
70% 0.202 0.393
80% 0.239 0.254
90% 0.294 0.129
100% 0.400 0.000
Information about replications for each model and fit measure:
Model 1
Mean across replications
srmr cfi
0.366 0.693
Median across replications
srmr cfi
0.219 0.778
Number of finite values
srmr cfi
1000 1000
Number of NA values
srmr cfi
0 0
Model 2
Mean across replications
srmr cfi
0.148 0.600
Median across replications
srmr cfi
0.134 0.656
Number of finite values
srmr cfi
1000 1000
Number of NA values
srmr cfi
0 0
Effect Sizes for Differences in Model Fit:
srmr
Model 1 vs. Model 2
Cohen's d: 0.411
Cliff's delta: 0.34
Komolgorov Smirnov: 0.273
cfi
Model 1 vs. Model 2
Cohen's d: 0.306
Cliff's delta: 0.17
Komolgorov Smirnov: 0.146
Proportion of fitted models that had CFI = .95 or better
Intersection of when Model 1 and 2 both had \(CFI \ge .95\) is overlap b/w “1” and “2”
Model 1 does not always have better CFI
ockhamSEM
useful for
Thank you very much to the CPA quantitative methods section!
Thanks also to Victoria Savalei for her inspiration and early input on this project. Kris Preacher for pointing us to his FORTRAN code.
Reference:
Falk, C.F., & Muthukrishna, M. (2023). Parsimony in model selection: Tools for assessing fit propensity. Psychological Methods, 28, 123-136. https://doi.org/10.1037/met0000422