Setup

library(pacman); p_load(lavaan, psych)

lowerWhite <- '
1                                               
0.29    1                                           
0.22    0.36    1                                       
0.3 0.47    0.45    1                                   
0.34    0.4 0.21    0.36    1                               
0.39    0.37    0.31    0.42    0.38    1                           
0.4 0.3 0.24    0.32    0.32    0.39    1                       
0.15    0.18    0.17    0.22    0.21    0.18    0.18    1                   
0.39    0.5 0.37    0.54    0.49    0.45    0.35    0.22    1               
0.38    0.22    0.23    0.28    0.23    0.31    0.31    0.17    0.31    1           
0.46    0.45    0.23    0.38    0.49    0.4 0.35    0.34    0.49    0.3 1       
0.41    0.45    0.2 0.41    0.49    0.38    0.3 0.27    0.52    0.25    0.84    1   
0.44    0.51    0.26    0.38    0.54    0.44    0.36    0.27    0.6 0.31    0.69    0.7 1'

lowerBlack <- '
1                                               
0.34    1                                           
0.22    0.4 1                                       
0.33    0.56    0.48    1                                   
0.36    0.41    0.24    0.37    1                               
0.37    0.44    0.31    0.46    0.36    1                           
0.45    0.35    0.24    0.36    0.29    0.4 1                       
0.16    0.14    0.08    0.15    0.17    0.22    0.17    1                   
0.37    0.55    0.4 0.54    0.42    0.48    0.37    0.17    1               
0.4 0.32    0.23    0.34    0.26    0.32    0.38    0.14    0.33    1           
0.42    0.46    0.24    0.43    0.46    0.39    0.33    0.23    0.47    0.33    1       
0.4 0.47    0.24    0.43    0.46    0.39    0.33    0.19    0.49    0.32    0.91    1   
0.46    0.47    0.26    0.42    0.5 0.42    0.36    0.23    0.53    0.31    0.71    0.7 1'

Names = list("BenderGestalt", "Information", "Comprehension", "Vocabulary", "DigitSpan", "PictureArrangement", "BlockDesign", "Coding", "ITPA", "DrawAMan", "Spelling", "Reading", "Arithmetic")

White.cor = getCov(lowerWhite, names = Names)
Black.cor = getCov(lowerBlack, names = Names)

WhiteSDs <- c(3.3, 3, 2.92, 2.88, 2.87, 3.12, 2.7, 2.78, 2.82, 13.55, 6.1, 12.43, 3.5)
BlackSDs <- c(3.68, 2.64, 2.56, 2.73, 2.94, 2.75, 2.44, 2.89, 3.38, 13.68, 5.34, 10.07, 4.1)

White.cov = lavaan::cor2cov(White.cor, WhiteSDs)
Black.cov = lavaan::cor2cov(Black.cor, BlackSDs)

WhiteMeans <- c(23.9, 9.8, 9.5, 10.08, 10.52, 10.64, 10.46, 10.53, 19.3, 96.23, 27.15, 40.24, 21.45)
BlackMeans <- c(21.5, 8.73, 8.36, 7.7, 9.19, 8.52, 8.74, 10.04, 16.36, 94.77, 22.91, 31.81, 19.36)

WhiteN <- 1940
BlackN <- 1460

GCovs <- list(White.cov, Black.cov)
GMeans <- list(WhiteMeans, BlackMeans)
GNs <- list(WhiteN, BlackN)

FITM <- c("chisq", "df", "nPar", "cfi", "rmsea", "rmsea.ci.lower", "rmsea.ci.upper", "aic", "bic")

SDI2.UDI2 = function(p, loading1, loading2, intercept1, intercept2, stdev2, #From Gunn, Grimm & Edwards (2019)
                     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)}

Rationale

Nichols (1970) presented probably the first meaningful examination of Spearman’s hypothesis. In his study, he used a rarely accessed, large dataset, the Collaborative Study of Cerebral Palsy, Mental Retardation, and Other Neurological and Sensory Disorders of Infancy and Childhood, to assess the effects of genes and environments on intelligence test performance in samples of American Blacks and Whites. Jensen never tested Spearman’s hypothesis in this data as far as I know, so I will assess it here so the data isn’t basically useless.

Analysis

Exploratory

Exploratory analyses were conducted with the White group, since it was the larger one, and thus had more precise estimates. Fit confirmation was assessed in the Black group, and if found adequate, multigroup modeling would commence. \(\chi^2\) was the preferred test of fit, followed by AIC and then BIC, but for the higher-order model, BIC took precedence, followed by AIC and \(\chi^2\), because this is generally how they perform for this type of model.

fa.parallel(White.cor, n.obs = WhiteN)

## Parallel analysis suggests that the number of factors =  4  and the number of components =  2
print(fa(White.cor, n.obs = WhiteN, nfactors = 4), cut = .3, sort = T)
## Loading required namespace: GPArotation
## Factor Analysis using method =  minres
## Call: fa(r = White.cor, nfactors = 4, n.obs = WhiteN)
## Standardized loadings (pattern matrix) based upon correlation matrix
##                    item   MR1   MR2   MR3   MR4   h2     u2 com
## Spelling             11  1.02                   1.00 0.0046 1.0
## Reading              12  0.73                   0.77 0.2345 1.2
## Coding                8                         0.13 0.8681 1.8
## Vocabulary            4        0.74             0.59 0.4147 1.0
## Comprehension         3        0.64             0.38 0.6211 1.1
## Information           2        0.46             0.45 0.5485 1.7
## ITPA                  9        0.42        0.36 0.61 0.3948 2.2
## BenderGestalt         1              0.69       0.48 0.5217 1.1
## BlockDesign           7              0.56       0.36 0.6436 1.1
## DrawAMan             10              0.55       0.30 0.6975 1.1
## PictureArrangement    6              0.42       0.41 0.5917 1.8
## Arithmetic           13  0.32              0.47 0.73 0.2736 2.2
## DigitSpan             5                    0.37 0.43 0.5744 2.0
## 
##                        MR1  MR2  MR3  MR4
## SS loadings           2.11 1.82 1.69 1.00
## Proportion Var        0.16 0.14 0.13 0.08
## Cumulative Var        0.16 0.30 0.43 0.51
## Proportion Explained  0.32 0.27 0.25 0.15
## Cumulative Proportion 0.32 0.59 0.85 1.00
## 
##  With factor correlations of 
##      MR1  MR2  MR3  MR4
## MR1 1.00 0.46 0.60 0.55
## MR2 0.46 1.00 0.60 0.43
## MR3 0.60 0.60 1.00 0.43
## MR4 0.55 0.43 0.43 1.00
## 
## Mean item complexity =  1.5
## Test of the hypothesis that 4 factors are sufficient.
## 
## The degrees of freedom for the null model are  78  and the objective function was  5.44 with Chi Square of  10515.96
## The degrees of freedom for the model are 32  and the objective function was  0.06 
## 
## The root mean square of the residuals (RMSR) is  0.01 
## The df corrected root mean square of the residuals is  0.02 
## 
## The harmonic number of observations is  1940 with the empirical chi square  47.17  with prob <  0.041 
## The total number of observations was  1940  with Likelihood Chi Square =  113.65  with prob <  4.5e-11 
## 
## Tucker Lewis Index of factoring reliability =  0.981
## RMSEA index =  0.036  and the 90 % confidence intervals are  0.029 0.044
## BIC =  -128.6
## Fit based upon off diagonal values = 1
## Measures of factor score adequacy             
##                                                    MR1  MR2  MR3  MR4
## Correlation of (regression) scores with factors   1.00 0.89 0.88 0.83
## Multiple R square of scores with factors          1.00 0.78 0.77 0.69
## Minimum correlation of possible factor scores     0.99 0.57 0.54 0.39

To avoid cross-loadings, only the highest loadings for an item will be used.

Confirmatory Validation

NicholsModel <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan'

NicholsInitFit <- cfa(NicholsModel, sample.cov = Black.cov, sample.mean = BlackMeans, sample.nobs = BlackN, std.lv = T, orthogonal = F, meanstructure = T)

