Setup

This also includes a reanalysis of Wang et al. (2021).

library(pacman); p_load(lavaan, psych, semPlot)

CONGO <- function(F1, F2) {
  PHI = sum(F1*F2) / sqrt(sum(F1^2)*sum(F2^2))
  return(PHI)}

CRITR <- function(n, alpha = .05) {
  df <- n - 2; CRITT <- qt(alpha/2, df, lower.tail = F)
  CRITR <- sqrt((CRITT^2)/((CRITT^2) + df ))
  return(CRITR)}

NP <- function(N, S = 2) {
  NP = 1-pnorm(qnorm(1-(N^(-6/5))/S))
  return(NP)}

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

NP(205); CRITR(205); CRITR(205, NP(205))
## [1] 0.0008411344
## [1] 0.1370811
## [1] 0.2314392
NP(215); CRITR(215); CRITR(215, NP(215))
## [1] 0.0007944084
## [1] 0.1338466
## [1] 0.2271178
#Buczylowsko, Petermann & Daseking (2020)

lowerBPD <- '
1                                                       
0.607   1                                                   
0.558   0.57    1                                               
0.286   0.281   0.309   1                                           
0.351   0.381   0.328   0.487   1                                       
0.295   0.381   0.414   0.411   0.515   1                                   
0.232   0.251   0.274   0.338   0.311   0.318   1                               
0.224   0.223   0.253   0.359   0.244   0.287   0.542   1                           
0.261   0.243   0.223   0.23    0.273   0.235   0.375   0.34    1                       
0.38    0.286   0.248   0.331   0.385   0.306   0.275   0.225   0.564   1                   
0.465   0.389   0.355   0.215   0.403   0.264   0.17    0.195   0.198   0.267   1               
0.446   0.421   0.404   0.371   0.291   0.357   0.266   0.254   0.317   0.356   0.377   1           
0.226   0.254   0.184   0.278   0.218   0.264   0.04    0.129   0.133   0.211   0.202   0.228   1       
0.1 0.095   0.099   0.157   0.232   0.177   0.394   0.306   0.412   0.295   0.231   0.222   0.041   1   
0.352   0.334   0.37    0.333   0.331   0.333   0.373   0.352   0.419   0.371   0.398   0.374   0.122   0.307   1'

lowerBPDPsy <- '
1                                   
0.607   1                               
0.558   0.57    1                           
0.286   0.281   0.309   1                       
0.351   0.381   0.328   0.487   1                   
0.295   0.381   0.414   0.411   0.515   1               
0.232   0.251   0.274   0.338   0.311   0.318   1           
0.224   0.223   0.253   0.359   0.244   0.287   0.542   1       
0.261   0.243   0.223   0.23    0.273   0.235   0.375   0.34    1   
0.38    0.286   0.248   0.331   0.385   0.306   0.275   0.225   0.564   1'

lowerBPDExe <- '
1               
0.377   1           
0.202   0.228   1       
0.231   0.222   0.041   1   
0.398   0.374   0.122   0.307   1'

nBPD <- 205

BPD.cor = getCov(lowerBPD, names = c("SI", "VC", "IN", "MR", "DS", "AR", "BD", "VP", "SS", "CO", "LRF", "CAT", "JDG", "MAZ", "WGN"))
BPDPsy.cor = getCov(lowerBPDPsy, names = c("SI", "VC", "IN", "MR", "DS", "AR", "BD", "VP", "SS", "CO"))
BPDExe.cor = getCov(lowerBPDExe, names = c("LRF", "CAT", "JDG", "MAZ", "WGN"))

#Wang et al. (2021)

lowerWEA <- '
1                       
0.18    1                   
0.33    0.48    1               
0.27    0.31    0.35    1           
0.07    0.15    0.14    0.63    1       
-0.03   0.1 0.1 0.19    0.24    1   
0.16    0.15    0.08    0.21    0.22    0.3 1'

lowerWEAPsy <- '
1           
0.63    1       
0.19    0.24    1   
0.21    0.22    0.3 1'

