library(pacman); p_load(DT, psych, ggplot2, dplyr, kableExtra)
Sex differences in the variance of cognitive abilities are commonly noted. However, they are potentially confounded by mean performance differences between the sexes. Therefore, to get a better estimate, it can be edifying to regress variance ratios against standardized differences, taking the variance ratio at the point where differences are equal to zero as the estimated variance ratio free of this confounding effect. This is, however, an analytic procedure confounded by the effects of test bias and both sampling and measurement error as well as psychometric sampling error, which may inject mean-irrelevant effects on the variances. Therefore, to perform this analysis properly requires (1) the use of tests displaying measurement invariance (2) large samples (3) many tests and (4) diverse content. To this end, I will present data from a number of studies with modest-to-large samples and reasonably large numbers of diverse subtests. This analysis should be redone with invariance assured and differences or the lack thereof in latent variances should be investigated at the latent level to get to an answer to this question directly in a model where means and variances are obviously independent. This analysis is currently by no means comprehensive and my criteria for having enough subtests is basically arbitrary at the moment and obviously should be dependent on the diversity of those subtests.
Stated briefly, Variance Ratios - henceforth referred to as VRs - and Standardized Mean Differences - in terms of Cohen’s d or Hedge’s g where possible - are related in sex comparisons. The object of this analysis is the VR where there is no mean difference, \(VR_0\). In other terms,
\[VR_0 :=E[VR|d = 0]\]
If \(VR_0 > 1\), males are more variable when \(d = 0\). This indicates greater variability in general, again, provided measurement invariance or only partial or irrelevant violations - and these can be accounted for when discovered - and a lack of measurement and sampling error, as well as a lack of psychometric sampling error effects on both quantities used to calculate \(VR_0\). For the analysis, it should be noted that VRs must be log-transformed to prepare them for linear fitting and error constrains the relationship to some unknown degree, as it does in many analyses.
Everyone knows this dataset.
PT <- data.frame("d" = c(-0.28, 0.25, 0.02, -0.23, 0.31, 0.24, 0.51, 0.3, -0.05, 0.87, 0.89, 1.15, 0.22, -1.21, 0.78, -0.12, 0.25, -0.25, 0.38, 0, -0.02, 0.29, 0.41, -0.01, -0.15, -0.43, -0.1, -0.47, -0.36, 0.94, 0.6, 0.26, -0.11, 0.31, -0.33, -0.24, 0.13, -0.15, 0.12, 0.35, -0.26, -0.32, -0.19, -0.5, -0.31, -0.42, -0.32, -0.32, -0.46, -0.29, -0.15, 0.13, 0.91, 0.33, 0.26, 0.04, 0.11, 0.05, 0.09, 0.18, 0.12, -0.29), "VR" = c(1.93, 1.05, 1.11, 0.98, 1.26, 1.27, 1.28, 1.15, 1.08, 2.18, 2.72, 1.65, 0.99, 0.71, 1.67, 0.98, 1.27, 1.13, 1.06, 1.11, 1.02, 1.06, 1.51, 1.08, 1.33, 0.85, 1.05, 0.82, 0.87, 1.87, 1.84, 1.17, 1.18, 1.43, 0.93, 0.9, 1.3, 1.17, 1.12, 1.42, 1.01, 0.82, 0.93, 1.12, 1.44, 1.05, 1.24, 1.29, 1.25, 0.81, 1.16, 1.21, 1.45, 1.08, 1.27, 1.05, 1.06, 1.17, 1.15, 1.3, 1.2, 1.52))
describe(PT)
PT$logVR = log(PT$VR)
PTFit = lm(logVR ~ d, PT)
summary(PTFit)
##
## Call:
## lm(formula = logVR ~ d, data = PT)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.24812 -0.12365 -0.04039 0.06497 0.61727
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.15103 0.02307 6.547 1.47e-08 ***
## d 0.39564 0.05479 7.220 1.05e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.18 on 60 degrees of freedom
## Multiple R-squared: 0.4649, Adjusted R-squared: 0.456
## F-statistic: 52.13 on 1 and 60 DF, p-value: 1.052e-09
cor(PT$d, PT$VR)
## [1] 0.6493429
VR0 = unname(exp(PTFit$coefficients[1])); VR0
## [1] 1.163031
VR0_95 = unname(exp(confint(PTFit)[1,])); VR0_95
## [1] 1.110586 1.217952
ggplot(PT, aes(x = d, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Cohen's d", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Lakin (2013).
CAT <- data.frame("d" = c(-0.23, -0.11, -0.03, -0.01, 0.02, 0.01, 0.02, -0.12, -0.04, -0.05, -0.1, -0.11, -0.07, -0.04, -0.15, -0.14, -0.15, -0.07, -0.04, -0.1, -0.09, -0.14, -0.08, 0.02, -0.07, -0.07, -0.05, 0.12, -0.02, 0.06, 0.1, 0.07, 0.05, 0.06, 0.07, 0.02, 0.07, 0.05, 0.01, 0.01, 0.06, 0.12, 0.09, 0.04, -0.01, 0.04, 0.06, 0.03, 0.08, 0.13, 0.14, 0.15, 0.19, 0.15, 0.12, 0.22, -0.03, 0, 0.03, -0.02, -0.01, 0, 0.07, -0.05, 0.01, -0.04, -0.08, -0.12, -0.05, -0.01, -0.01, -0.06, -0.1, -0.06, -0.11, -0.12, -0.07, -0.01, 0.01, 0.05, 0.07, -0.04, -0.03, 0.07), "VR" = c(1.22, 1.23, 1.21, 1.2, 1.15, 1.11, 1.08, 1.16, 1.22, 1.15, 1.08, 0.98, 1.01, 1.04, 1.05, 1.14, 1.09, 1.15, 1.15, 1.08, 1.08, 0.96, 1.07, 1.23, 1.05, 1.07, 1.24, 1.32, 1.14, 1.17, 1.22, 1.19, 1.29, 1.19, 1.27, 1.28, 1.23, 1.34, 1.32, 1.27, 1.37, 1.49, 1.25, 1.25, 1.27, 1.31, 1.39, 1.34, 1.56, 1.38, 1.44, 1.6, 1.75, 1.45, 1.55, 1.51, 1.1, 1.18, 1.17, 1.14, 1.18, 1.14, 1.17, 1.1, 1.17, 1.18, 1.17, 1.14, 1.19, 1.31, 1.18, 1.17, 1.18, 1.32, 1.2, 1.25, 1.32, 1.18, 1.16, 1.2, 1.35, 1.1, 1.33, 1.26))
describe(CAT)
CAT$logVR = log(CAT$VR)
CATFit = lm(logVR ~ d, CAT)
summary(CATFit)
##
## Call:
## lm(formula = logVR ~ d, data = CAT)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.14244 -0.06028 -0.01102 0.04924 0.20803
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.201117 0.008563 23.486 < 2e-16 ***
## d 0.914335 0.100211 9.124 4.08e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.07835 on 82 degrees of freedom
## Multiple R-squared: 0.5038, Adjusted R-squared: 0.4977
## F-statistic: 83.25 on 1 and 82 DF, p-value: 4.076e-14
cor(CAT$d, CAT$VR)
## [1] 0.7110226
VR0 = unname(exp(CATFit$coefficients[1])); VR0
## [1] 1.222768
VR0_95 = unname(exp(confint(CATFit)[1,])); VR0_95
## [1] 1.202114 1.243776
ggplot(CAT, aes(x = d, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Cohen's d", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Deary et al. (2007).
DEA <- data.frame("d" = c(0.21, 0.17, -0.07, -0.21, -0.27, -0.48, 0.89, 0, 0.58, 0.56), "VR" = c(1.41, 1.25, 1.20, 1.17, 1.00, 0.88, 2.54, 1.14, 2.00, 1.91))
describe(DEA)
DEA$logVR = log(DEA$VR)
DEAFit = lm(logVR ~ d, DEA)
summary(DEAFit)
##
## Call:
## lm(formula = logVR ~ d, data = DEA)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.11946 -0.02382 0.01483 0.03456 0.10460
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.21278 0.02271 9.371 1.38e-05 ***
## d 0.76369 0.05254 14.535 4.92e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06804 on 8 degrees of freedom
## Multiple R-squared: 0.9635, Adjusted R-squared: 0.959
## F-statistic: 211.3 on 1 and 8 DF, p-value: 4.919e-07
cor(DEA$d, DEA$VR)
## [1] 0.9633377
VR0 = unname(exp(DEAFit$coefficients[1])); VR0
## [1] 1.23711
VR0_95 = unname(exp(confint(DEAFit)[1,])); VR0_95
## [1] 1.174002 1.303609
ggplot(DEA, aes(x = d, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Cohen's d", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Bakhiet et al. (2016).
BEA <- data.frame("g" = c(0.148, 0.267, -0.245, 0.067, 0.146, 0.190, 0.187, 0.271, 0.156, 0.081, -0.178, -0.079, 0.093), "VR" = c(0.952, 1.143, 1.029, 1.306, 0.974, 0.826, 1.061, 0.941, 0.972, 0.960, 1.164, 1.482, 1.249))
describe(BEA)
BEA$logVR = log(BEA$VR)
BEAFit = lm(logVR ~ g, BEA)
summary(BEAFit)
##
## Call:
## lm(formula = logVR ~ g, data = BEA)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.21471 -0.08975 -0.05156 0.14129 0.26091
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.10049 0.04865 2.065 0.0633 .
## g -0.40497 0.27702 -1.462 0.1717
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1536 on 11 degrees of freedom
## Multiple R-squared: 0.1627, Adjusted R-squared: 0.08656
## F-statistic: 2.137 on 1 and 11 DF, p-value: 0.1717
cor(BEA$g, BEA$VR)
## [1] -0.3990561
VR0 = unname(exp(BEAFit$coefficients[1])); VR0
## [1] 1.105714
VR0_95 = unname(exp(confint(BEAFit)[1,])); VR0_95
## [1] 0.9934287 1.2306903
ggplot(BEA, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Lim (1994).
LIM <- data.frame("g" = c(0.218, 0.170, -0.028, 0.162, 0.235, 0.024, 0.025, 0.399, 0.353, 0.333, 0.362, 0.398, 0.413, 0.416, -0.009, 0.117, 0.597, 0.050, 0.130, 0.473, 0.573, 0.356, 0.764), "VR" = c(0.995, 0.862, 1.023, 0.750, 0.799, 0.786, 1.120, 0.781, 0.657, 0.740, 0.572, 0.667, 0.715, 0.709, 0.881, 0.948, 0.655, 1.034, 1.149, 1.309, 0.640, 0.596, 0.532))
describe(LIM)
LIM$logVR = log(LIM$VR)
LIMFit = lm(logVR ~ g, LIM)
summary(LIMFit)
##
## Call:
## lm(formula = logVR ~ g, data = LIM)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.28015 -0.10555 -0.02102 0.05479 0.62605
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.02303 0.06820 -0.338 0.73891
## g -0.70562 0.19409 -3.636 0.00155 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1926 on 21 degrees of freedom
## Multiple R-squared: 0.3863, Adjusted R-squared: 0.357
## F-statistic: 13.22 on 1 and 21 DF, p-value: 0.001548
cor(LIM$g, LIM$VR)
## [1] -0.556253
VR0 = unname(exp(LIMFit$coefficients[1])); VR0
## [1] 0.9772293
VR0_95 = unname(exp(confint(LIMFit)[1,])); VR0_95
## [1] 0.8480123 1.1261360
ggplot(LIM, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Strand, Deary & Smith (2006).
SDS <- data.frame("d" = c(-0.16, -0.12, -0.15, 0.04, 0, -0.04, -0.14, -0.07, 0.09), "VR" = c(1.15, 1.13, 1.13, 1.1, 1.12, 1.16, 1.1, 1.17, 1.07))
describe(SDS)
SDS$logVR = log(SDS$VR)
SDSFit = lm(logVR ~ d, SDS)
summary(SDSFit)
##
## Call:
## lm(formula = logVR ~ d, data = SDS)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.035868 -0.010642 -0.005598 0.005689 0.037595
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.10764 0.01066 10.096 2.01e-05 ***
## d -0.16814 0.10202 -1.648 0.143
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.02595 on 7 degrees of freedom
## Multiple R-squared: 0.2796, Adjusted R-squared: 0.1766
## F-statistic: 2.716 on 1 and 7 DF, p-value: 0.1433
cor(SDS$d, SDS$VR)
## [1] -0.5222486
VR0 = unname(exp(SDSFit$coefficients[1])); VR0
## [1] 1.113646
VR0_95 = unname(exp(confint(SDSFit)[1,])); VR0_95
## [1] 1.085921 1.142079
ggplot(SDS, aes(x = d, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Cohen's d", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Johnson & Bouchard (2007).
JBO <- data.frame("g" = c(-0.058, -0.178, -0.256, -0.052, -0.051, 0.289, 0.072, 0.021, 0.365, -0.034, 0.092, -0.196, -0.226, -0.147, 0.027, -0.337, -0.243, -0.127, -0.058, -0.061, 0.090, 0.235, -0.112, -0.585, -0.372, -0.095, 0.429, 0.626, 0.022, 0.002, 0.282, 0.251, 0.393, 0.203, 0.180, 1.455, 0.449, 0.343, 0.251, 0.201, 0.574, 1.030), "VR" = c(1.037, 1.071, 1.121, 1.060, 1.189, 1.037, 1.173, 0.994, 1.260, 0.832, 1.190, 1.165, 1.049, 0.884, 1.047, 0.927, 0.934, 0.839, 1.037, 1.098, 0.913, 1.364, 0.784, 1.076, 0.698, 0.974, 0.893, 0.900, 0.897, 0.773, 0.814, 0.986, 1.291, 0.934, 0.830, 1.653, 0.929, 0.960, 0.852, 4.966, 1.042, 1.483))
describe(JBO)
JBO$logVR = log(JBO$VR)
JBOFit = lm(logVR ~ g, JBO)
summary(JBOFit)
##
## Call:
## lm(formula = logVR ~ g, data = JBO)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.29279 -0.15819 -0.02497 0.12387 1.53526
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.01863 0.04730 0.394 0.6958
## g 0.24242 0.12424 1.951 0.0581 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2931 on 40 degrees of freedom
## Multiple R-squared: 0.08691, Adjusted R-squared: 0.06408
## F-statistic: 3.807 on 1 and 40 DF, p-value: 0.05806
cor(JBO$g, JBO$VR)
## [1] 0.1887898
VR0 = unname(exp(JBOFit$coefficients[1])); VR0
## [1] 1.018804
VR0_95 = unname(exp(confint(JBOFit)[1,])); VR0_95
## [1] 0.925913 1.121013
ggplot(JBO, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Feingold (1992).
FEI <- data.frame("d" = c(0.05, 0.98, 0.24, -0.5, 0.05, 0.08, -0.43, -0.48, -0.03, 0.31, 0.01, 0.42, 0.24, 0.02, -0.04, 0.34, 0.09, 0.01, 0.18, 0.09, 0.18, 0.04, -0.34, -0.1, -0.21, -0.39, -0.42, 0), "VR" = c(1.11, 1.28, 1.21, 1.12, 0.96, 1.01, 0.99, 0.94, 1.05, 1.24, 1.05, 1.2, 1.16, 1.11, 1.06, 1.18, 1.02, 1.04, 1.08, 1.07, 1.12, 1.03, 0.91, 1.27, 1.34, 1.18, 1.3, 1.34))
describe(FEI)
FEI$logVR = log(FEI$VR)
FEIFit = lm(logVR ~ d, FEI)
summary(FEIFit)
##
## Call:
## lm(formula = logVR ~ d, data = FEI)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.166486 -0.069672 -0.009588 0.057935 0.207278
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.10674 0.01959 5.449 1.03e-05 ***
## d 0.10167 0.06280 1.619 0.118
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1035 on 26 degrees of freedom
## Multiple R-squared: 0.09158, Adjusted R-squared: 0.05664
## F-statistic: 2.621 on 1 and 26 DF, p-value: 0.1175
cor(FEI$d, FEI$VR)
## [1] 0.2859025
VR0 = unname(exp(FEIFit$coefficients[1])); VR0
## [1] 1.112646
VR0_95 = unname(exp(confint(FEIFit)[1,])); VR0_95
## [1] 1.068738 1.158359
ggplot(FEI, aes(x = d, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Cohen's d", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Steinmayr, Beauducel & Spinath (2010).
SBS <- data.frame("g" = c(0.036, 0.438, 0.119, 0.539, 0.481, 0.769, 0.340, 0.336, -0.120, 0.576, 0.603, 0.693), "VR" = c(1.147, 1.008, 0.920, 1.055, 0.877, 1.073, 1.063, 1.095, 1.235, 1.012, 1.337, 1.101))
describe(SBS)
SBS$logVR = log(SBS$VR)
SBSFit = lm(logVR ~ g, SBS)
summary(SBSFit)
##
## Call:
## lm(formula = logVR ~ g, data = SBS)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.195882 -0.051156 0.004627 0.043822 0.230915
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.08482 0.06371 1.331 0.213
## g -0.04197 0.13336 -0.315 0.759
##
## Residual standard error: 0.1201 on 10 degrees of freedom
## Multiple R-squared: 0.009809, Adjusted R-squared: -0.08921
## F-statistic: 0.09906 on 1 and 10 DF, p-value: 0.7594
cor(SBS$g, SBS$VR)
## [1] -0.1037211
VR0 = unname(exp(SBSFit$coefficients[1])); VR0
## [1] 1.088524
VR0_95 = unname(exp(confint(SBSFit)[1,])); VR0_95
## [1] 0.9444643 1.2545561
ggplot(SBS, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Keith et al. (2011).
KEAO <- data.frame("g" = c(0.082, -0.012, -0.064, 0.072, 0.161, 0.040, -0.125, -0.189, -0.053, -0.060, -0.079, -0.133, -0.151), "VR" = c(0.985, 1.187, 1.092, 1.116, 1.134, 1.093, 1.054, 1.015, 1.049, 1.066, 1.101, 1.074, 1.025))
describe(KEAO)
KEAO$logVR = log(KEAO$VR)
KEAOFit = lm(logVR ~ g, KEAO)
summary(KEAOFit)
##
## Call:
## lm(formula = logVR ~ g, data = KEAO)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.109375 -0.022017 0.002258 0.017298 0.094162
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.07944 0.01429 5.557 0.000171 ***
## g 0.18079 0.13390 1.350 0.204078
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.04792 on 11 degrees of freedom
## Multiple R-squared: 0.1422, Adjusted R-squared: 0.06418
## F-statistic: 1.823 on 1 and 11 DF, p-value: 0.2041
cor(KEAO$g, KEAO$VR)
## [1] 0.3843264
VR0 = unname(exp(KEAOFit$coefficients[1])); VR0
## [1] 1.082677
VR0_95 = unname(exp(confint(KEAOFit)[1,])); VR0_95
## [1] 1.049144 1.117281
ggplot(KEAO, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Reynolds et al. (2008).
REAO <- data.frame("g" = c(-0.018, 0.018, 0.116, 0.095, 0.170, -0.086, -0.054, -0.023, -0.154, 0.062, -0.176, 0.290, -0.130, 0.190, 0.084, -0.073), "VR" = c(0.970, 1.030, 1.154, 1.135, 0.861, 1.030, 0.907, 1.217, 1.075, 1.040, 1.106, 1.142, 0.963, 1.009, 1.049, 1.043))
describe(REAO)
REAO$logVR = log(REAO$VR)
REAOFit = lm(logVR ~ g, REAO)
summary(REAOFit)
##
## Call:
## lm(formula = logVR ~ g, data = REAO)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.195875 -0.045973 0.000677 0.070691 0.157026
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.04018 0.02368 1.697 0.112
## g 0.03550 0.18197 0.195 0.848
##
## Residual standard error: 0.09365 on 14 degrees of freedom
## Multiple R-squared: 0.002711, Adjusted R-squared: -0.06852
## F-statistic: 0.03806 on 1 and 14 DF, p-value: 0.8481
cor(REAO$g, REAO$VR)
## [1] 0.06630194
VR0 = unname(exp(REAOFit$coefficients[1])); VR0
## [1] 1.040997
VR0_95 = unname(exp(confint(REAOFit)[1,])); VR0_95
## [1] 0.9894524 1.0952276
ggplot(REAO, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From van der Linden, Dunkel & Madison (2017).
VDM <- data.frame("d" = c(0.02, 0.02, 0.01, 0.03, -0.43, 0.32, 0.02, -0.32, 0.02, 0.22), "VR" = c(1.041, 0.980, 1.105, 0.923, 1.108, 1.021, 1.083, 1.176, 1.296, 1.222))
describe(VDM)
VDM$logVR = log(VDM$VR)
VDMFit = lm(logVR ~ d, VDM)
summary(VDMFit)
##
## Call:
## lm(formula = logVR ~ d, data = VDM)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.163785 -0.043648 -0.009428 0.043637 0.174904
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.08582 0.03401 2.523 0.0356 *
## d -0.07198 0.16202 -0.444 0.6686
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1075 on 8 degrees of freedom
## Multiple R-squared: 0.02408, Adjusted R-squared: -0.09791
## F-statistic: 0.1974 on 1 and 8 DF, p-value: 0.6686
cor(VDM$d, VDM$VR)
## [1] -0.1418585
VR0 = unname(exp(VDMFit$coefficients[1])); VR0
## [1] 1.089609
VR0_95 = unname(exp(confint(VDMFit)[1,])); VR0_95
## [1] 1.007411 1.178513
ggplot(VDM, aes(x = d, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Cohen's d", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From Dolan et al. (2006).
DEA06 <- data.frame("g" = c(-0.127, -0.018, 0.500, 0.198, 0.345, 0.074, 0.150, -0.106, -0.130, 0.282, 0.122, 0.147, 0.098, 0.060), "VR" = c(1.258, 1.213, 0.988, 1.309, 0.952, 0.996, 1.342, 1.440, 1.005, 1.046, 1.131, 1.164, 1.131, 1.356))
describe(DEA06)
DEA06$logVR = log(DEA06$VR)
DEA06Fit = lm(logVR ~ g, DEA06)
summary(DEA06Fit)
##
## Call:
## lm(formula = logVR ~ g, data = DEA06)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.225792 -0.038422 -0.009929 0.109559 0.161191
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.18537 0.03947 4.696 0.000518 ***
## g -0.34932 0.18909 -1.847 0.089488 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1238 on 12 degrees of freedom
## Multiple R-squared: 0.2214, Adjusted R-squared: 0.1565
## F-statistic: 3.413 on 1 and 12 DF, p-value: 0.08949
cor(DEA06$g, DEA06$VR)
## [1] -0.4643879
VR0 = unname(exp(DEA06Fit$coefficients[1])); VR0
## [1] 1.203661
VR0_95 = unname(exp(confint(DEA06Fit)[1,])); VR0_95
## [1] 1.104471 1.311760
ggplot(DEA06, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From the Woodcock-Johnson I norming sample (\(n \approx 4,419\)).
WJIM <- subset(WJI, sex=="1")
WJIF <- subset(WJI, sex=="2")
describe(WJIM); describe(WJIF)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
WJID <- data.frame("g" = c(-0.176, -0.104, -0.072, -0.110, 0.171, -0.342, -0.336, 0.350, 0.265, -0.027, -0.373, -0.318, 0.216, 0.023, -0.136, -0.365, 0.365, -0.185, -0.034, -0.151, -0.173, -0.333, 0.026, -0.034, -0.059, -0.080, -0.044), "VR" = c(1.280, 1.059, 1.125, 1.143, 1.239, 1.306, 1.047, 1.096, 1.025, 1.102, 1.322, 1.087, 1.065, 1.205, 1.191, 1.239, 0.943, 1.004, 1.046, 0.831, 1.049, 1.040, 1.078, 0.995, 1.012, 1.024, 1.073))
describe(WJID)
WJID$logVR = log(WJID$VR)
WJIDFit = lm(logVR ~ g, WJID)
summary(WJIDFit)
##
## Call:
## lm(formula = logVR ~ g, data = WJID)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.28357 -0.06896 -0.01267 0.07172 0.16196
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.07683 0.02082 3.690 0.00109 **
## g -0.14318 0.09501 -1.507 0.14436
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1016 on 25 degrees of freedom
## Multiple R-squared: 0.08327, Adjusted R-squared: 0.0466
## F-statistic: 2.271 on 1 and 25 DF, p-value: 0.1444
cor(WJID$g, WJID$VR)
## [1] -0.3053065
VR0 = unname(exp(WJIDFit$coefficients[1])); VR0
## [1] 1.079855
VR0_95 = unname(exp(confint(WJIDFit)[1,])); VR0_95
## [1] 1.034526 1.127170
ggplot(WJID, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From the Woodcock-Johnson Revised norming sample (\(n \approx 5,818\)).
WJRM <- subset(WJR, sex=="0")
WJRF <- subset(WJR, sex=="1")
describe(WJRM); describe(WJRF)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
WJRD <- data.frame("g" = c(-0.213, -0.202, -0.107, -0.017, 0.138, -0.294, -0.370, 0.274, 0.226, -0.178, -0.089, -0.370, -0.391, -0.413, -0.279, -0.290, 0.114, 0.067, -0.185, -0.360, 0.172, 0.078, -0.035, -0.142, -0.190, -0.371, 0.015, 0.000, -0.093, -0.080, 0.027, -0.227, -0.074, -0.003, -0.044, -0.090, -0.304, 0.160, -0.067, 0.110, 0.146), "VR" = c(1.107, 1.105, 1.064, 1.334, 1.360, 1.222, 1.060, 1.254, 1.295, 1.036, 1.055, 1.177, 0.999, 0.958, 1.110, 1.017, 1.202, 1.380, 1.131, 1.163, 0.990, 1.142, 1.018, 1.015, 1.023, 1.041, 1.093, 1.082, 1.061, 0.990, 1.006, 0.982, 1.039, 1.040, 1.104, 1.069, 1.187, 0.978, 0.865, 1.167, 1.074))
describe(WJRD)
WJRD$logVR = log(WJRD$VR)
WJRDFit = lm(logVR ~ g, WJRD)
summary(WJRDFit)
##
## Call:
## lm(formula = logVR ~ g, data = WJRD)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.23746 -0.05312 -0.02225 0.04844 0.20947
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.10252 0.01713 5.984 5.45e-07 ***
## g 0.15059 0.08224 1.831 0.0747 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.09726 on 39 degrees of freedom
## Multiple R-squared: 0.07917, Adjusted R-squared: 0.05556
## F-statistic: 3.353 on 1 and 39 DF, p-value: 0.07473
cor(WJRD$g, WJRD$VR)
## [1] 0.2956343
VR0 = unname(exp(WJRDFit$coefficients[1])); VR0
## [1] 1.107961
VR0_95 = unname(exp(confint(WJRDFit)[1,])); VR0_95
## [1] 1.070223 1.147030
ggplot(WJRD, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
From the Woodcock-Johnson III norming sample (\(n \approx 7,812\)).
WJIIIM <- subset(WJIII, sex=="0")
WJIIIF <- subset(WJIII, sex=="1")
describe(WJIIIM); describe(WJIIIF)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
WJIIID <- data.frame("g" = c(-0.134, -0.108, -0.030, -0.011, 0.118, -0.296, 0.007, -0.096, 0.005, 0.136, -0.073, -0.284, -0.267, -0.456, 0.022, 0.108, 0.161, -0.239, 0.231, -0.181, -0.333, 0.126, 0.142, 0.008, 0.217, 0.114, 0.170, 0.159, 0.032, -0.266, -0.420, 0.076, -0.019, -0.088, 0.070, -0.336, 0.029, -0.021, -0.080, -0.317, -0.030, 0.055, -0.296, -0.064, -0.296), "VR" = c(1.103, 1.113, 1.157, 1.194, 1.152, 1.121, 1.029, 1.253, 1.044, 1.702, 1.111, 1.113, 1.060, 0.958, 1.002, 1.037, 1.081, 1.050, 1.116, 1.214, 0.939, 1.299, 1.042, 1.090, 1.252, 1.106, 1.031, 1.094, 1.217, 1.036, 1.068, 1.057, 1.017, 1.100, 1.100, 1.062, 1.246, 1.131, 1.139, 0.851, 1.098, 1.153, 1.006, 1.097, 0.992))
describe(WJIIID)
WJIIID$logVR = log(WJIIID$VR)
WJIIIDFit = lm(logVR ~ g, WJIIID)
summary(WJIIIDFit)
##
## Call:
## lm(formula = logVR ~ g, data = WJIIID)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.19424 -0.06132 -0.00317 0.04163 0.38636
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.11165 0.01491 7.490 2.53e-09 ***
## g 0.24844 0.07811 3.181 0.00273 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.09471 on 43 degrees of freedom
## Multiple R-squared: 0.1905, Adjusted R-squared: 0.1716
## F-statistic: 10.12 on 1 and 43 DF, p-value: 0.002725
cor(WJIIID$g, WJIIID$VR)
## [1] 0.4109988
VR0 = unname(exp(WJIIIDFit$coefficients[1])); VR0
## [1] 1.118126
VR0_95 = unname(exp(confint(WJIIIDFit)[1,])); VR0_95
## [1] 1.085013 1.152250
ggplot(WJIIID, aes(x = g, y = VR)) + geom_point(alpha = 0.5) + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Mean Differences and Variance Ratios", x = "Hedge's g", y = "Variance Ratio") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "gray", size = 1.25) + geom_hline(yintercept = 1, linetype = "dashed", color = "gray", size = 1.25)
## `geom_smooth()` using formula 'y ~ x'
| Data | \(VR_0\) | 95% CI |
|---|---|---|
| Project Talent | 1.16 | [1.11, 1.22] |
| CogAT | 1.22 | [1.20, 1.24] |
| NLSY ’79 Siblings | 1.24 | [1.17, 1.30] |
| Sudanese WISC-III | 1.11 | [0.99, 1.23] |
| Alice-Heim/Arlin | 0.98 | [0.85, 1.13] |
| UK CAT | 1.11 | [1.09, 1.14] |
| MSTRA | 1.02 | [0.93, 1.12] |
| Feingold’s Variety | 1.11 | [1.07, 1.16] |
| IST 2000-R | 1.09 | [0.94, 1.25] |
| DAS-II | 1.08 | [1.05, 1.12] |
| KABC-II | 1.04 | [0.99, 1.10] |
| HCP | 1.09 | [1.01, 1.18] |
| Spanish WAIS-III | 1.20 | [1.10, 1.31] |
| WJ-I | 1.08 | [1.03, 1.13] |
| WJ-R | 1.11 | [1.07, 1.15] |
| WJ-III | 1.12 | [1.09, 1.15] |
It looks as though men tend to be around 16% more variable when the difference in subtest means is at zero. It may be argued that some of these samples should not be included because they include small samples, and thus estimates that are too imprecise, as in the MSTRA data; I may return to that later. I may also return to add more datasets but datasets with large numbers of participants and subtests are rare.
Lakin, J. M. (2013). Sex differences in reasoning abilities: Surprising evidence that male–female ratios in the tails of the quantitative reasoning distribution have increased. Intelligence, 41(4), 263–274. https://doi.org/10.1016/j.intell.2013.04.004
Deary, I. J., Irwing, P., Der, G., & Bates, T. C. (2007). Brother–sister differences in the g factor in intelligence: Analysis of full, opposite-sex siblings from the NLSY1979. Intelligence, 35(5), 451–456. https://doi.org/10.1016/j.intell.2006.09.003
Bakhiet, S. F., Albursan, I. S., Qudah, M. F. A., Abduljabbar, A. S., Aljomaa, S. S., Toto, H. S. A., & Lynn, R. (2016). SEX DIFFERENCES ON THE WISC-III AMONG CHILDREN IN SUDAN AND THE UNITED STATES. Journal of Biosocial Science, 49(6), 792–797. https://doi.org/10.1017/S0021932016000432
Lim, T. K. (1994). Gender-related differences in intelligence: Application of confirmatory factor analysis. Intelligence, 19(2), 179–192. https://doi.org/10.1016/0160-2896(94)90012-4
Strand, S., Deary, I. J., & Smith, P. (2006). Sex differences in cognitive abilities test scores: A UK national picture. The British Journal of Educational Psychology, 76(Pt 3), 463–480. https://doi.org/10.1348/000709905X50906
Johnson, W., & Bouchard, T. J. (2007). Sex differences in mental abilities: G masks the dimensions on which they lie. Intelligence, 35(1), 23–39. https://doi.org/10.1016/j.intell.2006.03.012
Feingold, A. (1992). Sex Differences in Variability in Intellectual Abilities: A New Look at an Old Controversy. Review of Educational Research, 62(1), 61–84. https://doi.org/10.3102/00346543062001061
Steinmayr, R., Beauducel, A., & Spinath, B. (2010). Do sex differences in a faceted model of fluid and crystallized intelligence depend on the method applied? Intelligence, 38(1), 101–110. https://doi.org/10.1016/j.intell.2009.08.001
Keith, T. Z., Reynolds, M. R., Roberts, L. G., Winter, A. L., & Austin, C. A. (2011). Sex differences in latent cognitive abilities ages 5 to 17: Evidence from the Differential Ability Scales—Second Edition. Intelligence, 39(5), 389–404. https://doi.org/10.1016/j.intell.2011.06.008
Reynolds, M. R., Keith, T. Z., Ridley, K. P., & Patel, P. G. (2008). Sex differences in latent general and broad cognitive abilities for children and youth: Evidence from higher-order MG-MACS and MIMIC models. Intelligence, 36(3), 236–260. https://doi.org/10.1016/j.intell.2007.06.003
van der Linden, D., Dunkel, C. S., & Madison, G. (2017). Sex differences in brain size and general intelligence (g). Intelligence, 63, 78–88. https://doi.org/10.1016/j.intell.2017.04.007
Dolan, C. V., Colom, R., Abad, F. J., Wicherts, J. M., Hessen, D. J., & van de Sluis, S. (2006). Multi-group covariance and mean structure modeling of the relationship between the WAIS-III common factors and sex and educational attainment in Spain. Intelligence, 34(2), 193–210. https://doi.org/10.1016/j.intell.2005.09.003
The confidence intervals for variance ratios are very wide. A simulation will illustrate the need for large samples to assess this hypothesis. It seems that for reliable inference, per-group sample sizes need to be in excess of 1000 if the true variance is 16% greater for men.
set.seed(100)
N_min = 100 #Starting number of individuals per group
mu1 = 0 #Group 1 mean
mu2 = 0 #Group 2 mean
sigma1 = 1.0 #Group 1 SD
sigma2 = 1.077 #Group 2 SD
d_target = (mu2-mu1)/sqrt(1/2*sigma1^2 + 1/2*sigma2^2) #Theoretical Standardized Difference
VR_target = sigma2^2/sigma1^2 #Theoretical VR
running_quantile <- function(x, y, q, span = 10){
out = rep(NA, length(x))
for(i in 1:length(x)){
idx = seq(max(1,i-span),min(length(x),i + span))
out[i] = quantile(y[idx], q)}
out2 = rep(NA, length(x))
for(i in 1:length(x)){
idx = seq(max(1,i-span),min(length(x),i + span))
fit1 = lm(out[idx] ~ idx)
out2[i] = fit1$coefficients[1] + i*fit1$coefficients[2]}
return(out2)}
number_of_simulations = 2000
d = rep(NA, number_of_simulations)
VR = rep(NA, number_of_simulations)
N = N_min
for(i in 1:number_of_simulations){
X1 = rnorm(N, mean = mu1, sd = sigma1)
X2 = rnorm(N, mean = mu2, sd = sigma2)
d[i] = (mean(X2)-mean(X1))/sqrt(1/2*var(X1)+1/2*var(X2))
VR[i] = var(X2)/var(X1)
N = N + 1}
xx = N_min:(N_min+number_of_simulations - 1)
plot(xx, VR, main = "Simulated Variance Ratios Versus Sample Sizes", xlab = "Sample Size Per Group", ylab = "Sample Variance Ratio")
lines(c(min(xx), max(xx)), c(VR_target, VR_target), lty = 2, lwd = 2, col = "blue")
VR_p5 = running_quantile(xx, VR, 0.05, 50)
VR_p95 = running_quantile(xx, VR, 0.95, 50)
lines(xx, VR_p5, col = "red", lty = 2, lwd = 2)
lines(xx, VR_p95, col = "red", lty = 2, lwd = 2)