summary(NicholsInitFit, stand = T, fit = T)
## lavaan 0.6-12 ended normally after 35 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        45
## 
##   Number of observations                          1460
## 
## Model Test User Model:
##                                                       
##   Test statistic                               325.443
##   Degrees of freedom                                59
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                              8761.378
##   Degrees of freedom                                78
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.969
##   Tucker-Lewis Index (TLI)                       0.959
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)             -48243.624
##   Loglikelihood unrestricted model (H1)     -48080.902
##                                                       
##   Akaike (AIC)                               96577.247
##   Bayesian (BIC)                             96815.126
##   Sample-size adjusted Bayesian (BIC)        96672.175
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.056
##   90 Percent confidence interval - lower         0.050
##   90 Percent confidence interval - upper         0.062
##   P-value RMSEA <= 0.05                          0.056
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.038
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Achievement =~                                                        
##     Spelling          5.127    0.106   48.519    0.000    5.127    0.960
##     Reading           9.535    0.201   47.370    0.000    9.535    0.947
##     Coding            0.664    0.076    8.711    0.000    0.664    0.230
##   Verbal =~                                                             
##     Vocabulary        2.029    0.066   30.922    0.000    2.029    0.744
##     Comprehension     1.380    0.067   20.637    0.000    1.380    0.539
##     Information       1.959    0.063   30.861    0.000    1.959    0.742
##     ITPA              2.563    0.081   31.762    0.000    2.563    0.758
##   Spatial =~                                                            
##     BenderGestalt     2.376    0.096   24.813    0.000    2.376    0.646
##     BlockDesign       1.523    0.064   23.813    0.000    1.523    0.624
##     DrawAMan          7.554    0.367   20.592    0.000    7.554    0.552
##     PicturArrngmnt    1.805    0.071   25.317    0.000    1.805    0.657
##   STM =~                                                                
##     Arithmetic        3.428    0.100   34.210    0.000    3.428    0.836
##     DigitSpan         1.757    0.074   23.619    0.000    1.757    0.598
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Achievement ~~                                                        
##     Verbal            0.625    0.020   31.531    0.000    0.625    0.625
##     Spatial           0.619    0.022   27.986    0.000    0.619    0.619
##     STM               0.870    0.016   55.641    0.000    0.870    0.870
##   Verbal ~~                                                             
##     Spatial           0.804    0.019   42.143    0.000    0.804    0.804
##     STM               0.768    0.021   36.245    0.000    0.768    0.768
##   Spatial ~~                                                            
##     STM               0.775    0.023   33.189    0.000    0.775    0.775
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Spelling         22.910    0.140  163.987    0.000   22.910    4.292
##    .Reading          31.810    0.263  120.742    0.000   31.810    3.160
##    .Coding           10.040    0.076  132.789    0.000   10.040    3.475
##    .Vocabulary        7.700    0.071  107.809    0.000    7.700    2.821
##    .Comprehension     8.360    0.067  124.822    0.000    8.360    3.267
##    .Information       8.730    0.069  126.397    0.000    8.730    3.308
##    .ITPA             16.360    0.088  185.009    0.000   16.360    4.842
##    .BenderGestalt    21.500    0.096  223.314    0.000   21.500    5.844
##    .BlockDesign       8.740    0.064  136.914    0.000    8.740    3.583
##    .DrawAMan         94.770    0.358  264.795    0.000   94.770    6.930
##    .PicturArrngmnt    8.520    0.072  118.422    0.000    8.520    3.099
##    .Arithmetic       19.360    0.107  180.487    0.000   19.360    4.724
##    .DigitSpan         9.190    0.077  119.479    0.000    9.190    3.127
##     Achievement       0.000                               0.000    0.000
##     Verbal            0.000                               0.000    0.000
##     Spatial           0.000                               0.000    0.000
##     STM               0.000                               0.000    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Spelling          2.212    0.274    8.082    0.000    2.212    0.078
##    .Reading          10.418    0.982   10.605    0.000   10.418    0.103
##    .Coding            7.905    0.293   26.950    0.000    7.905    0.947
##    .Vocabulary        3.330    0.159   20.929    0.000    3.330    0.447
##    .Comprehension     4.646    0.185   25.046    0.000    4.646    0.709
##    .Information       3.126    0.149   20.970    0.000    3.126    0.449
##    .ITPA              4.850    0.238   20.335    0.000    4.850    0.425
##    .BenderGestalt     7.889    0.356   22.174    0.000    7.889    0.583
##    .BlockDesign       3.631    0.160   22.717    0.000    3.631    0.610
##    .DrawAMan        129.946    5.392   24.099    0.000  129.946    0.695
##    .PicturArrngmnt    4.300    0.197   21.872    0.000    4.300    0.569
##    .Arithmetic        5.045    0.394   12.800    0.000    5.045    0.300
##    .DigitSpan         5.551    0.225   24.698    0.000    5.551    0.643
##     Achievement       1.000                               1.000    1.000
##     Verbal            1.000                               1.000    1.000
##     Spatial           1.000                               1.000    1.000
##     STM               1.000                               1.000    1.000

Looks great.

Multigroup

Correlated Group Factors - the Lower-Order

The difference between the higher-order and correlated group factors models could not be tested due to convergence issues, but unidimensionality is the norm, so it was trusted to be the case here. With that in mind, the lower-order model has to be tested for MI first, and then the higher-order one can be tested and subsequent Spearman’s hypothesis models are then testable.

NicholsModelG <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM'