lowerWEAExe <- '
1       
0.18    1   
0.33    0.48    1'

nWEA <- 215

WEA.cor = getCov(lowerWEA, names = c("SCT1", "SCT2", "SCT3", "CST", "BPT", "CFT", "ART"))
WEAPsy.cor = getCov(lowerWEAPsy, names = c("CST", "BPT", "CFT", "ART"))
WEAExe.cor = getCov(lowerWEAExe, names = c("SCT1", "SCT2", "SCT3"))

Analysis

Buczylowsko, Petermann & Daseking (2020)

fa.parallel(BPD.cor, n.obs =  nBPD)
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Parallel analysis suggests that the number of factors =  3  and the number of components =  2
fa.parallel(BPDPsy.cor, n.obs =  nBPD)
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.
## Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
## ultra-Heywood case was detected. Examine the results carefully
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.
## Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
## ultra-Heywood case was detected. Examine the results carefully

## Parallel analysis suggests that the number of factors =  4  and the number of components =  1
fa.parallel(BPDExe.cor, n.obs =  nBPD)

## Parallel analysis suggests that the number of factors =  1  and the number of components =  1
faBPD1 <- fa(BPD.cor, n.obs = nBPD, nfactors = 1)
faBPD2 <- fa(BPD.cor, n.obs = nBPD, nfactors = 2)
## Loading required namespace: GPArotation
faBPD3 <- fa(BPD.cor, n.obs = nBPD, nfactors = 3)

faPsyBPD1 <- fa(BPDPsy.cor, n.obs = nBPD, nfactors = 1)
faPsyBPD2 <- fa(BPDPsy.cor, n.obs = nBPD, nfactors = 2)
faPsyBPD3 <- fa(BPDPsy.cor, n.obs = nBPD, nfactors = 3)
faPsyBPD4 <- fa(BPDPsy.cor, n.obs = nBPD, nfactors = 4)

faExeBPD <- fa(BPDExe.cor, n.obs = nBPD, nfactors = 1)

