Setup

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")

Rationale

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.

Analysis

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.

Discussion

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.

References

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

Postscript: An Alternative Model

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