NicholsConfiguralCFG <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = T)
NicholsMetricCFG     <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = "loadings")
NicholsPartialMetricCFG <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = "loadings", 
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA")) #p = .042, but AIC/BIC better, CFI/RMSEA not worse.
NicholsScalarCFG     <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts"), 
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA"))
NicholsPartialScalarCFG <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1"))
NicholsStrictCFG     <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals"), 
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1"))
NicholsPartialStrictCFG <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))
NicholsLVCFG         <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))
NicholsPartialLVCFG <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM"))
NicholsLCCFG         <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals","lv.variances", "lv.covariances"), 
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM"))
NicholsPartialLCCFG <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))
NicholsMeanCFG       <- cfa(NicholsModel, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances", "means"), 
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

round(cbind(CONFIGURAL        = fitMeasures(NicholsConfiguralCFG, FITM),
            METRIC            = fitMeasures(NicholsMetricCFG, FITM),
            "PARTIAL METRIC"  = fitMeasures(NicholsPartialMetricCFG, FITM),
            SCALAR            = fitMeasures(NicholsScalarCFG, FITM),
            "PARTIAL SCALAR"  = fitMeasures(NicholsPartialScalarCFG, FITM),
            STRICT            = fitMeasures(NicholsStrictCFG, FITM),
            "PARTIAL STRICT"  = fitMeasures(NicholsPartialStrictCFG, FITM),
            LVARS             = fitMeasures(NicholsLVCFG, FITM),
            "PARTIAL LVARS"   = fitMeasures(NicholsPartialLVCFG, FITM),
            LCOVARS           = fitMeasures(NicholsLCCFG, FITM),
            "PARTIAL LCOVARS" = fitMeasures(NicholsPartialLCCFG, FITM),
            MEANS             = fitMeasures(NicholsMeanCFG, FITM)), 3)
##                CONFIGURAL     METRIC PARTIAL METRIC     SCALAR PARTIAL SCALAR
## chisq             872.098    924.799        883.618   1237.013        895.737
## df                118.000    127.000        123.000    132.000        128.000
## npar               90.000     81.000         85.000     76.000         80.000
## cfi                 0.961      0.958          0.960      0.942          0.960
## rmsea               0.061      0.061          0.060      0.070          0.059
## rmsea.ci.lower      0.058      0.057          0.057      0.067          0.056
## rmsea.ci.upper      0.065      0.064          0.064      0.074          0.063
## aic            227496.358 227531.058     227497.878 227833.272     227499.996
## bic            228048.196 228027.712     228019.058 228299.269     227990.519
##                    STRICT PARTIAL STRICT      LVARS PARTIAL LVARS    LCOVARS
## chisq            1463.931        902.047    953.537       902.802    949.613
## df                141.000        130.000    134.000       132.000    138.000
## npar               67.000         78.000     74.000        76.000     70.000
## cfi                 0.931          0.960      0.957         0.960      0.958
## rmsea               0.074          0.059      0.060         0.059      0.059
## rmsea.ci.lower      0.071          0.055      0.056         0.055      0.055
## rmsea.ci.upper      0.078          0.063      0.064         0.062      0.062
## aic            228042.190     227502.307 227545.796    227499.062 227533.872
## bic            228453.003     227980.566 227999.529    227965.058 227963.079
##                PARTIAL LCOVARS      MEANS
## chisq                  905.179   1803.553
## df                     135.000    139.000
## npar                    73.000     69.000
## cfi                      0.960      0.913
## rmsea                    0.058      0.084
## rmsea.ci.lower           0.054      0.080
## rmsea.ci.upper           0.062      0.087
## aic                 227495.439 228385.813
## bic                 227943.040 228808.888
NicholsModelAch <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1'

NicholsModelAchVer <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1'

NicholsModelAchSpa <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1
Spatial ~ c(0,0)*1'

NicholsModelAchSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelAchVerSpa <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1'

NicholsModelAchVerSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelAchSpaSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Achievement ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelVer <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Verbal ~ c(0,0)*1'

NicholsModelVerSpa <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1'

NicholsModelVerSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Verbal ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelVerSpaSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelSpa <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Spatial ~ c(0,0)*1'

NicholsModelSpaSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelSTM <- '
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

STM ~ c(0,0)*1'

NicholsCFGAch <- cfa(NicholsModelAch, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGVer<- cfa(NicholsModelVer, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGSpa <- cfa(NicholsModelSpa, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGSTM <- cfa(NicholsModelSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGAchVer <- cfa(NicholsModelAchVer, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGAchSpa <- cfa(NicholsModelAchSpa, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGAchSTM <- cfa(NicholsModelAchSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGAchVerSpa <- cfa(NicholsModelAchVerSpa, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGAchVerSTM <- cfa(NicholsModelAchVerSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGAchSpaSTM <- cfa(NicholsModelAchSpaSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGVerSpa <- cfa(NicholsModelVerSpa, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGVerSTM <- cfa(NicholsModelVerSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGVerSpaSTM <- cfa(NicholsModelVerSpaSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

NicholsCFGSpaSTM <- cfa(NicholsModelSpaSTM, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "lv.covariances"),
                            group.partial = c(
                              "STM =~ DigitSpan", "Spatial =~ PictureArrangement", "Achievement =~ Reading", "Verbal =~ ITPA",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding",
                              "Achievement ~~ Achievement", "STM ~~ STM",
                              "Spatial ~~ STM", "Achievement ~~ Verbal", "Achievement ~~ Spatial"))

round(cbind("PARTIAL LCOVARS" = fitMeasures(NicholsPartialLCCFG, FITM),
            MEANS             = fitMeasures(NicholsMeanCFG, FITM),
            ACHIEVEMENT = fitMeasures(NicholsCFGAch, FITM),
            ACHVER      = fitMeasures(NicholsCFGAchVer, FITM),
            ACHSPA      = fitMeasures(NicholsCFGAchSpa, FITM),
            ACHSTM      = fitMeasures(NicholsCFGAchSTM, FITM),
            ACHVERSPA   = fitMeasures(NicholsCFGAchVerSpa, FITM),
            ACHVERSTM   = fitMeasures(NicholsCFGAchVerSTM, FITM),
            ACHSPASTM   = fitMeasures(NicholsCFGAchSpaSTM, FITM),
            VERBAL      = fitMeasures(NicholsCFGVer, FITM),
            VERSPA      = fitMeasures(NicholsCFGVerSpa, FITM),
            VERSTM      = fitMeasures(NicholsCFGVerSTM, FITM),
            VERSPASTM   = fitMeasures(NicholsCFGVerSpaSTM, FITM),
            SPATIAL     = fitMeasures(NicholsCFGSpa, FITM),
            SPASTM      = fitMeasures(NicholsCFGSpaSTM, FITM),
            STM         = fitMeasures(NicholsCFGSTM, FITM)), 3)
##                PARTIAL LCOVARS      MEANS ACHIEVEMENT     ACHVER     ACHSPA
## chisq                  905.179   1803.553    1366.120   1721.816   1609.235
## df                     135.000    139.000     136.000    137.000    137.000
## npar                    73.000     69.000      72.000     71.000     71.000
## cfi                      0.960      0.913       0.936      0.917      0.923
## rmsea                    0.058      0.084       0.073      0.082      0.080
## rmsea.ci.lower           0.054      0.080       0.069      0.079      0.076
## rmsea.ci.upper           0.062      0.087       0.076      0.086      0.083
## aic                 227495.439 228385.813  227954.379 228308.075 228195.494
## bic                 227943.040 228808.888  228395.849 228743.414 228630.833
##                    ACHSTM  ACHVERSPA  ACHVERSTM  ACHSPASTM     VERBAL
## chisq            1369.108   1795.380   1725.402   1610.392   1667.359
## df                137.000    138.000    138.000    138.000    136.000
## npar               71.000     70.000     70.000     70.000     72.000
## cfi                 0.936      0.913      0.917      0.923      0.920
## rmsea               0.073      0.084      0.082      0.079      0.081
## rmsea.ci.lower      0.069      0.081      0.079      0.076      0.078
## rmsea.ci.upper      0.076      0.088      0.086      0.083      0.085
## aic            227955.368 228379.640 228309.661 228194.652 228255.619
## bic            228390.706 228808.847 228738.868 228623.859 228697.089
##                    VERSPA     VERSTM  VERSPASTM    SPATIAL     SPASTM
## chisq            1776.704   1668.852   1778.023   1515.309   1524.558
## df                137.000    137.000    138.000    136.000    137.000
## npar               71.000     71.000     70.000     72.000     71.000
## cfi                 0.914      0.920      0.914      0.928      0.928
## rmsea               0.084      0.081      0.084      0.077      0.077
## rmsea.ci.lower      0.080      0.078      0.080      0.074      0.074
## rmsea.ci.upper      0.087      0.085      0.087      0.081      0.081
## aic            228362.963 228255.112 228362.282 228103.568 228110.818
## bic            228798.302 228690.450 228791.490 228545.039 228546.157
##                       STM
## chisq            1074.501
## df                136.000
## npar               72.000
## cfi                 0.951
## rmsea               0.064
## rmsea.ci.lower      0.060
## rmsea.ci.upper      0.067
## aic            227662.760
## bic            228104.230

Invariance was partially attainable. There were four biased loadings (31%), four biased intercepts (31%), eleven biased residuals (85%), two biased latent variances (50%), and three biased latent covariances (50%). All means differed. Lets calculate the bias in the maximally-constrained model.

summary(NicholsPartialLCCFG, stand = T, fit = T)
## lavaan 0.6-12 ended normally after 238 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        94
##   Number of equality constraints                    21
## 
##   Number of observations per group:                   
##     Group 1                                       1940
##     Group 2                                       1460
## 
## Model Test User Model:
##                                                       
##   Test statistic                               905.179
##   Degrees of freedom                               135
##   P-value (Chi-square)                           0.000
##   Test statistic for each group:
##     Group 1                                    561.366
##     Group 2                                    343.814
## 
## Model Test Baseline Model:
## 
##   Test statistic                             19310.872
##   Degrees of freedom                               156
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.960
##   Tucker-Lewis Index (TLI)                       0.954
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)            -113674.719
##   Loglikelihood unrestricted model (H1)    -113222.130
##                                                       
##   Akaike (AIC)                              227495.439
##   Bayesian (BIC)                            227943.040
##   Sample-size adjusted Bayesian (BIC)       227711.085
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.058
##   90 Percent confidence interval - lower         0.054
##   90 Percent confidence interval - upper         0.062
##   P-value RMSEA <= 0.05                          0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.040
## 
## 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
##   Achievement =~                                                        
##     Spellng           1.000                               5.641    0.923
##     Reading           2.007    0.035   58.046    0.000   11.322    0.910
##     Coding  (.p3.)    0.149    0.008   18.036    0.000    0.841    0.306
##   Verbal =~                                                             
##     Vocblry           1.000                               1.999    0.687
##     Cmprhns (.p5.)    0.706    0.025   27.759    0.000    1.411    0.486
##     Infrmtn (.p6.)    0.990    0.026   37.832    0.000    1.979    0.663
##     ITPA              1.132    0.032   35.169    0.000    2.264    0.800
##   Spatial =~                                                            
##     BndrGst           1.000                               2.199    0.659
##     BlckDsg (.p9.)    0.702    0.021   33.036    0.000    1.543    0.575
##     DrawAMn (.10.)    3.247    0.126   25.865    0.000    7.140    0.525
##     PctrArr           0.944    0.036   26.165    0.000    2.076    0.663
##   STM =~                                                                
##     Arthmtc           1.000                               2.977    0.845
##     DigtSpn           0.614    0.021   29.412    0.000    1.830    0.627
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Achievement ~~                                                        
##     Verbal            7.615    0.310   24.564    0.000    0.675    0.675
##     Spatial           8.228    0.363   22.648    0.000    0.663    0.663
##     STM     (.33.)   14.883    0.444   33.502    0.000    0.886    0.886
##   Verbal ~~                                                             
##     Spatial (.34.)    3.496    0.142   24.608    0.000    0.795    0.795
##     STM     (.35.)    5.035    0.181   27.863    0.000    0.846    0.846
##   Spatial ~~                                                            
##     STM               5.180    0.215   24.065    0.000    0.791    0.791
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Spellng (.37.)   27.176    0.138  197.369    0.000   27.176    4.448
##    .Reading (.38.)   40.031    0.272  147.331    0.000   40.031    3.217
##    .Coding  (.39.)   10.587    0.052  203.382    0.000   10.587    3.850
##    .Vocblry (.40.)   10.059    0.062  161.012    0.000   10.059    3.458
##    .Cmprhns           9.494    0.066  143.966    0.000    9.494    3.267
##    .Infrmtn           9.792    0.068  144.633    0.000    9.792    3.280
##    .ITPA    (.43.)   19.298    0.064  303.116    0.000   19.298    6.822
##    .BndrGst (.44.)   23.915    0.072  330.211    0.000   23.915    7.171
##    .BlckDsg (.45.)   10.458    0.056  186.334    0.000   10.458    3.896
##    .DrawAMn          96.200    0.309  311.798    0.000   96.200    7.075
##    .PctrArr (.47.)   10.602    0.067  159.080    0.000   10.602    3.388
##    .Arthmtc          21.436    0.080  268.625    0.000   21.436    6.087
##    .DigtSpn (.49.)   10.511    0.066  158.870    0.000   10.511    3.603
##     Achvmnt           0.000                               0.000    0.000
##     Verbal            0.000                               0.000    0.000
##     Spatial           0.000                               0.000    0.000
##     STM               0.000                               0.000    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Spellng           5.506    0.402   13.682    0.000    5.506    0.148
##    .Reading          26.683    1.692   15.769    0.000   26.683    0.172
##    .Coding            6.854    0.222   30.892    0.000    6.854    0.906
##    .Vocblry           4.467    0.169   26.359    0.000    4.467    0.528
##    .Cmprhns           6.454    0.219   29.527    0.000    6.454    0.764
##    .Infrmtn           4.992    0.185   26.951    0.000    4.992    0.560
##    .ITPA              2.878    0.139   20.660    0.000    2.878    0.360
##    .BndrGst           6.285    0.247   25.434    0.000    6.285    0.565
##    .BlckDsg           4.824    0.175   27.626    0.000    4.824    0.670
##    .DrawAMn (.23.)  133.920    3.601   37.194    0.000  133.920    0.724
##    .PctrArr           5.483    0.222   24.730    0.000    5.483    0.560
##    .Arthmtc           3.536    0.229   15.425    0.000    3.536    0.285
##    .DigtSpn (.26.)    5.163    0.138   37.427    0.000    5.163    0.607
##     Achvmnt          31.817    1.024   31.060    0.000    1.000    1.000
##     Verbal  (.28.)    3.995    0.171   23.393    0.000    1.000    1.000
##     Spatial (.29.)    4.836    0.240   20.131    0.000    1.000    1.000
##     STM               8.865    0.366   24.224    0.000    1.000    1.000
## 
## 
## Group 2 [Group 2]:
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Achievement =~                                                        
##     Spellng           1.000                               5.066    0.956
##     Reading           1.896    0.024   79.356    0.000    9.605    0.951
##     Coding  (.p3.)    0.149    0.008   18.036    0.000    0.755    0.259
##   Verbal =~                                                             
##     Vocblry           1.000                               1.999    0.739
##     Cmprhns (.p5.)    0.706    0.025   27.759    0.000    1.411    0.549
##     Infrmtn (.p6.)    0.990    0.026   37.832    0.000    1.979    0.748
##     ITPA              1.259    0.031   39.972    0.000    2.516    0.751
##   Spatial =~                                                            
##     BndrGst           1.000                               2.199    0.611
##     BlckDsg (.p9.)    0.702    0.021   33.036    0.000    1.543    0.630
##     DrawAMn (.10.)    3.247    0.126   25.865    0.000    7.140    0.525
##     PctrArr           0.836    0.028   29.891    0.000    1.838    0.667
##   STM =~                                                                
##     Arthmtc           1.000                               3.390    0.835
##     DigtSpn           0.519    0.021   24.201    0.000    1.760    0.612
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Achievement ~~                                                        
##     Verbal            6.198    0.282   21.976    0.000    0.612    0.612
##     Spatial           6.808    0.340   20.044    0.000    0.611    0.611
##     STM     (.33.)   14.883    0.444   33.502    0.000    0.867    0.867
##   Verbal ~~                                                             
##     Spatial (.34.)    3.496    0.142   24.608    0.000    0.795    0.795
##     STM     (.35.)    5.035    0.181   27.863    0.000    0.743    0.743
##   Spatial ~~                                                            
##     STM               5.692    0.254   22.387    0.000    0.764    0.764
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Spellng (.37.)   27.176    0.138  197.369    0.000   27.176    5.129
##    .Reading (.38.)   40.031    0.272  147.331    0.000   40.031    3.963
##    .Coding  (.39.)   10.587    0.052  203.382    0.000   10.587    3.633
##    .Vocblry (.40.)   10.059    0.062  161.012    0.000   10.059    3.720
##    .Cmprhns          10.017    0.092  108.621    0.000   10.017    3.897
##    .Infrmtn          11.053    0.097  114.111    0.000   11.053    4.177
##    .ITPA    (.43.)   19.298    0.064  303.116    0.000   19.298    5.761
##    .BndrGst (.44.)   23.915    0.072  330.211    0.000   23.915    6.650
##    .BlckDsg (.45.)   10.458    0.056  186.334    0.000   10.458    4.273
##    .DrawAMn         102.742    0.483  212.558    0.000  102.742    7.556
##    .PctrArr (.47.)   10.602    0.067  159.080    0.000   10.602    3.846
##    .Arthmtc          21.906    0.209  104.611    0.000   21.906    5.397
##    .DigtSpn (.49.)   10.511    0.066  158.870    0.000   10.511    3.657
##     Achvmnt          -4.296    0.194  -22.171    0.000   -0.848   -0.848
##     Verbal           -2.346    0.088  -26.700    0.000   -1.174   -1.174
##     Spatial          -2.455    0.104  -23.574    0.000   -1.117   -1.117
##     STM              -2.546    0.220  -11.582    0.000   -0.751   -0.751
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Spellng           2.406    0.257    9.381    0.000    2.406    0.086
##    .Reading           9.797    0.938   10.444    0.000    9.797    0.096
##    .Coding            7.922    0.294   26.931    0.000    7.922    0.933
##    .Vocblry           3.318    0.154   21.542    0.000    3.318    0.454
##    .Cmprhns           4.615    0.184   25.043    0.000    4.615    0.698
##    .Infrmtn           3.085    0.146   21.058    0.000    3.085    0.440
##    .ITPA              4.893    0.235   20.858    0.000    4.893    0.436
##    .BndrGst           8.098    0.345   23.438    0.000    8.098    0.626
##    .BlckDsg           3.610    0.157   22.984    0.000    3.610    0.603
##    .DrawAMn (.23.)  133.920    3.601   37.194    0.000  133.920    0.724
##    .PctrArr           4.220    0.193   21.810    0.000    4.220    0.555
##    .Arthmtc           4.980    0.381   13.071    0.000    4.980    0.302
##    .DigtSpn (.26.)    5.163    0.138   37.427    0.000    5.163    0.625
##     Achvmnt          25.662    0.820   31.306    0.000    1.000    1.000
##     Verbal  (.28.)    3.995    0.171   23.393    0.000    1.000    1.000
##     Spatial (.29.)    4.836    0.240   20.131    0.000    1.000    1.000
##     STM              11.492    0.524   21.924    0.000    1.000    1.000
#Parameters for Achievement

Ap = 3; Al1 = c(0, 2.007, 0); Al2 = c(0, 1.896, 0); Ai1 = c(0, 0, 0)
Ai2 = c(0, 0, 0); Asd = c(6.1, 12.43, 10.53); Afm = .848; Afsd = sqrt(31.817)

#Parameters for Verbal

Vp = 4; Vl1 = c(0, 0, 0, 1.132); Vl2 = c(0, 0, 0, 1.259); Vi1 = c(0, 9.494, 9.792, 0)
Vi2 = c(0, 10.017, 11.053, 0); Vsd = c(2.88, 2.92, 3, 2.82); Vfm = 1.174; Vfsd = 1

#Parameters for Spatial

Sp = 4; Sl1 = c(0, 0, 0, .944); Sl2 = c(0, 0, 0, .836); Si1 = c(0, 0, 96.200, 0)
Si2 = c(0, 0, 102.742, 0); Ssd = c(3.3, 2.7, 13.55, 3.12); Sfm = 1.117; Sfsd = 1

#Parameters for STM

Mp = 2; Ml1 = c(0, .614); Ml2 = c(0, .519); Mi1 = c(21.436, 0)
Mi2 = c(21.906, 0); Msd = c(3.5, 2.87); Mfm = .751; Mfsd = sqrt(8.865)

AES <- SDI2.UDI2(Ap, Al1, Al2, Ai1, Ai2, Asd, Afm, Afsd)

VES <- SDI2.UDI2(Vp, Vl1, Vl2, Vi1, Vi2, Vsd, Vfm, Vfsd)

SES <- SDI2.UDI2(Sp, Sl1, Sl2, Si1, Si2, Ssd, Sfm, Sfsd)

MES <- SDI2.UDI2(Mp, Ml1, Ml2, Mi1, Mi2, Msd, Mfm, Mfsd)

SUDI(AES$SDI2, AES$UDI2); SUDI(VES$SDI2, VES$UDI2); SUDI(SES$SDI2, SES$UDI2); SUDI(MES$SDI2, MES$UDI2)
##       SDI2
## [1,] 0.000
## [2,] 0.013
## [3,] 0.000
##         SDI2
## [1,]  0.0000
## [2,] -0.1791
## [3,] -0.4203
## [4,] -0.0582
##         SDI2
## [1,]  0.0000
## [2,]  0.0000
## [3,] -0.4828
## [4,]  0.0432
##         SDI2
## [1,] -0.1204
## [2,]  0.0596

In the lower-order or correlated group factor model, there were small biases in favor of the White group for the subtests reading (d = .0130), picture arrangement (.0432), and digit span (.0596). There was a small bias in favor of the Black group for the Illinois Test of Psycholinguistic Abilities (ITPA; d = .0582), moderate bias in favor of the Black group for comprehension (.1791) and arithmetic (.1204), and strong bias in favor of the Black group for information (.4203) and draw-a-man (.4828).

Higher-Order

NicholsConfiguralHOF <- cfa(NicholsModelG, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = T)

NicholsModelGII <- ' #g kills STM because it is poorly-defined, and thus needs to be extreme to recapitulate its relationships with the other factors. This is a case where we might see a large discrepancy between raw data and correlation matrices
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM'

NicholsMetricHOF     <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = "loadings")
NicholsPartialMetricHOF <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = "loadings", 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement"))
NicholsScalarHOF     <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement")) #Throws a meaningless warning
## Warning in lav_model_vcov(lavmodel = lavmodel, lavsamplestats = lavsamplestats, : lavaan WARNING:
##     The variance-covariance matrix of the estimated parameters (vcov)
##     does not appear to be positive definite! The smallest eigenvalue
##     (= 5.309577e-15) is close to zero. This may be a symptom that the
##     model is not identified.
NicholsPartialScalarHOF <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1")) #Throws a meaningless warning
## Warning in lav_model_vcov(lavmodel = lavmodel, lavsamplestats = lavsamplestats, : lavaan WARNING:
##     The variance-covariance matrix of the estimated parameters (vcov)
##     does not appear to be positive definite! The smallest eigenvalue
##     (= 2.765595e-15) is close to zero. This may be a symptom that the
##     model is not identified.
NicholsStrictHOF     <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1"))
NicholsPartialStrictHOF <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))
## Warning in lav_model_vcov(lavmodel = lavmodel, lavsamplestats = lavsamplestats, : lavaan WARNING:
##     The variance-covariance matrix of the estimated parameters (vcov)
##     does not appear to be positive definite! The smallest eigenvalue
##     (= 1.522729e-13) is close to zero. This may be a symptom that the
##     model is not identified.
NicholsLVHOF         <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))
NicholsMeanHOF       <- cfa(NicholsModelGII, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances", "means"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

round(cbind(CONFIGURAL        = fitMeasures(NicholsConfiguralHOF, FITM),
            METRIC            = fitMeasures(NicholsMetricHOF, FITM),
            "PARTIAL METRIC"  = fitMeasures(NicholsPartialMetricHOF, FITM),
            SCALAR            = fitMeasures(NicholsScalarHOF, FITM),
            "PARTIAL SCALAR"  = fitMeasures(NicholsPartialScalarHOF, FITM),
            STRICT            = fitMeasures(NicholsStrictHOF, FITM),
            "PARTIAL STRICT"  = fitMeasures(NicholsPartialStrictHOF, FITM),
            LVARS             = fitMeasures(NicholsLVHOF, FITM),
            MEANS             = fitMeasures(NicholsMeanHOF, FITM)), 3)
##                CONFIGURAL     METRIC PARTIAL METRIC     SCALAR PARTIAL SCALAR
## chisq            1091.912   1192.176       1115.204   1472.468       1131.713
## df                122.000    136.000        131.000    139.000        135.000
## npar               86.000     72.000         77.000     69.000         73.000
## cfi                 0.949      0.945          0.949      0.930          0.948
## rmsea               0.068      0.068          0.066      0.075          0.066
## rmsea.ci.lower      0.065      0.064          0.063      0.072          0.062
## rmsea.ci.upper      0.072      0.071          0.070      0.079          0.069
## aic            227708.171 227780.435     227713.463 228054.728     227721.972
## bic            228235.483 228221.905     228185.591 228477.803     228169.574
##                    STRICT PARTIAL STRICT      LVARS      MEANS
## chisq            1707.956       1137.883   1149.211   2075.663
## df                148.000        137.000    141.000    146.000
## npar               60.000         71.000     67.000     62.000
## cfi                 0.919          0.948      0.947      0.899
## rmsea               0.079          0.066      0.065      0.088
## rmsea.ci.lower      0.075          0.062      0.061      0.085
## rmsea.ci.upper      0.082          0.069      0.068      0.092
## aic            228272.215     227724.142 227727.471 228643.922
## bic            228640.107     228159.481 228138.283 229024.077

To test Spearman’s hypothesis, the strong (only g), weak (g plus specific abilities), and contra (specific abilities only) models need to be compared. To do this, constraints are placed on specific factor means. For the strong model, every group factor (i.e., every factor that is not g) is constrained; for the weak model, specific abilities are constrainted iteratively and more constraints are added, with some means still allowed to vary in each model, and; in the contra model, g plus a specific ability is constrained. The reason a specific ability is constrained in addition to g is to differentiate the model from the weak model with another degree of freedom. This form of the model also simply recapitulates the correlated group factor model and disperses g variance among the group factors, inflating the mean differences in those factors so that all observed mean differences are maintained regardless of model. This “special” form of the contra model in which only g is constrained is for these reasons not valid, but it can still be investigated.

NicholsModelGIIStrong <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIWeak1 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1'

NicholsModelGIIWeak2 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1'

NicholsModelGIIWeak3 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Spatial ~ c(0,0)*1'

NicholsModelGIIWeak4 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

STM ~ c(0,0)*1'

NicholsModelGIIWeak5 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1'

NicholsModelGIIWeak6 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Spatial ~ c(0,0)*1'

NicholsModelGIIWeak7 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIWeak8 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1'

NicholsModelGIIWeak9 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIWeak10 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIWeak11 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1'

NicholsModelGIIWeak12 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIWeak13 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIWeak14 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Spatial ~ c(0,0)*1
STM ~ c(0,0)*1'

NicholsModelGIIContra1 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra2 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra3 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Spatial ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra4 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra5 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra6 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Spatial ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra7 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra8 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra9 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Verbal ~ c(0,0)*1
STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra10 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Achievement ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra11 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra12 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra13 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Verbal ~ c(0,0)*1
Spatial ~ c(0,0)*1
STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContra14 <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

Spatial ~ c(0,0)*1
STM ~ c(0,0)*1
g ~ c(0,0)*1'

NicholsModelGIIContraSpecial <- ' 
Achievement =~ Spelling + Reading + Coding
Verbal =~ Vocabulary + Comprehension + Information + ITPA
Spatial =~ BenderGestalt + BlockDesign + DrawAMan + PictureArrangement
STM =~ Arithmetic + DigitSpan

g =~ Achievement + Verbal + Spatial + STM

STM ~~ 0*STM

g ~ c(0,0)*1'

NicholsHOFStrong         <- cfa(NicholsModelGIIStrong, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak1         <- cfa(NicholsModelGIIWeak1, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak2         <- cfa(NicholsModelGIIWeak2, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak3         <- cfa(NicholsModelGIIWeak3, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak4         <- cfa(NicholsModelGIIWeak4, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak5         <- cfa(NicholsModelGIIWeak5, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak6         <- cfa(NicholsModelGIIWeak6, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak7         <- cfa(NicholsModelGIIWeak7, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak8         <- cfa(NicholsModelGIIWeak8, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak9         <- cfa(NicholsModelGIIWeak9, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak10       <- cfa(NicholsModelGIIWeak10, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak11        <- cfa(NicholsModelGIIWeak11, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak12       <- cfa(NicholsModelGIIWeak12, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak13       <- cfa(NicholsModelGIIWeak13, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFWeak14       <- cfa(NicholsModelGIIWeak14, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra1         <- cfa(NicholsModelGIIContra1, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra2         <- cfa(NicholsModelGIIContra2, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra3         <- cfa(NicholsModelGIIContra3, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra4         <- cfa(NicholsModelGIIContra4, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra5         <- cfa(NicholsModelGIIContra5, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra6         <- cfa(NicholsModelGIIContra6, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra7         <- cfa(NicholsModelGIIContra7, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra8         <- cfa(NicholsModelGIIContra8, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra9         <- cfa(NicholsModelGIIContra9, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra10       <- cfa(NicholsModelGIIContra10, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra11        <- cfa(NicholsModelGIIContra11, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra12       <- cfa(NicholsModelGIIContra12, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra13       <- cfa(NicholsModelGIIContra13, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContra14       <- cfa(NicholsModelGIIContra14, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

NicholsHOFContraSpecial       <- cfa(NicholsModelGIIContraSpecial, sample.cov = GCovs, sample.mean = GMeans, sample.nobs = GNs, std.lv = F,
                            group.equal = c("loadings", "intercepts", "residuals", "lv.variances"), 
                            group.partial = c(
                              "g =~ STM", "Achievement =~ Reading", "Verbal =~ ITPA", "STM =~ DigitSpan", "Spatial =~ PictureArrangement",
                              "DrawAMan ~ 1", "Information ~ 1", "Comprehension ~ 1", "Arithmetic ~ 1",
                              "Reading ~~ Reading", "Spelling ~~ Spelling", "Information ~~ Information", "ITPA ~~ ITPA", "Comprehension ~~ Comprehension", "BlockDesign ~~ BlockDesign", "Vocabulary ~~ Vocabulary", "BenderGestalt ~~ BenderGestalt", "PictureArrangement ~~ PictureArrangement", "Arithmetic ~~ Arithmetic", "Coding ~~ Coding"))

round(cbind(
  LVARS  = fitMeasures(NicholsLVHOF, FITM),
  MEANS  = fitMeasures(NicholsMeanHOF, FITM),
  STRONG = fitMeasures(NicholsHOFStrong, FITM),
  Weak1  = fitMeasures(NicholsHOFWeak1, FITM),
  Weak2  = fitMeasures(NicholsHOFWeak2, FITM),
  Weak3  = fitMeasures(NicholsHOFWeak3, FITM),
  Weak4  = fitMeasures(NicholsHOFWeak4, FITM),
  Weak5  = fitMeasures(NicholsHOFWeak5, FITM),
  Weak6  = fitMeasures(NicholsHOFWeak6, FITM),
  Weak7  = fitMeasures(NicholsHOFWeak7, FITM),
  Weak8  = fitMeasures(NicholsHOFWeak8, FITM),
  Weak9  = fitMeasures(NicholsHOFWeak9, FITM),
  Weak10 = fitMeasures(NicholsHOFWeak10, FITM),
  Weak11 = fitMeasures(NicholsHOFWeak11, FITM),
  Weak12 = fitMeasures(NicholsHOFWeak12, FITM),
  Weak13 = fitMeasures(NicholsHOFWeak13, FITM),
  Weak14 = fitMeasures(NicholsHOFWeak14, FITM),
  Contra1  = fitMeasures(NicholsHOFContra1, FITM),
  Contra2  = fitMeasures(NicholsHOFContra2, FITM),
  Contra3  = fitMeasures(NicholsHOFContra3, FITM),
  Contra4  = fitMeasures(NicholsHOFContra4, FITM),
  Contra5  = fitMeasures(NicholsHOFContra5, FITM),
  Contra6  = fitMeasures(NicholsHOFContra6, FITM),
  Contra7  = fitMeasures(NicholsHOFContra7, FITM),
  Contra8  = fitMeasures(NicholsHOFContra8, FITM),
  Contra9  = fitMeasures(NicholsHOFContra9, FITM),
  Contra10 = fitMeasures(NicholsHOFContra10, FITM),
  Contra11 = fitMeasures(NicholsHOFContra11, FITM),
  Contra12 = fitMeasures(NicholsHOFContra12, FITM),
  Contra13 = fitMeasures(NicholsHOFContra13, FITM),
  Contra14 = fitMeasures(NicholsHOFContra14, FITM),
  ContraSpecial = fitMeasures(NicholsHOFContraSpecial, FITM)), 3)
##                     LVARS      MEANS     STRONG      Weak1      Weak2
## chisq            1149.211   2075.663   1300.047   1149.211   1149.211
## df                141.000    146.000    145.000    142.000    142.000
## npar               67.000     62.000     63.000     66.000     66.000
## cfi                 0.947      0.899      0.940      0.947      0.947
## rmsea               0.065      0.088      0.068      0.065      0.065
## rmsea.ci.lower      0.061      0.085      0.065      0.061      0.061
## rmsea.ci.upper      0.068      0.092      0.072      0.068      0.068
## aic            227727.471 228643.922 227870.306 227725.471 227725.471
## bic            228138.283 229024.077 228256.593 228130.152 228130.152
##                     Weak3      Weak4      Weak5      Weak6      Weak7
## chisq            1149.211   1149.211   1224.246   1205.254   1165.124
## df                142.000    142.000    143.000    143.000    143.000
## npar               66.000     66.000     65.000     65.000     65.000
## cfi                 0.947      0.947      0.944      0.945      0.947
## rmsea               0.065      0.065      0.067      0.066      0.065
## rmsea.ci.lower      0.061      0.061      0.063      0.063      0.061
## rmsea.ci.upper      0.068      0.068      0.070      0.070      0.068
## aic            227725.471 227725.471 227798.505 227779.513 227739.384
## bic            228130.152 228130.152 228197.055 228178.063 228137.933
##                     Weak8      Weak9     Weak10     Weak11     Weak12
## chisq            1243.825   1267.789   1242.218   1149.692   1237.215
## df                144.000    144.000    144.000    143.000    143.000
## npar               64.000     64.000     64.000     65.000     65.000
## cfi                 0.943      0.941      0.943      0.947      0.943
## rmsea               0.067      0.068      0.067      0.064      0.067
## rmsea.ci.lower      0.064      0.064      0.064      0.061      0.064
## rmsea.ci.upper      0.070      0.071      0.070      0.068      0.071
## aic            227816.084 227840.048 227814.478 227723.951 227811.474
## bic            228208.502 228232.466 228206.896 228122.500 228210.024
##                    Weak13     Weak14    Contra1    Contra2    Contra3
## chisq            1242.872   1225.019   1600.147   1902.266   1752.696
## df                144.000    143.000    143.000    143.000    143.000
## npar               64.000     65.000     65.000     65.000     65.000
## cfi                 0.943      0.944      0.924      0.908      0.916
## rmsea               0.067      0.067      0.077      0.085      0.081
## rmsea.ci.lower      0.064      0.063      0.074      0.082      0.078
## rmsea.ci.upper      0.070      0.070      0.081      0.088      0.085
## aic            227815.132 227799.279 228174.407 228476.526 228326.956
## bic            228207.550 228197.828 228572.956 228875.075 228725.505
##                   Contra4    Contra5    Contra6    Contra7    Contra8
## chisq            1315.936   1939.973   1830.948   1603.977   2060.262
## df                143.000    144.000    144.000    144.000    145.000
## npar               65.000     64.000     64.000     64.000     63.000
## cfi                 0.939      0.906      0.912      0.924      0.900
## rmsea               0.069      0.086      0.083      0.077      0.088
## rmsea.ci.lower      0.066      0.082      0.080      0.074      0.085
## rmsea.ci.upper      0.073      0.089      0.086      0.081      0.092
## aic            227890.196 228512.232 228403.208 228176.236 228630.522
## bic            228288.745 228904.650 228795.626 228568.654 229016.808
##                   Contra9   Contra10   Contra11   Contra12   Contra13
## chisq            1944.389   1832.317   2059.022   1902.382   2071.273
## df                145.000    145.000    144.000    144.000    145.000
## npar               63.000     63.000     64.000     64.000     63.000
## cfi                 0.906      0.912      0.900      0.908      0.899
## rmsea               0.085      0.083      0.088      0.085      0.088
## rmsea.ci.lower      0.082      0.079      0.085      0.081      0.085
## rmsea.ci.upper      0.089      0.086      0.092      0.088      0.092
## aic            228514.648 228402.576 228631.282 228474.641 228641.533
## bic            228900.935 228788.863 229023.700 228867.059 229027.819
##                  Contra14 ContraSpecial
## chisq            1758.470      1149.211
## df                144.000       142.000
## npar               64.000        66.000
## cfi                 0.916         0.947
## rmsea               0.081         0.065
## rmsea.ci.lower      0.078         0.061
## rmsea.ci.upper      0.085         0.068
## aic            228330.730    227725.471
## bic            228723.148    228130.152

The most restrictive model possible was the eleventh weak model, constraining verbal and spatial ability, while leaving g free. Because of the variance constraint on STM, this is slightly less informative than it would be otherwise, but it’s no big deal because it wasn’t a substantive factor anyway, it was just one that replicated across groups. We can now inspect the mean differences:

summary(NicholsHOFWeak11, stand = T, fit = T)
## lavaan 0.6-12 ended normally after 162 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        87
##   Number of equality constraints                    22
## 
##   Number of observations per group:                   
##     Group 1                                       1940
##     Group 2                                       1460
## 
## Model Test User Model:
##                                                       
##   Test statistic                              1149.692
##   Degrees of freedom                               143
##   P-value (Chi-square)                           0.000
##   Test statistic for each group:
##     Group 1                                    665.340
##     Group 2                                    484.351
## 
## Model Test Baseline Model:
## 
##   Test statistic                             19310.872
##   Degrees of freedom                               156
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.947
##   Tucker-Lewis Index (TLI)                       0.943
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)            -113796.975
##   Loglikelihood unrestricted model (H1)    -113222.130
##                                                       
##   Akaike (AIC)                              227723.951
##   Bayesian (BIC)                            228122.500
##   Sample-size adjusted Bayesian (BIC)       227915.965
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.064
##   90 Percent confidence interval - lower         0.061
##   90 Percent confidence interval - upper         0.068
##   P-value RMSEA <= 0.05                          0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.051
## 
## 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
##   Achievement =~                                                        
##     Spellng           1.000                               5.368    0.913
##     Reading           2.044    0.036   57.411    0.000   10.971    0.906
##     Coding  (.p3.)    0.150    0.008   17.967    0.000    0.804    0.293
##   Verbal =~                                                             
##     Vocblry           1.000                               2.009    0.690
##     Cmprhns (.p5.)    0.699    0.025   27.615    0.000    1.404    0.483
##     Infrmtn (.p6.)    0.998    0.026   38.396    0.000    2.005    0.672
##     ITPA              1.112    0.032   34.790    0.000    2.234    0.796
##   Spatial =~                                                            
##     BndrGst           1.000                               2.247    0.676
##     BlckDsg (.p9.)    0.689    0.021   33.356    0.000    1.549    0.577
##     DrawAMn (.10.)    3.184    0.122   26.014    0.000    7.154    0.526
##     PctrArr           0.891    0.035   25.364    0.000    2.001    0.643
##   STM =~                                                                
##     Arthmtc           1.000                               2.932    0.849
##     DigtSpn           0.617    0.021   28.732    0.000    1.809    0.626
##   g =~                                                                  
##     Achvmnt           1.000                               0.843    0.843
##     Verbal  (.15.)    0.364    0.010   37.928    0.000    0.820    0.820
##     Spatial (.16.)    0.399    0.012   34.557    0.000    0.804    0.804
##     STM               0.648    0.016   41.648    0.000    1.000    1.000
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Verbal            0.000                               0.000    0.000
##    .Spatial           0.000                               0.000    0.000
##    .Spellng (.38.)   27.174    0.133  205.071    0.000   27.174    4.624
##    .Reading (.39.)   39.979    0.261  152.889    0.000   39.979    3.303
##    .Coding  (.40.)   10.587    0.052  204.388    0.000   10.587    3.865
##    .Vocblry (.41.)   10.033    0.060  165.865    0.000   10.033    3.448
##    .Cmprhns           9.489    0.066  144.105    0.000    9.489    3.265
##    .Infrmtn           9.784    0.067  144.968    0.000    9.784    3.279
##    .ITPA    (.44.)   19.290    0.062  309.199    0.000   19.290    6.877
##    .BndrGst (.45.)   23.936    0.070  342.172    0.000   23.936    7.198
##    .BlckDsg (.46.)   10.463    0.054  193.859    0.000   10.463    3.897
##    .DrawAMn          96.203    0.307  313.193    0.000   96.203    7.076
##    .PctrArr (.48.)   10.592    0.064  164.458    0.000   10.592    3.401
##    .Arthmtc          21.430    0.078  274.164    0.000   21.430    6.204
##    .DigtSpn (.50.)   10.507    0.065  160.611    0.000   10.507    3.640
##    .Achvmnt           0.000                               0.000    0.000
##    .STM               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
##    .STM               0.000                               0.000    0.000
##    .Spellng           5.725    0.394   14.523    0.000    5.725    0.166
##    .Reading          26.161    1.713   15.271    0.000   26.161    0.179
##    .Coding            6.857    0.222   30.893    0.000    6.857    0.914
##    .Vocblry           4.433    0.171   25.900    0.000    4.433    0.524
##    .Cmprhns           6.472    0.220   29.424    0.000    6.472    0.766
##    .Infrmtn           4.881    0.185   26.387    0.000    4.881    0.548
##    .ITPA              2.878    0.142   20.261    0.000    2.878    0.366
##    .BndrGst           6.009    0.245   24.521    0.000    6.009    0.543
##    .BlckDsg           4.811    0.176   27.372    0.000    4.811    0.667
##    .DrawAMn (.30.)  133.680    3.625   36.875    0.000  133.680    0.723
##    .PctrArr           5.694    0.227   25.048    0.000    5.694    0.587
##    .Arthmtc           3.339    0.172   19.399    0.000    3.339    0.280
##    .DigtSpn (.33.)    5.063    0.136   37.306    0.000    5.063    0.608
##    .Achvmnt (.34.)    8.331    0.376   22.172    0.000    0.289    0.289
##    .Verbal  (.35.)    1.323    0.080   16.455    0.000    0.328    0.328
##    .Spatial (.36.)    1.789    0.127   14.052    0.000    0.354    0.354
##     g       (.37.)   20.481    0.783   26.155    0.000    1.000    1.000
## 
## 
## Group 2 [Group 2]:
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Achievement =~                                                        
##     Spellng           1.000                               5.368    0.962
##     Reading           1.879    0.022   84.285    0.000   10.086    0.954
##     Coding  (.p3.)    0.150    0.008   17.967    0.000    0.804    0.275
##   Verbal =~                                                             
##     Vocblry           1.000                               2.009    0.735
##     Cmprhns (.p5.)    0.699    0.025   27.615    0.000    1.404    0.545
##     Infrmtn (.p6.)    0.998    0.026   38.396    0.000    2.005    0.753
##     ITPA              1.282    0.032   40.338    0.000    2.574    0.760
##   Spatial =~                                                            
##     BndrGst           1.000                               2.247    0.628
##     BlckDsg (.p9.)    0.689    0.021   33.356    0.000    1.549    0.633
##     DrawAMn (.10.)    3.184    0.122   26.014    0.000    7.154    0.526
##     PctrArr           0.808    0.027   29.580    0.000    1.817    0.653
##   STM =~                                                                
##     Arthmtc           1.000                               3.487    0.836
##     DigtSpn           0.533    0.021   25.354    0.000    1.857    0.637
##   g =~                                                                  
##     Achvmnt           1.000                               0.843    0.843
##     Verbal  (.15.)    0.364    0.010   37.928    0.000    0.820    0.820
##     Spatial (.16.)    0.399    0.012   34.557    0.000    0.804    0.804
##     STM               0.771    0.020   38.171    0.000    1.000    1.000
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Verbal            0.000                               0.000    0.000
##    .Spatial           0.000                               0.000    0.000
##    .Spellng (.38.)   27.174    0.133  205.071    0.000   27.174    4.870
##    .Reading (.39.)   39.979    0.261  152.889    0.000   39.979    3.782
##    .Coding  (.40.)   10.587    0.052  204.388    0.000   10.587    3.617
##    .Vocblry (.41.)   10.033    0.060  165.865    0.000   10.033    3.674
##    .Cmprhns           9.969    0.088  113.073    0.000    9.969    3.866
##    .Infrmtn          11.028    0.090  122.664    0.000   11.028    4.139
##    .ITPA    (.44.)   19.290    0.062  309.199    0.000   19.290    5.692
##    .BndrGst (.45.)   23.936    0.070  342.172    0.000   23.936    6.688
##    .BlckDsg (.46.)   10.463    0.054  193.859    0.000   10.463    4.276
##    .DrawAMn         102.766    0.461  222.954    0.000  102.766    7.558
##    .PctrArr (.48.)   10.592    0.064  164.458    0.000   10.592    3.807
##    .Arthmtc          21.833    0.201  108.618    0.000   21.833    5.236
##    .DigtSpn (.50.)   10.507    0.065  160.611    0.000   10.507    3.601
##    .Achvmnt           2.012    0.215    9.373    0.000    0.375    0.375
##    .STM               2.389    0.216   11.078    0.000    0.685    0.685
##     g                -6.311    0.240  -26.341    0.000   -1.395   -1.395
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .STM               0.000                               0.000    0.000
##    .Spellng           2.320    0.263    8.808    0.000    2.320    0.075
##    .Reading          10.035    0.959   10.462    0.000   10.035    0.090
##    .Coding            7.920    0.294   26.929    0.000    7.920    0.925
##    .Vocblry           3.424    0.157   21.757    0.000    3.424    0.459
##    .Cmprhns           4.676    0.186   25.123    0.000    4.676    0.703
##    .Infrmtn           3.077    0.146   21.008    0.000    3.077    0.433
##    .ITPA              4.859    0.235   20.663    0.000    4.859    0.423
##    .BndrGst           7.760    0.339   22.881    0.000    7.760    0.606
##    .BlckDsg           3.588    0.158   22.699    0.000    3.588    0.599
##    .DrawAMn (.30.)  133.680    3.625   36.875    0.000  133.680    0.723
##    .PctrArr           4.442    0.202   21.947    0.000    4.442    0.574
##    .Arthmtc           5.225    0.290   18.032    0.000    5.225    0.301
##    .DigtSpn (.33.)    5.063    0.136   37.306    0.000    5.063    0.595
##    .Achvmnt (.34.)    8.331    0.376   22.172    0.000    0.289    0.289
##    .Verbal  (.35.)    1.323    0.080   16.455    0.000    0.328    0.328
##    .Spatial (.36.)    1.789    0.127   14.052    0.000    0.354    0.354
##     g       (.37.)   20.481    0.783   26.155    0.000    1.000    1.000

In this sample of 7-year-olds, there was a 1.395 Hedge’s g difference in g, a -.375 g difference in achievement, and a -.685 g difference in STM. That is, net of g, the Black group did better in the factor I dubbed short-term memory and in terms of a factor underlying achievement tests. That fits with most other studies residualizing for g. Oddly enough, the pattern of variance differences was not consistent with an additional “X Factor” or “Factor X” acting to suppress the scores of the Black group. Spelling, Reading, Coding, Vocabulary, Comprehension, Information, Picture Arrangement, and Arithmetic were more variable in the White group, and the ITPA and Bender Gestalt test were more variable in the Black group. Now lets see what bias did to the subtest means.

#Parameters for Achievement

Ap = 3; Al1 = c(0, 2.044, 0); Al2 = c(0, 1.879, 0); Ai1 = c(0, 0, 0)
Ai2 = c(0, 0, 0); Asd = c(6.1, 12.43, 10.53); Afm = -.375; Afsd = 1

#Parameters for Verbal

Vp = 4; Vl1 = c(0, 0, 0, 1.112); Vl2 = c(0, 0, 0, 1.282); Vi1 = c(0, 9.489, 9.784, 0)
Vi2 = c(0, 9.969, 11.028, 0); Vsd = c(2.88, 2.92, 3, 2.82); Vfm = 0; Vfsd = 1

#Parameters for Spatial

Sp = 4; Sl1 = c(0, 0, 0, .891); Sl2 = c(0, 0, 0, .808); Si1 = c(0, 0, 96.203, 0)
Si2 = c(0, 0, 102.766, 0); Ssd = c(3.3, 2.7, 13.55, 3.12); Sfm = 0; Sfsd = 1

#Parameters for STM

Mp = 2; Ml1 = c(0, .617); Ml2 = c(0, .533); Mi1 = c(21.430, 0)
Mi2 = c(21.833, 0); Msd = c(3.5, 2.87); Mfm = -.685; Mfsd = 1

AES <- SDI2.UDI2(Ap, Al1, Al2, Ai1, Ai2, Asd, Afm, Afsd)

VES <- SDI2.UDI2(Vp, Vl1, Vl2, Vi1, Vi2, Vsd, Vfm, Vfsd)

SES <- SDI2.UDI2(Sp, Sl1, Sl2, Si1, Si2, Ssd, Sfm, Sfsd)

MES <- SDI2.UDI2(Mp, Ml1, Ml2, Mi1, Mi2, Msd, Mfm, Mfsd)

SUDI(AES$SDI2, AES$UDI2); SUDI(VES$SDI2, VES$UDI2); SUDI(SES$SDI2, SES$UDI2); SUDI(MES$SDI2, MES$UDI2)
##         SDI2
## [1,]  0.0000
## [2,] -0.0113
## [3,]  0.0000
##         SDI2
## [1,]  0.0000
## [2,] -0.1644
## [3,] -0.4147
## [4,]  0.0481
##         SDI2
## [1,]  0.0000
## [2,]  0.0000
## [3,] -0.4844
## [4,]  0.0212
##         SDI2
## [1,] -0.1151
## [2,] -0.0286

With g out of the question, bias became more strongly favorable to the Black group. The subtests ITPA and picture arrangement became biased in favor of the White group, but only barely so (.0481 and .0212), whereas the reading, comprehension, information, draw-a-man, arithmetic, and digit span tests were biased in favor of the Black group to various degrees (in order, .0113, .1644, .4147, .4844, .1151, and .0286).

Discussion

A very old study, never assessed for bias to my knowledge, turned out to allow mostly unbiased mean comparisons. The study is interesting, as it preempted the extensive nomothetic net construction around Spearman’s hypothesis undertaken by Jensen, some years later. With that said, it is odd that this study was not more widely cited and the data was not gathered again for reanalysis. Nichols’ was, as far as I know, the first study to realize the relevance and utility of correlating vectors of g loadings and heritabilities, and his correction by SES (and thus by the genes that lead to it, to the extent it is heritable, and genes confounded with IQ to the extent these overlap) is an interesting failure in an otherwise excellent manuscript. Overall, this was a very cool paper and it was neat to see that it supported Spearman’s weak hypothesis.

References

Gunn, H. J., Grimm, K. J., & Edwards, M. C. (2019). Evaluation of Six Effect Size Measures of Measurement Non-Invariance for Continuous Outcomes. Structural Equation Modeling: A Multidisciplinary Journal, 27(4), 503–514. https://doi.org/10.1080/10705511.2019.1689507

Nichols, P. L. (1970). The Effects of Heredity and Environment on Intelligence Test Performance in 4 and 7 Year White and Negro Sibling Pairs [Ph.D., University of Minnesota]. Retrieved September 14, 2022, from https://www.proquest.com/docview/302420679/citation/6030DF9E28D54A1DPQ/1

Post-Script

What was the vector correlation between heritability and group differences?

pca(White.cor[c(1, 3:13),c(1, 3:13)], nobs = WhiteN)
## Principal Components Analysis
## Call: principal(r = r, nfactors = nfactors, residuals = residuals, 
##     rotate = rotate, n.obs = n.obs, covar = covar, scores = scores, 
##     missing = missing, impute = impute, oblique.scores = oblique.scores, 
##     method = method, use = use, cor = cor, correct = 0.5, weight = NULL, 
##     nobs = ..1)
## Standardized loadings (pattern matrix) based upon correlation matrix
##                     PC1   h2   u2 com
## BenderGestalt      0.63 0.40 0.60   1
## Comprehension      0.47 0.22 0.78   1
## Vocabulary         0.65 0.42 0.58   1
## DigitSpan          0.67 0.45 0.55   1
## PictureArrangement 0.65 0.42 0.58   1
## BlockDesign        0.57 0.32 0.68   1
## Coding             0.40 0.16 0.84   1
## ITPA               0.76 0.57 0.43   1
## DrawAMan           0.50 0.25 0.75   1
## Spelling           0.80 0.64 0.36   1
## Reading            0.78 0.61 0.39   1
## Arithmetic         0.81 0.65 0.35   1
## 
##                 PC1
## SS loadings    5.11
## Proportion Var 0.43
## 
## Mean item complexity =  1
## Test of the hypothesis that 1 component is sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.08 
## 
## Fit based upon off diagonal values = 0.95
DiffDF <- data.frame("Diff" = c(.86, .82, .73, .73, .56, .71, .46, .69, .67, .41, .11, .17), "H2" = c(.71, .69, .74, .6, .54, .29, .34, .23, .2, .09, .23, .14), "gL" = c(.65, .76, .78, .80, .81, .65, .67, .63, .57, .47, .50, .40), 
                     "SESW" = c(.32, .29, .33, .3, .26, .27, .22, .23, .25, .18, .21, .06), "SESB" = c(.26, .23, .29, .25, .21, .16, .19, .17, .18, .16, .09, .10))

cor(DiffDF, method = "spearman")
##           Diff        H2        gL      SESW      SESB
## Diff 1.0000000 0.7824561 0.5859649 0.9106844 0.8105263
## H2   0.7824561 1.0000000 0.8175439 0.8966739 0.8736842
## gL   0.5859649 0.8175439 1.0000000 0.7460607 0.7807018
## SESW 0.9106844 0.8966739 0.7460607 1.0000000 0.8686528
## SESB 0.8105263 0.8736842 0.7807018 0.8686528 1.0000000
CONGO <- function(F1, F2) {
  PHI = sum(F1*F2) / sqrt(sum(F1^2)*sum(F2^2))
  return(PHI)}

CONGO(DiffDF$Diff, DiffDF$H2)
## [1] 0.9291203
CONGO(DiffDF$Diff, DiffDF$gL)
## [1] 0.9615351
CONGO(DiffDF$H2, DiffDF$gL)
## [1] 0.9311207