print(faBPD1$loadings)
## 
## Loadings:
##     MR1  
## SI  0.638
## VC  0.628
## IN  0.613
## MR  0.565
## DS  0.619
## AR  0.593
## BD  0.528
## VP  0.496
## SS  0.535
## CO  0.579
## LRF 0.539
## CAT 0.612
## JDG 0.324
## MAZ 0.383
## WGN 0.620
## 
##                  MR1
## SS loadings    4.678
## Proportion Var 0.312
print(faBPD2$loadings)
## 
## Loadings:
##     MR1    MR2   
## SI   0.772       
## VC   0.782       
## IN   0.701       
## MR   0.323  0.326
## DS   0.420  0.285
## AR   0.429  0.245
## BD          0.667
## VP          0.574
## SS          0.645
## CO   0.228  0.450
## LRF  0.509       
## CAT  0.487  0.207
## JDG  0.346       
## MAZ -0.153  0.647
## WGN  0.274  0.450
## 
##                  MR1   MR2
## SS loadings    2.930 2.321
## Proportion Var 0.195 0.155
## Cumulative Var 0.195 0.350
print(faBPD3$loadings)
## 
## Loadings:
##     MR1    MR2    MR3   
## SI   0.833              
## VC   0.709         0.104
## IN   0.602         0.164
## MR                 0.679
## DS   0.153         0.556
## AR   0.132         0.613
## BD  -0.102  0.493  0.313
## VP          0.404  0.326
## SS   0.106  0.738       
## CO   0.230  0.448       
## LRF  0.485  0.114       
## CAT  0.421  0.179  0.147
## JDG  0.200         0.266
## MAZ -0.103  0.620       
## WGN  0.251  0.414  0.120
## 
##                  MR1   MR2   MR3
## SS loadings    2.208 1.768 1.517
## Proportion Var 0.147 0.118 0.101
## Cumulative Var 0.147 0.265 0.366
print(faPsyBPD1$loadings)
## 
## Loadings:
##    MR1  
## SI 0.625
## VC 0.634
## IN 0.622
## MR 0.578
## DS 0.635
## AR 0.612
## BD 0.538
## VP 0.497
## SS 0.507
## CO 0.565
## 
##                  MR1
## SS loadings    3.404
## Proportion Var 0.340
print(faPsyBPD2$loadings)
## 
## Loadings:
##    MR2    MR1   
## SI         0.741
## VC         0.800
## IN         0.700
## MR  0.495  0.152
## DS  0.417  0.291
## AR  0.375  0.308
## BD  0.697       
## VP  0.651       
## SS  0.580       
## CO  0.483  0.150
## 
##                  MR2   MR1
## SS loadings    2.040 1.916
## Proportion Var 0.204 0.192
## Cumulative Var 0.204 0.396
print(faPsyBPD3$loadings)
## 
## Loadings:
##    MR3    MR1    MR2   
## SI         0.782       
## VC         0.769       
## IN  0.128  0.650       
## MR  0.660              
## DS  0.536  0.193       
## AR  0.546  0.199       
## BD  0.599         0.156
## VP  0.581 -0.109  0.128
## SS                0.994
## CO  0.174  0.191  0.418
## 
##                  MR3   MR1   MR2
## SS loadings    1.769 1.760 1.220
## Proportion Var 0.177 0.176 0.122
## Cumulative Var 0.177 0.353 0.475
print(faPsyBPD4$loadings)
## 
## Loadings:
##    MR1    MR4    MR3    MR2   
## SI  0.776         0.110       
## VC  0.775                     
## IN  0.701                     
## MR         0.534         0.182
## DS         0.776              
## AR  0.116  0.579              
## BD                       0.665
## VP                       0.760
## SS                0.492  0.325
## CO                0.956       
## 
##                  MR1   MR4   MR3   MR2
## SS loadings    1.711 1.248 1.184 1.172
## Proportion Var 0.171 0.125 0.118 0.117
## Cumulative Var 0.171 0.296 0.414 0.531
print(faExeBPD$loadings)
## 
## Loadings:
##     MR1  
## LRF 0.627
## CAT 0.608
## JDG 0.272
## MAZ 0.392
## WGN 0.637
## 
##                  MR1
## SS loadings    1.395
## Proportion Var 0.279
EFATOGBPD <- c(0.638, 0.628, 0.613, 0.565, 0.619, 0.593, 0.528, 0.498, 0.535, 0.579, 0.539, 0.612, 0.324, 0.383, 0.620)
EFATOGBPDPsy <- c(0.638, 0.628, 0.613, 0.565, 0.619, 0.593, 0.528, 0.498, 0.535, 0.579); EFATOGBPDExe <- c(0.539, 0.612, 0.324, 0.383, 0.620)
EFASEPBPD <- c(0.625, 0.634, 0.622, 0.578, 0.635, 0.612, 0.538, 0.497, 0.507, 0.565, 0.627, 0.608, 0.272, 0.392, 0.637)
EFASEPBPDPsy <- c(0.625, 0.634, 0.622, 0.578, 0.635, 0.612, 0.538, 0.497, 0.507, 0.565); EFASEPBPDExe <- c(0.627, 0.608, 0.272, 0.392, 0.637)

cor(EFATOGBPD, EFASEPBPD, method = "pearson"); cor(EFATOGBPD, EFASEPBPD, method = "spearman"); CONGO(EFATOGBPD, EFASEPBPD)
## [1] 0.9621195
## [1] 0.8714286
## [1] 0.9987097
cor(EFATOGBPDPsy, EFASEPBPDPsy, method = "pearson"); cor(EFATOGBPDPsy, EFASEPBPDPsy, method = "spearman"); CONGO(EFATOGBPDPsy, EFASEPBPDPsy)
## [1] 0.9583779
## [1] 0.9272727
## [1] 0.9996892
cor(EFATOGBPDExe, EFASEPBPDExe, method = "pearson"); cor(EFATOGBPDExe, EFASEPBPDExe, method = "spearman"); CONGO(EFATOGBPDExe, EFASEPBPDExe)
## [1] 0.9642989
## [1] 0.9
## [1] 0.9966028
BPD1FNo <- '
VCI =~ SI + VC + IN 
PRI =~ MR + BD + VP
WMI =~ DS + AR
PSI =~ SS + CO

