library(pacman); p_load(lavaan)
SDI2.UDI2 = function(p, loading1, loading2, intercept1, intercept2, stdev2, fmean2, fsd2, nodewidth = 0.01, lowerLV = -5, upperLV = 5) {
LV = seq(lowerLV,upperLV,nodewidth)
DiffExpItem12 = matrix(NA,length(LV),p)
pdfLV2 = matrix(NA,length(LV),1)
SDI2numerator = matrix(NA,length(LV),p)
UDI2numerator = matrix(NA,length(LV),p)
SDI2 = matrix(NA,p,1)
UDI2 = matrix(NA,p,1)
for(j in 1:p){
for(k in 1:length(LV)){
DiffExpItem12[k,j] <- (intercept1[j]-intercept2[j]) + (loading1[j]-loading2[j])*LV[k]
pdfLV2[k] = dnorm(LV[k], mean=fmean2, sd=fsd2)
SDI2numerator[k,j] = DiffExpItem12[k,j]*pdfLV2[k]*nodewidth
UDI2numerator[k,j] = abs(SDI2numerator[k,j])
}
SDI2[j] <- sum(SDI2numerator[,j])/stdev2[j]
UDI2[j] <- sum(UDI2numerator[,j])/stdev2[j]
}
colnames(SDI2) = "SDI2"
colnames(UDI2) = "UDI2"
return(list(SDI2=round(SDI2,4), UDI2=round(UDI2,4)))}
SUDI <- function(SDI, UDI){
D <- ifelse(SDI < 0, -1, 1)
H = D * UDI
return(H)}
lower1991 <- '
1
0.29 1
0.51 0.29 1
0.2 0.28 0.19 1
0.36 0.16 0.3 0.05 1
0.42 0.32 0.28 0.09 0.22 1
0.25 0.28 0.26 0.35 0.1 0.17 1
0.21 0.08 0.24 0.02 0.24 0.19 0.11 1'
lower2022 <- '
1
0.32 1
0.48 0.15 1
0.31 0.3 0.24 1
0.3 0.19 0.31 0.23 1
0.37 0.15 0.17 0.07 0.11 1
0.21 0.3 0.22 0.21 0.1 0.04 1
0.3 0.17 0.2 0.09 0.2 0.09 0.2 1'
Names = list("QR", "VOC", "ABS", "VCOMP", "MENR", "ROTC", "VERM", "IDFI")
cor1991 = getCov(lower1991, names = Names)
cor2022 = getCov(lower2022, names = Names)
SDs1991 <- c(6.49, 6.78, 6.88, 3.74, 4.85, 7.56, 2.19, 2.57)
SDs2022 <- c(6.67, 5.95, 4.37, 3.09, 3.59, 4.92, 2.15, 2.26)
cov1991 = lavaan::cor2cov(cor1991, SDs1991)
cov2022 = lavaan::cor2cov(cor2022, SDs2022)
Means1991 <- c(20.8, 28.01, 36.88, 15.3, 9.79, 19.9, 14.5, 14.31)
Means2022 <- c(21.98, 29.6, 40.5, 16.85, 8.52, 15.53, 13.86, 13.66)
N1991 <- 310 #Approximate
N2022 <- 320 #Approximate
GCovs <- list(cov1991, cov2022)
GMeans <- list(Means1991, Means2022)
GNs <- list(N1991, N2022)
FITM <- c("chisq", "df", "nPar", "cfi", "rmsea", "rmsea.ci.lower", "rmsea.ci.upper", "aic", "bic")
Colom et al. (2023) have a new paper on the Flynn effect and they used MGCFA to assess it. But they didn’t go far enough; specifically, they stopped at the scalar (“strong”) model, so it was unclear if different influences operated in their 1991 or 2022 test-taker groups. Moreover, the amount of bias on the means was not quantified and because later levels of measurement and structural invariance testing were not conducted, it remains unclear how things changed.
So below, I extended their testing with their proposed model.
ColomBF <- '
Verbal =~ VOC + VCOMP + VERM
g =~ QR + VOC + ABS + VCOMP + MENR + ROTC + VERM + IDFI'
ColomBFConfig <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T)
ColomBFMetric <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = "loadings")
ColomBFMetricPartial <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = "loadings",
group.partial = c("g =~ ROTC", "g =~ ABS"))
ColomBFScalar <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts"),
group.partial = c("g =~ ROTC", "g =~ ABS"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFScalarPartial <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFStrict <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFStrictPartial <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1", "ROTC ~~ ROTC", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "QR ~~ QR", "ABS ~~ ABS", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVs <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals", "lv.variances"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1", "ROTC ~~ ROTC", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "QR ~~ QR", "ABS ~~ ABS", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeans <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "means"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1", "ROTC ~~ ROTC", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "QR ~~ QR", "ABS ~~ ABS", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFVerbalMean <- '
Verbal =~ VOC + VCOMP + VERM
g =~ QR + VOC + ABS + VCOMP + MENR + ROTC + VERM + IDFI
Verbal ~ c(0,0)*1'
ColomBFgMean <- '
Verbal =~ VOC + VCOMP + VERM
g =~ QR + VOC + ABS + VCOMP + MENR + ROTC + VERM + IDFI
g ~ c(0,0)*1'
ColomBFMeansPartialV <- cfa(ColomBFVerbalMean, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals", "lv.variances"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1", "ROTC ~~ ROTC", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "QR ~~ QR", "ABS ~~ ABS", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansPartialg <- cfa(ColomBFgMean, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals", "lv.variances"),
group.partial = c("g =~ ROTC", "g =~ ABS", "ABS ~ 1", "MENR ~ 1", "ROTC ~ 1", "VERM ~ 1", "IDFI ~ 1", "ROTC ~~ ROTC", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "QR ~~ QR", "ABS ~~ ABS", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
round(cbind(CONFIGURAL = fitMeasures(ColomBFConfig, FITM),
METRIC = fitMeasures(ColomBFMetric, FITM),
PMETRIC = fitMeasures(ColomBFMetricPartial, FITM),
SCALAR = fitMeasures(ColomBFScalar, FITM),
PSCALAR = fitMeasures(ColomBFScalarPartial, FITM),
STRICT = fitMeasures(ColomBFStrict, FITM),
PSTRICT = fitMeasures(ColomBFStrictPartial, FITM),
LVARS = fitMeasures(ColomBFLVs, FITM),
MEANS = fitMeasures(ColomBFMeans, FITM),
PMEANSV = fitMeasures(ColomBFMeansPartialV, FITM),
PMEANSg = fitMeasures(ColomBFMeansPartialg, FITM)), 3)
## CONFIGURAL METRIC PMETRIC SCALAR PSCALAR STRICT
## chisq 56.862 92.512 70.026 346.674 72.730 179.722
## df 34.000 43.000 41.000 47.000 42.000 50.000
## npar 54.000 45.000 47.000 41.000 46.000 38.000
## cfi 0.967 0.929 0.958 0.569 0.956 0.813
## rmsea 0.046 0.060 0.047 0.142 0.048 0.091
## rmsea.ci.lower 0.024 0.043 0.027 0.128 0.029 0.077
## rmsea.ci.upper 0.067 0.077 0.066 0.156 0.066 0.105
## aic 28236.169 28253.819 28235.333 28499.981 28236.037 28327.028
## bic 28476.238 28453.876 28444.281 28682.256 28440.540 28495.966
## PSTRICT LVARS MEANS PMEANSV PMEANSg
## chisq 77.462 81.765 112.747 102.109 86.383
## df 44.000 46.000 48.000 47.000 47.000
## npar 44.000 42.000 40.000 41.000 41.000
## cfi 0.952 0.949 0.907 0.921 0.943
## rmsea 0.049 0.050 0.065 0.061 0.052
## rmsea.ci.lower 0.030 0.032 0.050 0.045 0.034
## rmsea.ci.upper 0.067 0.067 0.081 0.077 0.068
## aic 28236.769 28237.072 28264.054 28255.415 28239.689
## bic 28432.381 28423.792 28441.882 28437.690 28421.964
Here’s the best-fitting model by conventional standards. Although it does not pass an exact fit test, that’s marginal (p = 0.032).
summary(ColomBFMeansPartialg, stand = T, fit = T)
## lavaan 0.6.16 ended normally after 52 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 55
## Number of equality constraints 14
##
## Number of observations per group:
## Group 1 310
## Group 2 320
##
## Model Test User Model:
##
## Test statistic 86.383
## Degrees of freedom 47
## P-value (Chi-square) 0.000
## Test statistic for each group:
## Group 1 38.209
## Group 2 48.174
##
## Model Test Baseline Model:
##
## Test statistic 750.954
## Degrees of freedom 56
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.943
## Tucker-Lewis Index (TLI) 0.932
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -14078.845
## Loglikelihood unrestricted model (H1) -14035.653
##
## Akaike (AIC) 28239.689
## Bayesian (BIC) 28421.964
## Sample-size adjusted Bayesian (SABIC) 28291.794
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.052
## 90 Percent confidence interval - lower 0.034
## 90 Percent confidence interval - upper 0.068
## P-value H_0: RMSEA <= 0.050 0.418
## P-value H_0: RMSEA >= 0.080 0.002
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.052
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
##
## Group 1 [Group 1]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.147 0.351 6.115 0.000 2.147 0.339
## VCOMP (.p2.) 1.602 0.245 6.549 0.000 1.602 0.434
## VERM (.p3.) 0.878 0.161 5.461 0.000 0.878 0.406
## g =~
## QR (.p4.) 5.210 0.276 18.897 0.000 5.210 0.792
## VOC (.p5.) 2.524 0.279 9.043 0.000 2.524 0.399
## ABS 4.480 0.404 11.095 0.000 4.480 0.652
## VCOMP (.p7.) 1.068 0.152 7.040 0.000 1.068 0.290
## MENR (.p8.) 1.739 0.178 9.747 0.000 1.739 0.369
## ROTC 3.931 0.455 8.637 0.000 3.931 0.521
## VERM (.10.) 0.677 0.097 6.968 0.000 0.677 0.313
## IDFI (.11.) 0.829 0.106 7.806 0.000 0.829 0.322
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal ~~
## g 0.000 0.000 0.000
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## g 0.000 0.000 0.000
## .VOC (.24.) 27.973 0.323 86.592 0.000 27.973 4.420
## .VCOMP (.25.) 15.476 0.199 77.938 0.000 15.476 4.194
## .VERM 14.547 0.121 120.184 0.000 14.547 6.719
## .QR (.27.) 21.397 0.263 81.440 0.000 21.397 3.251
## .ABS 37.189 0.363 102.459 0.000 37.189 5.412
## .MENR 9.910 0.262 37.820 0.000 9.910 2.101
## .ROTC 20.171 0.410 49.206 0.000 20.171 2.671
## .IDFI 14.367 0.144 99.974 0.000 14.367 5.584
## Verbal 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .VOC (.13.) 29.073 2.084 13.953 0.000 29.073 0.726
## .VCOMP 9.912 1.131 8.761 0.000 9.912 0.728
## .VERM (.15.) 3.458 0.306 11.302 0.000 3.458 0.738
## .QR 16.165 2.515 6.427 0.000 16.165 0.373
## .ABS 27.154 2.889 9.400 0.000 27.154 0.575
## .MENR 19.221 1.610 11.942 0.000 19.221 0.864
## .ROTC 41.560 3.777 11.003 0.000 41.560 0.729
## .IDFI 5.934 0.492 12.072 0.000 5.934 0.896
## Verbal 1.000 1.000 1.000
## g 1.000 1.000 1.000
##
##
## Group 2 [Group 2]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.147 0.351 6.115 0.000 2.147 0.339
## VCOMP (.p2.) 1.602 0.245 6.549 0.000 1.602 0.508
## VERM (.p3.) 0.878 0.161 5.461 0.000 0.878 0.406
## g =~
## QR (.p4.) 5.210 0.276 18.897 0.000 5.210 0.788
## VOC (.p5.) 2.524 0.279 9.043 0.000 2.524 0.399
## ABS 2.611 0.260 10.048 0.000 2.611 0.597
## VCOMP (.p7.) 1.068 0.152 7.040 0.000 1.068 0.339
## MENR (.p8.) 1.739 0.178 9.747 0.000 1.739 0.474
## ROTC 1.894 0.304 6.223 0.000 1.894 0.385
## VERM (.10.) 0.677 0.097 6.968 0.000 0.677 0.313
## IDFI (.11.) 0.829 0.106 7.806 0.000 0.829 0.368
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal ~~
## g 0.000 0.000 0.000
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## g 0.000 0.000 0.000
## .VOC (.24.) 27.973 0.323 86.592 0.000 27.973 4.420
## .VCOMP (.25.) 15.476 0.199 77.938 0.000 15.476 4.913
## .VERM 13.134 0.233 56.428 0.000 13.134 6.066
## .QR (.27.) 21.397 0.263 81.440 0.000 21.397 3.238
## .ABS 40.326 0.231 174.901 0.000 40.326 9.224
## .MENR 8.404 0.198 42.502 0.000 8.404 2.292
## .ROTC 15.403 0.269 57.350 0.000 15.403 3.132
## .IDFI 13.605 0.123 110.383 0.000 13.605 6.041
## Verbal 0.775 0.173 4.473 0.000 0.775 0.775
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .VOC (.13.) 29.073 2.084 13.953 0.000 29.073 0.726
## .VCOMP 6.216 0.888 7.001 0.000 6.216 0.626
## .VERM (.15.) 3.458 0.306 11.302 0.000 3.458 0.738
## .QR 16.523 2.591 6.377 0.000 16.523 0.378
## .ABS 12.294 1.207 10.182 0.000 12.294 0.643
## .MENR 10.418 0.904 11.529 0.000 10.418 0.775
## .ROTC 20.603 1.727 11.926 0.000 20.603 0.852
## .IDFI 4.386 0.363 12.068 0.000 4.386 0.865
## Verbal 1.000 1.000 1.000
## g 1.000 1.000 1.000
I’ll use the parameters from this model to assess bias. As is pretty clear, this doesn’t do much.
summary(ColomBFLVs, stand = T, fit = T)
## lavaan 0.6.16 ended normally after 52 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 56
## Number of equality constraints 14
##
## Number of observations per group:
## Group 1 310
## Group 2 320
##
## Model Test User Model:
##
## Test statistic 81.765
## Degrees of freedom 46
## P-value (Chi-square) 0.001
## Test statistic for each group:
## Group 1 35.871
## Group 2 45.894
##
## Model Test Baseline Model:
##
## Test statistic 750.954
## Degrees of freedom 56
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.949
## Tucker-Lewis Index (TLI) 0.937
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -14076.536
## Loglikelihood unrestricted model (H1) -14035.653
##
## Akaike (AIC) 28237.072
## Bayesian (BIC) 28423.792
## Sample-size adjusted Bayesian (SABIC) 28290.447
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.050
## 90 Percent confidence interval - lower 0.032
## 90 Percent confidence interval - upper 0.067
## P-value H_0: RMSEA <= 0.050 0.489
## P-value H_0: RMSEA >= 0.080 0.001
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.049
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
##
## Group 1 [Group 1]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.141 0.360 5.947 0.000 2.141 0.339
## VCOMP (.p2.) 1.605 0.250 6.409 0.000 1.605 0.435
## VERM (.p3.) 0.878 0.161 5.449 0.000 0.878 0.406
## g =~
## QR (.p4.) 5.190 0.275 18.862 0.000 5.190 0.792
## VOC (.p5.) 2.499 0.280 8.941 0.000 2.499 0.395
## ABS 4.472 0.404 11.071 0.000 4.472 0.651
## VCOMP (.p7.) 1.070 0.152 7.047 0.000 1.070 0.290
## MENR (.p8.) 1.735 0.179 9.717 0.000 1.735 0.368
## ROTC 3.920 0.455 8.612 0.000 3.920 0.520
## VERM (.10.) 0.676 0.097 6.951 0.000 0.676 0.312
## IDFI (.11.) 0.826 0.106 7.779 0.000 0.826 0.321
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal ~~
## g 0.000 0.000 0.000
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .VOC (.23.) 27.777 0.332 83.617 0.000 27.777 4.393
## .VCOMP (.24.) 15.414 0.200 76.939 0.000 15.414 4.175
## .VERM 14.501 0.123 117.965 0.000 14.501 6.700
## .QR (.26.) 20.830 0.372 55.979 0.000 20.830 3.177
## .ABS 36.882 0.390 94.589 0.000 36.882 5.372
## .MENR 9.792 0.268 36.554 0.000 9.792 2.076
## .ROTC 19.899 0.429 46.434 0.000 19.899 2.637
## .IDFI 14.311 0.146 97.945 0.000 14.311 5.563
## Verbal 0.000 0.000 0.000
## g 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .VOC (.12.) 29.152 2.091 13.944 0.000 29.152 0.729
## .VCOMP 9.907 1.142 8.675 0.000 9.907 0.727
## .VERM (.14.) 3.456 0.306 11.276 0.000 3.456 0.738
## .QR 16.058 2.505 6.412 0.000 16.058 0.373
## .ABS 27.135 2.888 9.397 0.000 27.135 0.576
## .MENR 19.234 1.611 11.943 0.000 19.234 0.865
## .ROTC 41.563 3.776 11.006 0.000 41.563 0.730
## .IDFI 5.935 0.492 12.073 0.000 5.935 0.897
## Verbal 1.000 1.000 1.000
## g 1.000 1.000 1.000
##
##
## Group 2 [Group 2]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.141 0.360 5.947 0.000 2.141 0.339
## VCOMP (.p2.) 1.605 0.250 6.409 0.000 1.605 0.509
## VERM (.p3.) 0.878 0.161 5.449 0.000 0.878 0.406
## g =~
## QR (.p4.) 5.190 0.275 18.862 0.000 5.190 0.788
## VOC (.p5.) 2.499 0.280 8.941 0.000 2.499 0.395
## ABS 2.609 0.260 10.034 0.000 2.609 0.597
## VCOMP (.p7.) 1.070 0.152 7.047 0.000 1.070 0.340
## MENR (.p8.) 1.735 0.179 9.717 0.000 1.735 0.473
## ROTC 1.893 0.305 6.215 0.000 1.893 0.385
## VERM (.10.) 0.676 0.097 6.951 0.000 0.676 0.312
## IDFI (.11.) 0.826 0.106 7.779 0.000 0.826 0.367
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal ~~
## g 0.000 0.000 0.000
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .VOC (.23.) 27.777 0.332 83.617 0.000 27.777 4.393
## .VCOMP (.24.) 15.414 0.200 76.939 0.000 15.414 4.892
## .VERM 13.092 0.222 58.847 0.000 13.092 6.049
## .QR (.26.) 20.830 0.372 55.979 0.000 20.830 3.163
## .ABS 39.935 0.300 133.051 0.000 39.935 9.138
## .MENR 8.145 0.235 34.588 0.000 8.145 2.223
## .ROTC 15.121 0.307 49.254 0.000 15.121 3.074
## .IDFI 13.481 0.138 97.571 0.000 13.481 5.987
## Verbal 0.708 0.172 4.119 0.000 0.708 0.708
## g 0.216 0.101 2.135 0.033 0.216 0.216
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .VOC (.12.) 29.152 2.091 13.944 0.000 29.152 0.729
## .VCOMP 6.208 0.901 6.891 0.000 6.208 0.625
## .VERM (.14.) 3.456 0.306 11.276 0.000 3.456 0.738
## .QR 16.417 2.579 6.365 0.000 16.417 0.379
## .ABS 12.293 1.208 10.177 0.000 12.293 0.644
## .MENR 10.419 0.904 11.532 0.000 10.419 0.776
## .ROTC 20.614 1.729 11.925 0.000 20.614 0.852
## .IDFI 4.388 0.364 12.071 0.000 4.388 0.865
## Verbal 1.000 1.000 1.000
## g 1.000 1.000 1.000
# 2022 for reference
#Parameters for F1, verbal: VOC, VCOMP, VERM
Op = 3; Ol1 = c(0, 0, 0); Ol2 = c(0, 0, 0)
Oi1 = c(0, 0, 14.501); Oi2 = c(0, 0, 13.092)
Osd = c(5.95, 3.09, 2.15); Ofm = .708; Ofsd = 1
#Parameters for F2, g: VOC, VCOMP, VERM, QR, ABS, MENR, ROTC, IDFI
Sp = 8; Sl1 = c(0, 0, 0, 0, 4.472, 0, 3.920, 0); Sl2 = c(0, 0, 0, 0, 2.609, 0, 1.893, 0)
Si1 = c(0, 0, 14.501, 0, 36.882, 9.792, 19.899, 14.311); Si2 = c(0, 0, 13.092, 0, 39.935, 8.145, 15.121, 13.481)
Ssd = c(5.95, 3.09, 2.15, 6.67, 4.37, 3.59, 4.92, 2.26); Sfm = .216; Sfsd = 1
OES <- SDI2.UDI2(Op, Ol1, Ol2, Oi1, Oi2, Osd, Ofm, Ofsd)
SES <- SDI2.UDI2(Sp, Sl1, Sl2, Si1, Si2, Ssd, Sfm, Sfsd)
SUDI(OES$SDI2, OES$UDI2); SUDI(SES$SDI2, SES$UDI2)
## SDI2
## [1,] 0.0000
## [2,] 0.0000
## [3,] 0.6553
## SDI2
## [1,] 0.0000
## [2,] 0.0000
## [3,] 0.6553
## [4,] 0.0000
## [5,] -0.6363
## [6,] 0.4588
## [7,] 1.0614
## [8,] 0.3673
Just using the g results, verbal meanings should change from -4.35 to +5.48, abstract reasoning should change from +9.45 to -0.09, mental rotations should change from -4.50 to +2.38, rote calculation should change from -10.35 to +5.57, and identical figures should change from -4.05 to +1.46.
The Flynn effect in this sample seems to be strongly affected by bias.
Only two of the residual variances could be considered equal, and one of the subtests with equal residual variances had a biased intercept. The one completely unbiased item, vocabulary, increased by 3.75 IQ points. Verbal comprehension increased by 6.75 points, verbal meaning increased by 5.48 points, quantitative reasoning increased by 2.70 points, and abstract reasoning decreased by -0.09 points. Mental rotations increased by 2.38 points, while rote calculation drastically changed from an apparent decrease of 10.35 points to an increase of 5.57 points, and identical figures went from decreasing by 4.05 points to increasing by 1.46.
Overall, the Flynn effect at the subtest level was larger than expected because bias masked gains. This means the result was very similar to Gonthier & Grégoire’s (2022) result from France. However, unlike their result, this one allowed for estimates of latent gains.
With typical standards for testing measurement invariance, there did not appear to be any gains in g, only in the verbal factor and specific subtests, and in all but two subtests (vocabulary and verbal meaning) there were new, unshared influences on the subtests, although the intercept for verbal meaning was raised, so there was a homogeneous biasing effect on that subtest.
In conclusion, the average Flynn effect across subtests was 2.27 points, or 0.07 points per year/0.7 points per decade after accounting for bias, and it did not appear to be an increase in intelligence.
Colom, R., García, L. F., Shih, P. C., & Abad, F. J. (2023). Generational intelligence tests score changes in Spain: Are we asking the right question? Intelligence, 99, 101772. https://doi.org/10.1016/j.intell.2023.101772
Gonthier, C., & Grégoire, J. (2022). Flynn effects are biased by differential item functioning over time: A test using overlapping items in Wechsler scales. Intelligence, 95, 101688. https://doi.org/10.1016/j.intell.2022.101688
Lasker, J., Haltigan, J. D., & Richardson, G. B. (2022). Measurement Issues in Tests of the Socioecological Complexity Hypothesis. Evolutionary Psychological Science, 8(2), 228–239. https://doi.org/10.1007/s40806-021-00301-0
The verbal + g bifactor model makes very little theoretical sense (see Lasker, Haltigan & Richardson, 2022), so how does a more theoretically coherent model fit? To answer this, I fit a higher-order factor model with a verbal, spatial, and quantitative factor. One of the reasons the bifactor can’t be easily theoretically interpreted is because of factor collapse and the fact that group factors in that model are often just representations of local independence violation.
A major reason it’s worthwhile to model additional group factors is that an unmodeled group factor or a set of large residual covariances can introduce bias in the intercepts or loadings, and modeling them can help to limit attributing bias to a test that isn’t biased. So first, let’s model the lower-level structure. Since the group factors without g in the model represent g variance and redistributed g differences, the structural modeling would be misleading, so it was skipped, since it is also unnecessary.
ColomGF <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
Verbal ~~ Spatial + Quantitative
Spatial ~~ Quantitative'
ColomGFConfig <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = F)
ColomGFMetric <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = F,
group.equal = "loadings")
ColomGFMetricPartial <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = F,
group.equal = "loadings",
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC"))
ColomGFScalar <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = F,
group.equal = c("loadings", "intercepts"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomGFScalarPartial <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = F,
group.equal = c("loadings", "intercepts"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "VOC ~ 1"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomGFStrict <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = F,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "VOC ~ 1"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomGFStrictPartial <- cfa(ColomGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = F,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "VOC ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
round(cbind(CONFIGURAL = fitMeasures(ColomGFConfig, FITM),
METRIC = fitMeasures(ColomGFMetric, FITM),
PMETRIC = fitMeasures(ColomGFMetricPartial, FITM),
SCALAR = fitMeasures(ColomGFScalar, FITM),
PSCALAR = fitMeasures(ColomGFScalarPartial, FITM),
STRICT = fitMeasures(ColomGFStrict, FITM),
PSTRICT = fitMeasures(ColomGFStrictPartial, FITM)), 3)
## CONFIGURAL METRIC PMETRIC SCALAR PSCALAR STRICT
## chisq 54.075 74.338 58.305 338.297 61.823 169.557
## df 34.000 39.000 38.000 43.000 39.000 47.000
## npar 54.000 49.000 50.000 45.000 49.000 41.000
## cfi 0.971 0.949 0.971 0.575 0.967 0.824
## rmsea 0.043 0.054 0.041 0.148 0.043 0.091
## rmsea.ci.lower 0.019 0.035 0.017 0.133 0.021 0.076
## rmsea.ci.upper 0.064 0.072 0.061 0.162 0.063 0.106
## aic 28233.381 28243.644 28229.612 28499.604 28231.129 28322.864
## bic 28473.450 28461.485 28451.898 28699.661 28448.970 28505.138
## PSTRICT
## chisq 67.483
## df 42.000
## npar 46.000
## cfi 0.963
## rmsea 0.044
## rmsea.ci.lower 0.023
## rmsea.ci.upper 0.063
## aic 28230.789
## bic 28435.292
Overall, the measurement model seems wholly admissible minus a marginally significant difference with the partial strict model (p = 0.04).
ColomBF <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative'
ColomBFConfig <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T)
ColomBFMetric <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = "loadings")
ColomBFMetricPartial <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = "loadings",
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC"))
ColomBFScalar <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFScalarPartial <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1"), #A model with VOC ~ 1 freed is inadmissible because the DF delta becomes 0, so we must settle for p = 1-pchisq(68.014-61.492, 1) = 0.011
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFStrict <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFStrictPartial <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = F, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVs <- cfa(ColomBF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals", "lv.variances"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFV <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal'
ColomBFS <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Spatial ~~ 1*Spatial'
ColomBFQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Quantitative ~~ 1*Quantitative'
ColomBFVS <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial'
ColomBFVQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Quantitative ~~ 1*Quantitative'
ColomBFSQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative'
ColomBFGF <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative'
ColomBFg <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
g ~~ 1*g'
ColomBFgV <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
g ~~ 1*g'
ColomBFgS <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Spatial ~~ 1*Spatial
g ~~ 1*g'
ColomBFgQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Quantitative ~~ 1*Quantitative
g ~~ 1*g'
ColomBFgVS <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
g ~~ 1*g'
ColomBFgVQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Quantitative ~~ 1*Quantitative
g ~~ 1*g'
ColomBFgSQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
g ~~ 1*g'
ColomBFLVsV <- cfa(ColomBFV, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsS <- cfa(ColomBFS, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsQ <- cfa(ColomBFQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsVS <- cfa(ColomBFVS, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsVQ <- cfa(ColomBFVQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsSQ <- cfa(ColomBFSQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsGF <- cfa(ColomBFGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsG <- cfa(ColomBFg, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsVG <- cfa(ColomBFgV, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsSG <- cfa(ColomBFgS, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsQG <- cfa(ColomBFgQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsVSG <- cfa(ColomBFgVS, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsVQG <- cfa(ColomBFgVQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFLVsSQG <- cfa(ColomBFgSQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeans <- cfa(ColomBFGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals", "means"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFGFV <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1'
ColomBFGFS <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Spatial ~ c(0,0)*1'
ColomBFGFQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Quantitative ~ c(0,0)*1'
ColomBFGFVS <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1'
ColomBFGFVQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1
Quantitative ~ c(0,0)*1'
ColomBFGFSQ <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Spatial ~ c(0,0)*1
Quantitative ~ c(0,0)*1'
ColomBFGFGF <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
Quantitative ~ c(0,0)*1'
ColomBFGFG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
g ~ c(0,0)*1'
ColomBFGFVG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1
g ~ c(0,0)*1'
ColomBFGFSG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Spatial ~ c(0,0)*1
g ~ c(0,0)*1'
ColomBFGFQG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Quantitative ~ c(0,0)*1
g ~ c(0,0)*1'
ColomBFGFVSG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
g ~ c(0,0)*1'
ColomBFGFVQG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Verbal ~ c(0,0)*1
Quantitative ~ c(0,0)*1
g ~ c(0,0)*1'
ColomBFGFSQG <- '
Verbal =~ VOC + VCOMP + VERM
Spatial =~ ABS + MENR + IDFI
Quantitative =~ QR + ROTC
g =~ Verbal + Spatial + Quantitative
Verbal ~~ 1*Verbal
Spatial ~~ 1*Spatial
Quantitative ~~ 1*Quantitative
Spatial ~ c(0,0)*1
Quantitative ~ c(0,0)*1
g ~ c(0,0)*1'
ColomBFMeansV <- cfa(ColomBFGFV, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansS <- cfa(ColomBFGFS, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansQ <- cfa(ColomBFGFQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansVS <- cfa(ColomBFGFVS, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansVQ <- cfa(ColomBFGFVQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansSQ <- cfa(ColomBFGFSQ, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansGF <- cfa(ColomBFGFGF, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansVG <- cfa(ColomBFGFVG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansSG <- cfa(ColomBFGFSG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansQG <- cfa(ColomBFGFQG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansVSG <- cfa(ColomBFGFVSG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansVQG <- cfa(ColomBFGFVQG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
ColomBFMeansSQG <- cfa(ColomBFGFSQG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs,
std.lv = T, meanstructure = T, orthogonal = T,
group.equal = c("loadings", "intercepts", "residuals"),
group.partial = c("Quantitative =~ QR", "Quantitative =~ ROTC", "ABS ~ 1", "QR ~ 1", "VERM ~ 1", "ROTC ~~ ROTC", "ABS ~~ ABS", "MENR ~~ MENR", "VCOMP ~~ VCOMP", "IDFI ~~ IDFI"),
control=list(rel.tol=1e-4), check.gradient = FALSE)
round(cbind(CONFIGURAL = fitMeasures(ColomBFConfig, FITM),
METRIC = fitMeasures(ColomBFMetric, FITM),
PMETRIC = fitMeasures(ColomBFMetricPartial, FITM),
SCALAR = fitMeasures(ColomBFScalar, FITM),
PSCALAR = fitMeasures(ColomBFScalarPartial, FITM),
STRICT = fitMeasures(ColomBFStrict, FITM),
PSTRICT = fitMeasures(ColomBFStrictPartial, FITM),
LVARS = fitMeasures(ColomBFLVs, FITM),
PLVARS = fitMeasures(ColomBFLVsGF, FITM),
MEANS = fitMeasures(ColomBFMeans, FITM),
PMEANS = fitMeasures(ColomBFMeansS, FITM)), 3)
## CONFIGURAL METRIC PMETRIC SCALAR PSCALAR STRICT
## chisq 54.075 79.822 63.521 332.624 77.998 170.657
## df 34.000 41.000 40.000 44.000 41.000 49.000
## npar 54.000 47.000 48.000 44.000 47.000 39.000
## cfi 0.971 0.944 0.966 0.585 0.947 0.825
## rmsea 0.043 0.055 0.043 0.144 0.054 0.089
## rmsea.ci.lower 0.019 0.037 0.021 0.130 0.035 0.074
## rmsea.ci.upper 0.064 0.073 0.063 0.159 0.071 0.103
## aic 28233.381 28245.129 28230.828 28491.930 28243.304 28319.964
## bic 28473.450 28454.078 28444.222 28687.542 28452.253 28493.347
## PSTRICT LVARS PLVARS MEANS PMEANS
## chisq 80.262 91.051 79.646 213.116 79.592
## df 44.000 47.000 46.000 50.000 47.000
## npar 44.000 41.000 42.000 38.000 41.000
## cfi 0.948 0.937 0.952 0.765 0.953
## rmsea 0.051 0.055 0.048 0.102 0.047
## rmsea.ci.lower 0.033 0.038 0.030 0.088 0.028
## rmsea.ci.upper 0.069 0.071 0.066 0.116 0.064
## aic 28239.569 28244.358 28234.952 28360.423 28232.898
## bic 28435.180 28426.632 28421.672 28529.360 28415.173
summary(ColomBFMeansS, stand = T, fit = T)
## lavaan 0.6.16 ended normally after 82 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 58
## Number of equality constraints 17
##
## Number of observations per group:
## Group 1 310
## Group 2 320
##
## Model Test User Model:
##
## Test statistic 79.592
## Degrees of freedom 47
## P-value (Chi-square) 0.002
## Test statistic for each group:
## Group 1 40.953
## Group 2 38.638
##
## Model Test Baseline Model:
##
## Test statistic 750.954
## Degrees of freedom 56
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.953
## Tucker-Lewis Index (TLI) 0.944
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -14075.449
## Loglikelihood unrestricted model (H1) -14035.653
##
## Akaike (AIC) 28232.898
## Bayesian (BIC) 28415.173
## Sample-size adjusted Bayesian (SABIC) 28285.003
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.047
## 90 Percent confidence interval - lower 0.028
## 90 Percent confidence interval - upper 0.064
## P-value H_0: RMSEA <= 0.050 0.592
## P-value H_0: RMSEA >= 0.080 0.001
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.049
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
##
## Group 1 [Group 1]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.643 0.283 9.325 0.000 3.699 0.574
## VCOMP (.p2.) 1.410 0.152 9.261 0.000 1.974 0.520
## VERM (.p3.) 0.840 0.097 8.664 0.000 1.176 0.533
## Spatial =~
## ABS (.p4.) 0.883 0.829 1.066 0.286 4.201 0.627
## MENR (.p5.) 0.465 0.432 1.077 0.282 2.211 0.458
## IDFI (.p6.) 0.206 0.192 1.072 0.284 0.979 0.375
## Quantitative =~
## QR 2.259 0.685 3.298 0.001 5.528 0.856
## ROTC 1.562 0.434 3.599 0.000 3.823 0.507
## g =~
## Verbal (.p9.) 0.979 0.139 7.065 0.000 0.700 0.700
## Spatial (.10.) 4.651 4.502 1.033 0.302 0.978 0.978
## Quntttv (.11.) 2.234 0.724 3.086 0.002 0.913 0.913
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Spatial 0.000 0.000 0.000
## .VOC (.25.) 27.678 0.341 81.165 0.000 27.678 4.295
## .VCOMP (.26.) 15.520 0.194 79.987 0.000 15.520 4.087
## .VERM 14.498 0.125 115.779 0.000 14.498 6.576
## .ABS 36.872 0.380 96.940 0.000 36.872 5.506
## .MENR (.29.) 9.831 0.252 38.991 0.000 9.831 2.035
## .IDFI (.30.) 14.275 0.126 113.066 0.000 14.275 5.476
## .QR 20.791 0.367 56.688 0.000 20.791 3.220
## .ROTC (.32.) 19.886 0.428 46.412 0.000 19.886 2.636
## .Verbal 0.000 0.000 0.000
## .Quntttv 0.000 0.000 0.000
## g 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Verbal 1.000 0.510 0.510
## .Spatial 1.000 0.044 0.044
## .Quntttv 1.000 0.167 0.167
## .VOC (.16.) 27.842 2.140 13.010 0.000 27.842 0.670
## .VCOMP 10.519 1.019 10.323 0.000 10.519 0.730
## .VERM (.18.) 3.479 0.252 13.780 0.000 3.479 0.716
## .ABS 27.204 2.832 9.605 0.000 27.204 0.607
## .MENR 18.447 1.615 11.421 0.000 18.447 0.791
## .IDFI 5.838 0.494 11.816 0.000 5.838 0.859
## .QR (.22.) 11.136 3.134 3.553 0.000 11.136 0.267
## .ROTC 42.296 3.799 11.133 0.000 42.296 0.743
## g 1.000 1.000 1.000
##
##
## Group 2 [Group 2]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.643 0.283 9.325 0.000 3.239 0.523
## VCOMP (.p2.) 1.410 0.152 9.261 0.000 1.728 0.557
## VERM (.p3.) 0.840 0.097 8.664 0.000 1.029 0.483
## Spatial =~
## ABS (.p4.) 0.883 0.829 1.066 0.286 3.099 0.693
## MENR (.p5.) 0.465 0.432 1.077 0.282 1.631 0.455
## IDFI (.p6.) 0.206 0.192 1.072 0.284 0.722 0.324
## Quantitative =~
## QR 3.045 0.768 3.963 0.000 5.784 0.866
## ROTC 1.048 0.260 4.022 0.000 1.991 0.405
## g =~
## Verbal (.p9.) 0.979 0.139 7.065 0.000 0.578 0.578
## Spatial (.10.) 4.651 4.502 1.033 0.302 0.959 0.959
## Quntttv (.11.) 2.234 0.724 3.086 0.002 0.850 0.850
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Spatial 0.000 0.000 0.000
## .VOC (.25.) 27.678 0.341 81.165 0.000 27.678 4.471
## .VCOMP (.26.) 15.520 0.194 79.987 0.000 15.520 5.002
## .VERM 13.149 0.178 73.993 0.000 13.149 6.172
## .ABS 43.037 0.605 71.158 0.000 43.037 9.629
## .MENR (.29.) 9.831 0.252 38.991 0.000 9.831 2.742
## .IDFI (.30.) 14.275 0.126 113.066 0.000 14.275 6.406
## .QR 34.623 2.550 13.576 0.000 34.623 5.185
## .ROTC (.32.) 19.886 0.428 46.412 0.000 19.886 4.047
## .Verbal 1.452 0.236 6.150 0.000 1.185 1.185
## .Quntttv -2.774 0.885 -3.136 0.002 -1.460 -1.460
## g -0.617 0.147 -4.192 0.000 -0.854 -0.854
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Verbal 1.000 0.666 0.666
## .Spatial 1.000 0.081 0.081
## .Quntttv 1.000 0.277 0.277
## .VOC (.16.) 27.842 2.140 13.010 0.000 27.842 0.726
## .VCOMP 6.639 0.706 9.408 0.000 6.639 0.690
## .VERM (.18.) 3.479 0.252 13.780 0.000 3.479 0.767
## .ABS 10.375 1.426 7.274 0.000 10.375 0.519
## .MENR 10.191 0.890 11.450 0.000 10.191 0.793
## .IDFI 4.444 0.366 12.144 0.000 4.444 0.895
## .QR (.22.) 11.136 3.134 3.553 0.000 11.136 0.250
## .ROTC 20.179 1.696 11.898 0.000 20.179 0.836
## g 0.523 0.100 5.235 0.000 1.000 1.000
If the model is to be believed, the Flynn effect co-occurred with a decline in g. In Hedge’s g terms, g in the later cohort was 0.709 g lower than the first one. But, they had 1.452 g higher residualized verbal ability and 2.774 g lower residualized quantitative ability, and they were equal in residualized spatial ability.
The later group’s intercept for vocabulary was lower, as was their intercept for verbal meaning, but their abstract reasoning intercept was much higher. Additionally, their quantitative reasoning intercept was extremely elevated.
# 2022 for reference
#Parameters for F1, Verbal: VOC, VCOMP, VERM
Vp = 3; Vl1 = c(0, 0, 0); Vl2 = c(0, 0, 0)
Vi1 = c(0, 0, 14.498); Vi2 = c(0, 0, 13.149)
Vsd = c(5.95, 3.09, 2.15); Vfm = 1.452; Vfsd = 1
#Parameters for F2, Spatial: ABS, MENR, IDFI
Sp = 3; Sl1 = c(0, 0, 0); Sl2 = c(0, 0, 0)
Si1 = c(36.872, 0, 0); Si2 = c(43.037, 0, 0)
Ssd = c(4.37, 3.59, 2.26); Sfm = 0; Sfsd = 1
#Parameters for F3, Quantitative: QR, ROTC
Qp = 2; Ql1 = c(2.259, 1.562); Ql2 = c(3.045, 1.048)
Qi1 = c(20.791, 0); Qi2 = c(34.623, 0)
Qsd = c(6.67, 4.92); Qfm = -2.774; Qfsd = 1
VES <- SDI2.UDI2(Vp, Vl1, Vl2, Vi1, Vi2, Vsd, Vfm, Vfsd)
SES <- SDI2.UDI2(Sp, Sl1, Sl2, Si1, Si2, Ssd, Sfm, Sfsd)
QES <- SDI2.UDI2(Qp, Ql1, Ql2, Qi1, Qi2, Qsd, Qfm, Qfsd)
SUDI(VES$SDI2, VES$UDI2); SUDI(SES$SDI2, SES$UDI2); SUDI(QES$SDI2, QES$UDI2)
## SDI2
## [1,] 0.0000
## [2,] 0.0000
## [3,] 0.6273
## SDI2
## [1,] -1.4108
## [2,] 0.0000
## [3,] 0.0000
## SDI2
## [1,] -1.7283
## [2,] -0.2828
If these results are to be believed, the Flynn effect for verbal meanings was underestimated by 0.6273 d, while the Flynn effects for abstract reasoning, quantitative reasoning, and rote calculation were overestimated by 1.4108, 1.7283, and 0.2828 d. This brings their changes up to +5.0595, -11.712, -23.2245, and -14.592 points. Thus, in a model with additional group factors, the mean Flynn effect changed from -0.005 d or -0.075 points to -0.354 or -5.315 points. In other words, the Flynn effect was -0.171 points per year, or -1.71 points per decade in a model with multiple group factors and a higher-order g. That is effectively zero change.
If, however, model comparisons with zero degrees of freedom were allowed, the results would change, as the intercept for vocabulary would be freed and we would see an intercept of 28.009 in the first group and 26.241 in the later one along with a higher verbal mean gap of 1.797. This would translate to Flynn effects for vocabulary and verbal meanings being underestimated by 0.2969 and 0.7534 d, while the Flynn effects for abstract reasoning, quantitative reasoning, and rote calculation would have been overestimated by 1.4149, 1.7283, and 0.2809 d. This would bring their changes up to +8.2035, +6.9510, -11.7735, -23.2245, and -14.5635 points. Thus, in a model with additional group factors, the mean Flynn effect would change from -0.005 d or -0.075 points to -0.3017 or -4.526 points. In other words, the Flynn effect would be -0.146 points per year, or -1.46 points per decade in a model with multiple group factors and a higher-order g, if we permitted comparisons with zero degrees of freedom for the partial metric versus partial scalar comparison.
It is the case that this latter model is the acceptable one whose results should be presented, since higher-order factor models need to be tested for measurement invariance by testing them as a measurement model and then testing the higher-order constraints on top of them, not going through each phase as is done with the measurement model. The reason for zero degrees of freedom at the partial scalar model stage and apparently marginally significant poor fit is that the types of modeling were presented in line with standard concepts of MI testing, rather than technically correct ones, for which this analysis appears wrong because of the intercepts on the group factors. Here are model fits with this technicality noted, followed by the amounts of bias to fit the previous paragraph.
round(cbind(CONFIGURAL = fitMeasures(ColomBFConfig, FITM),
METRIC = fitMeasures(ColomBFMetric, FITM),
PMETRIC = fitMeasures(ColomBFMetricPartial, FITM),
SCALAR = fitMeasures(ColomBFScalar, FITM),
PSCALAR = fitMeasures(ColomBFScalarPartial, FITM),
STRICT = fitMeasures(ColomBFStrict, FITM),
PSTRICT = fitMeasures(ColomBFStrictPartial, FITM),
LVARS = fitMeasures(ColomBFLVs, FITM),
PLVARS = fitMeasures(ColomBFLVsGF, FITM),
MEANS = fitMeasures(ColomBFMeans, FITM),
PMEANS = fitMeasures(ColomBFMeansS, FITM)), 3)
## CONFIGURAL METRIC PMETRIC SCALAR PSCALAR STRICT
## chisq 54.075 79.822 63.521 332.624 72.345 415.165
## df 34.000 41.000 40.000 44.000 40.000 48.000
## npar 54.000 47.000 48.000 44.000 48.000 40.000
## cfi 0.971 0.944 0.966 0.585 0.953 0.472
## rmsea 0.043 0.055 0.043 0.144 0.051 0.156
## rmsea.ci.lower 0.019 0.037 0.021 0.130 0.031 0.142
## rmsea.ci.upper 0.064 0.073 0.063 0.159 0.069 0.170
## aic 28233.381 28245.129 28230.828 28491.930 28239.652 28566.472
## bic 28473.450 28454.078 28444.222 28687.542 28453.046 28744.300
## PSTRICT LVARS PLVARS MEANS PMEANS
## chisq 74.646 85.296 73.753 202.937 73.701
## df 43.000 46.000 45.000 49.000 46.000
## npar 45.000 42.000 43.000 39.000 42.000
## cfi 0.954 0.943 0.959 0.778 0.960
## rmsea 0.048 0.052 0.045 0.100 0.044
## rmsea.ci.lower 0.029 0.034 0.025 0.086 0.024
## rmsea.ci.upper 0.066 0.069 0.063 0.114 0.062
## aic 28235.953 28240.602 28231.060 28352.243 28229.007
## bic 28436.010 28427.323 28422.226 28525.626 28415.728
summary(ColomBFMeansS, stand = T, fit = T)
## lavaan 0.6.16 ended normally after 76 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 58
## Number of equality constraints 16
##
## Number of observations per group:
## Group 1 310
## Group 2 320
##
## Model Test User Model:
##
## Test statistic 73.701
## Degrees of freedom 46
## P-value (Chi-square) 0.006
## Test statistic for each group:
## Group 1 37.903
## Group 2 35.798
##
## Model Test Baseline Model:
##
## Test statistic 750.954
## Degrees of freedom 56
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.960
## Tucker-Lewis Index (TLI) 0.951
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -14072.504
## Loglikelihood unrestricted model (H1) -14035.653
##
## Akaike (AIC) 28229.007
## Bayesian (BIC) 28415.728
## Sample-size adjusted Bayesian (SABIC) 28282.382
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.044
## 90 Percent confidence interval - lower 0.024
## 90 Percent confidence interval - upper 0.062
## P-value H_0: RMSEA <= 0.050 0.697
## P-value H_0: RMSEA >= 0.080 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.046
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
##
## Group 1 [Group 1]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.839 0.307 9.255 0.000 3.979 0.611
## VCOMP (.p2.) 1.315 0.151 8.709 0.000 1.843 0.491
## VERM (.p3.) 0.829 0.096 8.650 0.000 1.162 0.528
## Spatial =~
## ABS (.p4.) 0.958 0.765 1.253 0.210 4.217 0.632
## MENR (.p5.) 0.503 0.396 1.268 0.205 2.212 0.458
## IDFI (.p6.) 0.223 0.176 1.261 0.207 0.979 0.376
## Quantitative =~
## QR 2.231 0.687 3.248 0.001 5.519 0.855
## ROTC 1.550 0.438 3.540 0.000 3.834 0.508
## g =~
## Verbal (.p9.) 0.982 0.139 7.087 0.000 0.701 0.701
## Spatial (.10.) 4.285 3.546 1.208 0.227 0.974 0.974
## Quntttv (.11.) 2.262 0.743 3.044 0.002 0.915 0.915
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Spatial 0.000 0.000 0.000
## .VOC 28.009 0.370 75.704 0.000 28.009 4.300
## .VCOMP (.26.) 15.296 0.213 71.745 0.000 15.296 4.075
## .VERM 14.500 0.125 115.850 0.000 14.500 6.580
## .ABS 36.881 0.379 97.321 0.000 36.881 5.527
## .MENR (.29.) 9.839 0.252 39.030 0.000 9.839 2.038
## .IDFI (.30.) 14.279 0.126 113.074 0.000 14.279 5.479
## .QR 20.800 0.367 56.745 0.000 20.800 3.223
## .ROTC (.32.) 19.900 0.429 46.426 0.000 19.900 2.637
## .Verbal 0.000 0.000 0.000
## .Quntttv 0.000 0.000 0.000
## g 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Verbal 1.000 0.509 0.509
## .Spatial 1.000 0.052 0.052
## .Quntttv 1.000 0.163 0.163
## .VOC (.16.) 26.600 2.252 11.812 0.000 26.600 0.627
## .VCOMP 10.693 1.007 10.616 0.000 10.693 0.759
## .VERM (.18.) 3.505 0.251 13.946 0.000 3.505 0.722
## .ABS 26.737 2.806 9.530 0.000 26.737 0.601
## .MENR 18.418 1.613 11.419 0.000 18.418 0.790
## .IDFI 5.833 0.494 11.814 0.000 5.833 0.859
## .QR (.22.) 11.189 3.113 3.595 0.000 11.189 0.269
## .ROTC 42.256 3.797 11.129 0.000 42.256 0.742
## g 1.000 1.000 1.000
##
##
## Group 2 [Group 2]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Verbal =~
## VOC (.p1.) 2.839 0.307 9.255 0.000 3.478 0.559
## VCOMP (.p2.) 1.315 0.151 8.709 0.000 1.611 0.525
## VERM (.p3.) 0.829 0.096 8.650 0.000 1.016 0.477
## Spatial =~
## ABS (.p4.) 0.958 0.765 1.253 0.210 3.112 0.696
## MENR (.p5.) 0.503 0.396 1.268 0.205 1.632 0.455
## IDFI (.p6.) 0.223 0.176 1.261 0.207 0.722 0.324
## Quantitative =~
## QR 3.021 0.774 3.902 0.000 5.779 0.865
## ROTC 1.041 0.262 3.966 0.000 1.991 0.405
## g =~
## Verbal (.p9.) 0.982 0.139 7.087 0.000 0.578 0.578
## Spatial (.10.) 4.285 3.546 1.208 0.227 0.951 0.951
## Quntttv (.11.) 2.262 0.743 3.044 0.002 0.853 0.853
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Spatial 0.000 0.000 0.000
## .VOC 26.241 0.770 34.099 0.000 26.241 4.218
## .VCOMP (.26.) 15.296 0.213 71.745 0.000 15.296 4.988
## .VERM 12.879 0.236 54.477 0.000 12.879 6.046
## .ABS 43.064 0.607 70.919 0.000 43.064 9.628
## .MENR (.29.) 9.839 0.252 39.030 0.000 9.839 2.744
## .IDFI (.30.) 14.279 0.126 113.074 0.000 14.279 6.408
## .QR 34.654 2.553 13.572 0.000 34.654 5.190
## .ROTC (.32.) 19.900 0.429 46.426 0.000 19.900 4.051
## .Verbal 1.797 0.301 5.964 0.000 1.466 1.466
## .Quntttv -2.784 0.896 -3.106 0.002 -1.455 -1.455
## g -0.625 0.148 -4.218 0.000 -0.866 -0.866
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Verbal 1.000 0.666 0.666
## .Spatial 1.000 0.095 0.095
## .Quntttv 1.000 0.273 0.273
## .VOC (.16.) 26.600 2.252 11.812 0.000 26.600 0.687
## .VCOMP 6.807 0.693 9.825 0.000 6.807 0.724
## .VERM (.18.) 3.505 0.251 13.946 0.000 3.505 0.772
## .ABS 10.321 1.431 7.210 0.000 10.321 0.516
## .MENR 10.194 0.891 11.446 0.000 10.194 0.793
## .IDFI 4.443 0.366 12.141 0.000 4.443 0.895
## .QR (.22.) 11.189 3.113 3.595 0.000 11.189 0.251
## .ROTC 20.173 1.696 11.895 0.000 20.173 0.836
## g 0.520 0.100 5.219 0.000 1.000 1.000
# 2022 for reference
#Parameters for F1, Verbal: VOC, VCOMP, VERM
Vp = 3; Vl1 = c(0, 0, 0); Vl2 = c(0, 0, 0)
Vi1 = c(28.009, 0, 14.500); Vi2 = c(26.241, 0, 12.879)
Vsd = c(5.95, 3.09, 2.15); Vfm = 1.797; Vfsd = 1
#Parameters for F2, Spatial: ABS, MENR, IDFI
Sp = 3; Sl1 = c(0, 0, 0); Sl2 = c(0, 0, 0)
Si1 = c(36.881, 0, 0); Si2 = c(43.064, 0, 0)
Ssd = c(4.37, 3.59, 2.26); Sfm = 0; Sfsd = 1
#Parameters for F3, Quantitative: QR, ROTC
Qp = 2; Ql1 = c(2.231, 1.550); Ql2 = c(3.021, 1.041)
Qi1 = c(20.800, 0); Qi2 = c(34.654, 0)
Qsd = c(6.67, 4.92); Qfm = -2.784; Qfsd = 1
VES <- SDI2.UDI2(Vp, Vl1, Vl2, Vi1, Vi2, Vsd, Vfm, Vfsd)
SES <- SDI2.UDI2(Sp, Sl1, Sl2, Si1, Si2, Ssd, Sfm, Sfsd)
QES <- SDI2.UDI2(Qp, Ql1, Ql2, Qi1, Qi2, Qsd, Qfm, Qfsd)
SUDI(VES$SDI2, VES$UDI2); SUDI(SES$SDI2, SES$UDI2); SUDI(QES$SDI2, QES$UDI2)
## SDI2
## [1,] 0.2969
## [2,] 0.0000
## [3,] 0.7534
## SDI2
## [1,] -1.4149
## [2,] 0.0000
## [3,] 0.0000
## SDI2
## [1,] -1.7283
## [2,] -0.2809
sessionInfo()
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=English_United States.utf8
## [2] LC_CTYPE=English_United States.utf8
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.utf8
##
## time zone: America/Chicago
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] lavaan_0.6-16 pacman_0.5.1
##
## loaded via a namespace (and not attached):
## [1] digest_0.6.33 R6_2.5.1 fastmap_1.1.1 xfun_0.39
## [5] cachem_1.0.8 parallel_4.3.1 knitr_1.43 htmltools_0.5.5
## [9] pbivnorm_0.6.0 rmarkdown_2.23 stats4_4.3.1 cli_3.6.1
## [13] sass_0.4.7 jquerylib_0.1.4 mnormt_2.1.1 compiler_4.3.1
## [17] rstudioapi_0.15.0 tools_4.3.1 evaluate_0.21 bslib_0.5.0
## [21] yaml_2.3.7 quadprog_1.5-8 rlang_1.1.1 jsonlite_1.8.7
## [25] MASS_7.3-60