gPsy =~ VCI + PRI + WMI + PSI
gExe =~ LRF + CAT + JDG + MAZ + WGN

gPsy ~~ 0*gExe'

BPD1F <- '
VCI =~ SI + VC + IN 
PRI =~ MR + BD + VP
WMI =~ DS + AR
PSI =~ SS + CO

gPsy =~ VCI + PRI + WMI + PSI
gExe =~ LRF + CAT + JDG + MAZ + WGN

gPsy ~~ gExe'

BPD1FID <- '
VCI =~ SI + VC + IN 
PRI =~ MR + BD + VP
WMI =~ DS + AR
PSI =~ SS + CO

gPsy =~ VCI + PRI + WMI + PSI
gExe =~ LRF + CAT + JDG + MAZ + WGN

gPsy ~~ 1*gExe'

BPDNo.fit <- cfa(BPD1FNo, sample.cov = BPD.cor, sample.nobs = nBPD, std.lv = T)
BPD.fit <- cfa(BPD1F, sample.cov = BPD.cor, sample.nobs = nBPD, std.lv = T)
BPDID.fit <- cfa(BPD1FID, sample.cov = BPD.cor, sample.nobs = nBPD, std.lv = T)

round(cbind("No Relationship"   = fitMeasures(BPDNo.fit, FITM),
            "Free Relationship" = fitMeasures(BPD.fit, FITM),
            "Identical"         = fitMeasures(BPDID.fit, FITM)),3)
##                No Relationship Free Relationship Identical
## chisq                  304.945           164.742   164.743
## df                      86.000            85.000    86.000
## npar                    34.000            35.000    34.000
## cfi                      0.765             0.914     0.915
## rmsea                    0.111             0.068     0.067
## rmsea.ci.lower           0.098             0.052     0.051
## rmsea.ci.upper           0.125             0.083     0.082
## aic                   8048.816          7910.613  7908.614
## bic                   8161.798          8026.919  8021.596
summary(BPD.fit, stand = T, fit = T)
## lavaan 0.6-7 ended normally after 35 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free parameters                         35
##                                                       
##   Number of observations                           205
##                                                       
## Model Test User Model:
##                                                       
##   Test statistic                               164.742
##   Degrees of freedom                                85
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                              1035.564
##   Degrees of freedom                               105
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.914
##   Tucker-Lewis Index (TLI)                       0.894
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -3920.307
##   Loglikelihood unrestricted model (H1)      -3837.936
##                                                       
##   Akaike (AIC)                                7910.613
##   Bayesian (BIC)                              8026.919
##   Sample-size adjusted Bayesian (BIC)         7916.027
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.068
##   90 Percent confidence interval - lower         0.052
##   90 Percent confidence interval - upper         0.083
##   P-value RMSEA <= 0.05                          0.033
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.066
## 
## 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
##   VCI =~                                                                
##     SI                0.507    0.056    9.017    0.000    0.775    0.777
##     VC                0.506    0.056    9.006    0.000    0.773    0.775
##     IN                0.476    0.055    8.665    0.000    0.729    0.730
##   PRI =~                                                                
##     MR                0.380    0.060    6.319    0.000    0.585    0.587
##     BD                0.448    0.065    6.902    0.000    0.690    0.692
##     VP                0.438    0.064    6.851    0.000    0.675    0.676
##   WMI =~                                                                
##     DS                0.431    0.073    5.898    0.000    0.734    0.735
##     AR                0.411    0.069    5.964    0.000    0.699    0.700
##   PSI =~                                                                
##     SS                0.497    0.063    7.835    0.000    0.724    0.725
##     CO                0.533    0.069    7.701    0.000    0.776    0.778
##   gPsy =~                                                               
##     VCI               1.157    0.176    6.564    0.000    0.757    0.757
##     PRI               1.173    0.209    5.605    0.000    0.761    0.761
##     WMI               1.376    0.277    4.962    0.000    0.809    0.809
##     PSI               1.057    0.180    5.867    0.000    0.726    0.726
##   gExe =~                                                               
##     LRF               0.564    0.070    8.030    0.000    0.564    0.565
##     CAT               0.620    0.069    8.982    0.000    0.620    0.622
##     JDG               0.321    0.074    4.322    0.000    0.321    0.322
##     MAZ               0.409    0.073    5.594    0.000    0.409    0.410
##     WGN               0.640    0.069    9.333    0.000    0.640    0.642
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   gPsy ~~                                                               
##     gExe              0.999    0.044   22.901    0.000    0.999    0.999
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .SI                0.394    0.057    6.879    0.000    0.394    0.396
##    .VC                0.397    0.057    6.918    0.000    0.397    0.399
##    .IN                0.464    0.060    7.712    0.000    0.464    0.467
##    .MR                0.653    0.078    8.394    0.000    0.653    0.656
##    .BD                0.519    0.074    7.041    0.000    0.519    0.522
##    .VP                0.540    0.074    7.292    0.000    0.540    0.542
##    .DS                0.457    0.075    6.078    0.000    0.457    0.459
##    .AR                0.507    0.074    6.850    0.000    0.507    0.510
##    .SS                0.472    0.076    6.243    0.000    0.472    0.474
##    .CO                0.394    0.079    5.006    0.000    0.394    0.395
##    .LRF               0.677    0.075    9.088    0.000    0.677    0.681
##    .CAT               0.611    0.070    8.684    0.000    0.611    0.614
##    .JDG               0.892    0.090    9.887    0.000    0.892    0.896
##    .MAZ               0.828    0.085    9.703    0.000    0.828    0.832
##    .WGN               0.585    0.069    8.494    0.000    0.585    0.588
##    .VCI               1.000                               0.428    0.428
##    .PRI               1.000                               0.421    0.421
##    .WMI               1.000                               0.346    0.346
##    .PSI               1.000                               0.472    0.472
##     gPsy              1.000                               1.000    1.000
##     gExe              1.000                               1.000    1.000
resid(BPD.fit, "cor")
## $type
## [1] "cor.bollen"
## 
## $cov
##     SI     VC     IN     MR     BD     VP     DS     AR     SS     CO    
## SI   0.000                                                               
## VC   0.005  0.000                                                        
## IN  -0.010  0.004  0.000                                                 
## MR   0.024  0.019  0.062  0.000                                          
## BD  -0.077 -0.058 -0.017 -0.068  0.000                                   
## VP  -0.079 -0.079 -0.031 -0.038  0.074  0.000                            
## DS   0.001  0.032 -0.001  0.221 -0.002 -0.062  0.000                     
## AR  -0.038  0.049  0.101  0.158  0.020 -0.005  0.000  0.000              
## SS  -0.049 -0.066 -0.068 -0.005  0.098  0.069 -0.040 -0.063  0.000       
## CO   0.048 -0.045 -0.064  0.079 -0.022 -0.066  0.049 -0.014  0.000  0.000
## LRF  0.133  0.058  0.043 -0.037 -0.127 -0.096  0.067 -0.056 -0.099 -0.052
## CAT  0.081  0.057  0.061  0.094 -0.061 -0.066 -0.078  0.005 -0.010  0.005
## JDG  0.037  0.065  0.006  0.135 -0.129 -0.036  0.027  0.082 -0.036  0.029
## MAZ -0.141 -0.145 -0.127 -0.026  0.179  0.095 -0.011 -0.055  0.196  0.064
## WGN -0.025 -0.042  0.016  0.047  0.036  0.022 -0.050 -0.030  0.081  0.009
##     LRF    CAT    JDG    MAZ    WGN   
## SI                                    
## VC                                    
## IN                                    
## MR                                    
## BD                                    
## VP                                    
## DS                                    
## AR                                    
## SS                                    
## CO                                    
## LRF  0.000                            
## CAT  0.026  0.000                     
## JDG  0.020  0.028  0.000              
## MAZ  0.000 -0.033 -0.091  0.000       
## WGN  0.035 -0.025 -0.085  0.044  0.000

With a critical r of 0.137, there were six violations of local independence. There were none with p-value scaling (critical r = 0.231).

LATS <- list(
  VCI = c("SI", "VC", "IN"),
  PRI = c("MR", "BD", "VP"),
  WMI = c("DS", "AR"),
  PSI = c("SS", "CO"))

semPaths(BPD.fit, "model", "std", title = F, residuals = F, bifactor = c("gPsy", "gExe"), groups = "LATS", pastel = T, mar = c(2, 1, 3, 1), layout = "tree2", exoCov = T)

Wang et al. (2021)

fa.parallel(WEA.cor, n.obs =  nWEA)
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Parallel analysis suggests that the number of factors =  3  and the number of components =  2
fa.parallel(WEAPsy.cor, n.obs =  nWEA)

## Parallel analysis suggests that the number of factors =  2  and the number of components =  1
fa.parallel(WEAExe.cor, n.obs =  nWEA)

## Parallel analysis suggests that the number of factors =  1  and the number of components =  1
faWEA1 <- fa(WEA.cor, n.obs = nWEA, nfactors = 1)
faWEA2 <- fa(WEA.cor, n.obs = nWEA, nfactors = 2)
faWEA3 <- fa(WEA.cor, n.obs = nWEA, nfactors = 3)

faPsyWEA1 <- fa(WEAPsy.cor, n.obs = nWEA, nfactors = 1)
faPsyWEA2 <- fa(WEAPsy.cor, n.obs = nWEA, nfactors = 2)

faExeWEA <- fa(WEAExe.cor, n.obs = nWEA, nfactors = 1)

print(faWEA1$loadings)
## 
## Loadings:
##      MR1  
## SCT1 0.336
## SCT2 0.464
## SCT3 0.499
## CST  0.816
## BPT  0.571
## CFT  0.284
## ART  0.331
## 
##                  MR1
## SS loadings    1.759
## Proportion Var 0.251
print(faWEA2$loadings)
## 
## Loadings:
##      MR1    MR2   
## SCT1         0.376
## SCT2         0.525
## SCT3         0.844
## CST   0.684  0.234
## BPT   0.846 -0.107
## CFT   0.326       
## ART   0.311       
## 
##                MR1   MR2
## SS loadings    1.4 1.200
## Proportion Var 0.2 0.171
## Cumulative Var 0.2 0.371
print(faWEA3$loadings)
## 
## Loadings:
##      MR1    MR2    MR3   
## SCT1  0.135  0.330       
## SCT2         0.497       
## SCT3         0.883       
## CST   0.992              
## BPT   0.638 -0.111  0.162
## CFT                 0.794
## ART   0.136         0.332
## 
##                  MR1   MR2   MR3
## SS loadings    1.436 1.155 0.779
## Proportion Var 0.205 0.165 0.111
## Cumulative Var 0.205 0.370 0.481
print(faPsyWEA1$loadings)
## 
## Loadings:
##     MR1  
## CST 0.733
## BPT 0.811
## CFT 0.332
## ART 0.331
## 
##                  MR1
## SS loadings    1.415
## Proportion Var 0.354
print(faPsyWEA2$loadings)
## 
## Loadings:
##     MR1    MR2   
## CST  0.844       
## BPT  0.741       
## CFT         0.790
## ART  0.154  0.330
## 
##                  MR1   MR2
## SS loadings    1.285 0.737
## Proportion Var 0.321 0.184
## Cumulative Var 0.321 0.505
print(faExeWEA$loadings)
## 
## Loadings:
##      MR1  
## SCT1 0.352
## SCT2 0.512
## SCT3 0.938
## 
##                  MR1
## SS loadings    1.266
## Proportion Var 0.422
EFATOGWEA <- c(0.336, 0.464, 0.499, 0.816, 0.571, 0.284, 0.331)
EFATOGWEAPsy <- c(0.816, 0.571, 0.284, 0.331); EFATOGWEAExe <- c(0.336, 0.464, 0.499)
EFASEPWEA <- c(0.352, 0.512, 0.938, 0.733, 0.811, 0.332, 0.331)
EFASEPWEAPsy <- c(0.733, 0.811, 0.332, 0.331); EFASEPWEAExe <- c(0.352, 0.512, 0.938)

cor(EFATOGWEA, EFASEPWEA, method = "pearson"); cor(EFATOGWEA, EFASEPWEA, method = "spearman"); CONGO(EFATOGWEA, EFASEPWEA)
## [1] 0.7107018
## [1] 0.8214286
## [1] 0.961914
cor(EFATOGWEAPsy, EFASEPWEAPsy, method = "pearson"); cor(EFATOGWEAPsy, EFASEPWEAPsy, method = "spearman"); CONGO(EFATOGWEAPsy, EFASEPWEAPsy)
## [1] 0.8516381
## [1] 0.6
## [1] 0.9782143
cor(EFATOGWEAExe, EFASEPWEAExe, method = "pearson"); cor(EFATOGWEAExe, EFASEPWEAExe, method = "spearman"); CONGO(EFATOGWEAExe, EFASEPWEAExe)
## [1] 0.8394514
## [1] 1
## [1] 0.9638661
WEA1FNo <- '
Gf =~ CFT + ART 
WMC =~ CST + BPT

gPsy =~ Gf + WMC
gExe =~ SCT1 + SCT2 + SCT3

gPsy ~~ 0*gExe

CST ~~ 0*CST'

WEA1F <- '
Gf =~ CFT + ART 
WMC =~ CST + BPT

gPsy =~ Gf + WMC
gExe =~ SCT1 + SCT2 + SCT3

gPsy ~~ gExe

CST ~~ 0*CST'

WEA1FID <- '
Gf =~ CFT + ART 
WMC =~ CST + BPT

gPsy =~ Gf + WMC
gExe =~ SCT1 + SCT2 + SCT3

gPsy ~~ 1*gExe

CST ~~ 0*CST'

WEANo.fit <- cfa(WEA1FNo, sample.cov = WEA.cor, sample.nobs = nWEA, std.lv = T); "\n"
## Warning in lav_model_vcov(lavmodel = lavmodel, lavsamplestats = lavsamplestats, : lavaan WARNING:
##     Could not compute standard errors! The information matrix could
##     not be inverted. This may be a symptom that the model is not
##     identified.
## [1] "\n"
WEA.fit <- cfa(WEA1F, sample.cov = WEA.cor, sample.nobs = nWEA, std.lv = T)
WEAID.fit <- cfa(WEA1FID, sample.cov = WEA.cor, sample.nobs = nWEA, std.lv = T)

round(cbind("No Relationship"   = fitMeasures(WEANo.fit, FITM),
            "Free Relationship" = fitMeasures(WEA.fit, FITM),
            "Identical"         = fitMeasures(WEAID.fit, FITM)),3)
##                No Relationship Free Relationship Identical
## chisq                   62.597            25.385    31.619
## df                      13.000            12.000    13.000
## npar                    15.000            16.000    15.000
## cfi                      0.813             0.950     0.930
## rmsea                    0.133             0.072     0.082
## rmsea.ci.lower           0.101             0.032     0.046
## rmsea.ci.upper           0.167             0.111     0.118
## aic                   4070.031          4034.819  4039.052
## bic                   4120.590          4088.749  4089.612
summary(WEA.fit, stand = T, fit = T)
## lavaan 0.6-7 ended normally after 30 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free parameters                         16
##                                                       
##   Number of observations                           215
##                                                       
## Model Test User Model:
##                                                       
##   Test statistic                                25.385
##   Degrees of freedom                                12
##   P-value (Chi-square)                           0.013
## 
## Model Test Baseline Model:
## 
##   Test statistic                               286.555
##   Degrees of freedom                                21
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.950
##   Tucker-Lewis Index (TLI)                       0.912
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -2001.409
##   Loglikelihood unrestricted model (H1)      -1988.717
##                                                       
##   Akaike (AIC)                                4034.819
##   Bayesian (BIC)                              4088.749
##   Sample-size adjusted Bayesian (BIC)         4038.048
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.072
##   90 Percent confidence interval - lower         0.032
##   90 Percent confidence interval - upper         0.111
##   P-value RMSEA <= 0.05                          0.158
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.050
## 
## 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
##   Gf =~                                                                 
##     CFT               0.458    0.112    4.081    0.000    0.512    0.513
##     ART               0.523    0.130    4.009    0.000    0.584    0.585
##   WMC =~                                                                
##     CST               0.574    0.240    2.392    0.017    0.998    1.000
##     BPT               0.362    0.154    2.345    0.019    0.629    0.630
##   gPsy =~                                                               
##     Gf                0.497    0.182    2.727    0.006    0.445    0.445
##     WMC               1.420    0.890    1.595    0.111    0.818    0.818
##   gExe =~                                                               
##     SCT1              0.412    0.078    5.274    0.000    0.412    0.413
##     SCT2              0.607    0.079    7.694    0.000    0.607    0.608
##     SCT3              0.767    0.083    9.249    0.000    0.767    0.769
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   gPsy ~~                                                               
##     gExe              0.596    0.138    4.336    0.000    0.596    0.596
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .CST               0.000                               0.000    0.000
##    .CFT               0.733    0.127    5.784    0.000    0.733    0.737
##    .ART               0.655    0.151    4.345    0.000    0.655    0.658
##    .BPT               0.600    0.058   10.368    0.000    0.600    0.603
##    .SCT1              0.826    0.087    9.473    0.000    0.826    0.830
##    .SCT2              0.627    0.085    7.356    0.000    0.627    0.630
##    .SCT3              0.407    0.100    4.053    0.000    0.407    0.409
##    .Gf                1.000                               0.802    0.802
##    .WMC               1.000                               0.332    0.332
##     gPsy              1.000                               1.000    1.000
##     gExe              1.000                               1.000    1.000
resid(WEA.fit, "cor")
## $type
## [1] "cor.bollen"
## 
## $cov
##      CFT    ART    CST    BPT    SCT1   SCT2   SCT3  
## CFT   0.000                                          
## ART   0.000  0.000                                   
## CST   0.003 -0.003  0.000                            
## BPT   0.122  0.086  0.000  0.000                     
## SCT1 -0.086  0.096  0.069 -0.057  0.000              
## SCT2  0.017  0.056  0.013 -0.037 -0.071  0.000       
## SCT3 -0.005 -0.039 -0.025 -0.096  0.013  0.012  0.000

With a critical r of 0.134, there were no violations of local independence.

LATS <- list(
  Gf = c("CFT", "ART"),
  WMC = c("CST", "BPT"))

semPaths(WEA.fit, "model", "std", title = F, residuals = F, bifactor = c("gPsy", "gExe"), groups = "LATS", pastel = T, mar = c(2, 1, 3, 1), layout = "tree2", exoCov = T)

Conclusions

Yet another executive function battery - although small, with more similar than typical content - seems to indicate there’s a single g factor. This sample used the WAIS-IV and the NAB Executive Functions module with adults from Germany (mean age = 53.60). The second test - a reanalysis of the data from Wang et al. (2021), showed a less supportive result, with a correlation of r = 0.596 (mean age = 20.93), although the battery likely came with extreme psychometric sampling error.

References

Buczylowska, D., Petermann, F., & Daseking, M. (2020). Executive functions and intelligence from the CHC theory perspective: Investigating the correspondence between the WAIS-IV and the NAB Executive Functions Module. Journal of Clinical and Experimental Neuropsychology, 42(3), 240–250. https://doi.org/10.1080/13803395.2019.1705250

Wang, T., Li, C., Ren, X., & Schweizer, K. (2021). How Executive Processes Explain the Overlap between Working Memory Capacity and Fluid Intelligence: A Test of Process Overlap Theory. Journal of Intelligence, 9(2), 21. https://doi.org/10.3390/jintelligence9020021