Intelligence
#reliability of the g score
g_items = read_csv("data/test_items.csv")
## New names:
## Rows: 28 Columns: 8
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (6): ...1, text, option_1, option_2, option_3, option_4 dbl (2): ID,
## option_correct
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
names(g_items)[1] = "var"
g_items %<>% filter(var %in% names(d))
g_items$correct = NA
for (i in seq_along(g_items$option_correct)) {
g_items$correct[i] = g_items[["option_"+g_items$option_correct[i]]][i]
}
#save updated version for easier use later
g_items %>% write_csv("data/g_items.csv")
#score items
scored_items = score_items(d[g_items$var], g_items$correct)
scored_items_count = miss_by_case(scored_items, reverse = T)
#mirt
mirt_fit = mirt(
scored_items,
model = 1,
itemtype = "2PL"
)
## Warning: data contains response patterns with only NAs
##
Iteration: 1, Log-Lik: -188768.194, Max-Change: 5.04127
Iteration: 2, Log-Lik: -167586.674, Max-Change: 0.93778
Iteration: 3, Log-Lik: -163943.799, Max-Change: 0.34531
Iteration: 4, Log-Lik: -162360.344, Max-Change: 0.28657
Iteration: 5, Log-Lik: -161709.787, Max-Change: 0.22768
Iteration: 6, Log-Lik: -161353.642, Max-Change: 0.16053
Iteration: 7, Log-Lik: -161173.781, Max-Change: 0.09737
Iteration: 8, Log-Lik: -161064.493, Max-Change: 0.22971
Iteration: 9, Log-Lik: -160991.363, Max-Change: 0.12791
Iteration: 10, Log-Lik: -160959.392, Max-Change: 0.07594
Iteration: 11, Log-Lik: -160939.094, Max-Change: 0.04297
Iteration: 12, Log-Lik: -160925.798, Max-Change: 0.04225
Iteration: 13, Log-Lik: -160916.474, Max-Change: 0.02643
Iteration: 14, Log-Lik: -160913.117, Max-Change: 0.01116
Iteration: 15, Log-Lik: -160909.698, Max-Change: 0.00764
Iteration: 16, Log-Lik: -160907.840, Max-Change: 0.00427
Iteration: 17, Log-Lik: -160907.466, Max-Change: 0.00338
Iteration: 18, Log-Lik: -160907.281, Max-Change: 0.00242
Iteration: 19, Log-Lik: -160907.163, Max-Change: 0.00138
Iteration: 20, Log-Lik: -160907.136, Max-Change: 0.00128
Iteration: 21, Log-Lik: -160907.121, Max-Change: 0.00118
Iteration: 22, Log-Lik: -160907.111, Max-Change: 0.00045
Iteration: 23, Log-Lik: -160907.109, Max-Change: 0.00028
Iteration: 24, Log-Lik: -160907.108, Max-Change: 0.00025
Iteration: 25, Log-Lik: -160907.108, Max-Change: 0.00024
Iteration: 26, Log-Lik: -160907.107, Max-Change: 0.00008
mirt_fit_scores = fscores(mirt_fit, full.scores = T, full.scores.SE = T)
#reliability
empirical_rxx(mirt_fit_scores)
## F1
## 0.549
#nominal fit
mirt_nom_fit = mirt(
scored_items,
model = 1,
itemtype = "nominal",
key = g_items$correct
)
## Warning: data contains response patterns with only NAs
##
Iteration: 1, Log-Lik: -219688.150, Max-Change: 10.27030
Iteration: 2, Log-Lik: -171900.111, Max-Change: 1.58927
Iteration: 3, Log-Lik: -164145.075, Max-Change: 1.55872
Iteration: 4, Log-Lik: -162478.435, Max-Change: 0.92017
Iteration: 5, Log-Lik: -161745.500, Max-Change: 0.55163
Iteration: 6, Log-Lik: -161366.631, Max-Change: 0.26386
Iteration: 7, Log-Lik: -161169.339, Max-Change: 0.25862
Iteration: 8, Log-Lik: -161055.112, Max-Change: 0.18176
Iteration: 9, Log-Lik: -160992.520, Max-Change: 0.09439
Iteration: 10, Log-Lik: -160957.504, Max-Change: 0.05866
Iteration: 11, Log-Lik: -160937.157, Max-Change: 0.02926
Iteration: 12, Log-Lik: -160924.448, Max-Change: 0.02496
Iteration: 13, Log-Lik: -160914.736, Max-Change: 0.01685
Iteration: 14, Log-Lik: -160911.074, Max-Change: 0.01045
Iteration: 15, Log-Lik: -160908.881, Max-Change: 0.00689
Iteration: 16, Log-Lik: -160907.361, Max-Change: 0.00419
Iteration: 17, Log-Lik: -160907.220, Max-Change: 0.00419
Iteration: 18, Log-Lik: -160907.150, Max-Change: 0.00172
Iteration: 19, Log-Lik: -160907.139, Max-Change: 0.00164
Iteration: 20, Log-Lik: -160907.125, Max-Change: 0.00135
Iteration: 21, Log-Lik: -160907.121, Max-Change: 0.00067
Iteration: 22, Log-Lik: -160907.116, Max-Change: 0.00060
Iteration: 23, Log-Lik: -160907.112, Max-Change: 0.00059
Iteration: 24, Log-Lik: -160907.110, Max-Change: 0.00019
Iteration: 25, Log-Lik: -160907.110, Max-Change: 0.00017
Iteration: 26, Log-Lik: -160907.109, Max-Change: 0.00041
Iteration: 27, Log-Lik: -160907.109, Max-Change: 0.00013
Iteration: 28, Log-Lik: -160907.109, Max-Change: 0.00011
Iteration: 29, Log-Lik: -160907.108, Max-Change: 0.00027
Iteration: 30, Log-Lik: -160907.108, Max-Change: 0.00045
Iteration: 31, Log-Lik: -160907.107, Max-Change: 0.00009
mirt_nom_fit_scores = fscores(mirt_nom_fit, full.scores = T, full.scores.SE = T)
#reliability
empirical_rxx(mirt_nom_fit_scores)
## F1
## 0.549
#save to main
d$g = mirt_fit_scores[, 1] %>% standardize(focal_group = d$race=="White")
## Warning in standardize(., focal_group = d$race == "White"): `focal_group`
## contains `NA` values. These were converted to `FALSE` following tidyverse
## convention.
d$g_nom = mirt_nom_fit_scores[, 1] %>% standardize(focal_group = d$race=="White")
## Warning in standardize(., focal_group = d$race == "White"): `focal_group`
## contains `NA` values. These were converted to `FALSE` following tidyverse
## convention.
d$g_items = scored_items_count
#reliability?
GG_scatter(d, "g", "g_nom")
## `geom_smooth()` using formula 'y ~ x'

#subset to more reliable subset
d2 = d %>% filter(g_items >= 5)
#reliability in subset
(rel = empirical_rxx(mirt_nom_fit_scores[scored_items_count >= 5, ]))
## F1
## 0.625
#restandardize because now norms have moved
#IQ by race
GG_group_means(d2, "g", "race")
## Missing values were removed.

d2$g %<>% standardize(focal_group = d2$race=="White")
## Warning in standardize(., focal_group = d2$race == "White"): `focal_group`
## contains `NA` values. These were converted to `FALSE` following tidyverse
## convention.
d2$g_nom %<>% standardize(focal_group = d2$race=="White")
## Warning in standardize(., focal_group = d2$race == "White"): `focal_group`
## contains `NA` values. These were converted to `FALSE` following tidyverse
## convention.
Main results
#counts
d2$orientation4 %>% table2()
d2$gender3 %>% table2()
#IQ by race
GG_group_means(d2, "g", "race", type = "point")
## Missing values were removed.

describeBy(d2$g, d2$race)
##
## Descriptive statistics by group
## group: White
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 24677 0 1 0.06 0.05 1.15 -3.5 1.79 5.29 -0.43 -0.48 0.01
## ------------------------------------------------------------
## group: Mixed
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 3240 -0.12 1.02 -0.12 -0.08 1.18 -3.56 1.79 5.35 -0.31 -0.61
## se
## X1 0.02
## ------------------------------------------------------------
## group: Asian
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1578 -0.18 0.99 -0.23 -0.15 1.2 -3.07 1.79 4.86 -0.22 -0.63 0.02
## ------------------------------------------------------------
## group: Hispanic / Latin
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1421 -0.55 0.96 -0.55 -0.55 0.97 -3.12 1.79 4.91 0.01 -0.56 0.03
## ------------------------------------------------------------
## group: Black
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1417 -0.53 1 -0.54 -0.52 1.02 -3.2 1.79 4.99 -0.07 -0.56 0.03
## ------------------------------------------------------------
## group: Other
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 952 -0.25 1.04 -0.23 -0.2 1.2 -3.34 1.79 5.13 -0.34 -0.56 0.03
## ------------------------------------------------------------
## group: Indian
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 352 -0.07 1.03 -0.2 -0.04 1.31 -3.25 1.77 5.03 -0.27 -0.56 0.06
## ------------------------------------------------------------
## group: Middle Eastern
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 155 -0.34 1.04 -0.32 -0.32 1.2 -2.97 1.74 4.71 -0.14 -0.65 0.08
## ------------------------------------------------------------
## group: Native American
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 71 -0.75 0.96 -0.84 -0.77 0.89 -3.07 1.21 4.28 0.05 -0.57 0.11
## ------------------------------------------------------------
## group: Pacific Islander
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 68 -0.56 0.95 -0.5 -0.57 1.07 -2.41 1.24 3.64 0.11 -0.93 0.12
#other orientations
GG_group_means(d2, "g", "orientation4", type = "point")
## Missing values were removed.

describeBy(d2$g, d2$orientation4)
##
## Descriptive statistics by group
## group: Straight
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 31770 -0.1 1.03 -0.11 -0.05 1.27 -3.56 1.79 5.35 -0.35 -0.58
## se
## X1 0.01
## ------------------------------------------------------------
## group: Bisexual
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 2714 0.08 1 0.25 0.16 0.95 -3.07 1.79 4.86 -0.65 -0.22 0.02
## ------------------------------------------------------------
## group: Gay
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 2165 -0.17 0.99 -0.2 -0.14 1.15 -3.07 1.79 4.86 -0.26 -0.53
## se
## X1 0.02
## ------------------------------------------------------------
## group: Other
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 326 0.5 0.88 0.67 0.56 0.8 -2.87 1.79 4.66 -0.71 0.04 0.05
#other genders
GG_group_means(d2, "g", "gender3", type = "point")
## Missing values were removed.

describeBy(d2$g, d2$gender3)
##
## Descriptive statistics by group
## group: Man
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 24793 -0.06 1.03 -0.05 -0.01 1.24 -3.56 1.79 5.35 -0.35 -0.56
## se
## X1 0.01
## ------------------------------------------------------------
## group: Woman
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 12073 -0.15 1.01 -0.15 -0.09 1.27 -3.25 1.79 5.04 -0.41 -0.58
## se
## X1 0.01
## ------------------------------------------------------------
## group: Other
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 109 0.49 0.86 0.67 0.55 0.75 -2.2 1.79 3.99 -0.7 0.01 0.08
#IQ by orientation
GG_group_means(d2, "g", "orientation4", "gender3", type = "point") +
labs(x = "Sexual orientation") +
scale_color_manual("Gender", values = c("blue", "red", "purple"))
## Missing values were removed.
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

GG_save("figs/sex_orientation.png")
#models
list(
main_eff = ols(g ~ gender3 + orientation4 + age, data = d2),
interact = ols(g ~ gender3 * orientation4 + age, data = d2),
full = ols(g ~ gender3 * orientation4 + race + age, data = d2)
) -> fit_models
fit_models %>% summarize_models(asterisks_only = F) %>% print(n=Inf)
## # A tibble: 27 × 4
## `Predictor/Model` main_eff interact full
## <chr> <chr> <chr> <chr>
## 1 Intercept -0.09 (0.025, <0.00… -0.09 (… 0.08…
## 2 gender3 = Man (ref) (ref) (ref)
## 3 gender3 = Woman -0.12 (0.012, <0.00… -0.12 (… -0.1…
## 4 gender3 = Other 0.10 (0.107, 0.335) 0.20 (0… 0.03…
## 5 orientation4 = Straight (ref) (ref) (ref)
## 6 orientation4 = Bisexual 0.24 (0.021, <0.001… 0.21 (0… 0.17…
## 7 orientation4 = Gay -0.08 (0.023, <0.00… -0.07 (… -0.0…
## 8 orientation4 = Other 0.59 (0.062, <0.001… 0.72 (0… 0.73…
## 9 age 0.00 (0.001, 0.33) 0.00 (0… 0.00…
## 10 gender3 = Woman * orientation4 = Bisexual <NA> 0.04 (0… 0.05…
## 11 gender3 = Other * orientation4 = Bisexual <NA> 0.26 (0… 0.30…
## 12 gender3 = Woman * orientation4 = Gay <NA> -0.01 (… 0.00…
## 13 gender3 = Other * orientation4 = Gay <NA> -0.06 (… -0.0…
## 14 gender3 = Woman * orientation4 = Other <NA> -0.20 (… -0.2…
## 15 gender3 = Other * orientation4 = Other <NA> -0.31 (… -0.2…
## 16 race = White <NA> <NA> (ref)
## 17 race = Mixed <NA> <NA> -0.1…
## 18 race = Asian <NA> <NA> -0.1…
## 19 race = Hispanic / Latin <NA> <NA> -0.5…
## 20 race = Black <NA> <NA> -0.5…
## 21 race = Other <NA> <NA> -0.2…
## 22 race = Indian <NA> <NA> -0.0…
## 23 race = Middle Eastern <NA> <NA> -0.3…
## 24 race = Native American <NA> <NA> -0.7…
## 25 race = Pacific Islander <NA> <NA> -0.5…
## 26 R2 adj. 0.008 0.008 0.033
## 27 N 36975 36975 33931
#plot model projections
ggeffects::ggpredict(fit_models[[2]], terms = c("orientation4", "gender3")) %>% plot()

#orientation vs. gender
list(
gender = ols(g ~ gender3 + age + race, data = d2),
orientation = ols(g ~ orientation4 + age + race, data = d2),
both = ols(g ~ gender3 + orientation4 + race + age, data = d2)
) -> fit_models2
fit_models2 %>%
summarize_models() %>%
print(n=Inf)
## # A tibble: 21 × 4
## `Predictor/Model` gender orientation both
## <chr> <chr> <chr> <chr>
## 1 Intercept 0.11 (0.026***) -0.02 (0.025) 0.08 (0.027**)
## 2 gender3 = Man (ref) <NA> (ref)
## 3 gender3 = Woman -0.11 (0.012***) <NA> -0.14 (0.012***)
## 4 gender3 = Other 0.47 (0.103***) <NA> 0.01 (0.113)
## 5 age 0.00 (0.001***) 0.00 (0.001) 0.00 (0.001)
## 6 race = White (ref) (ref) (ref)
## 7 race = Mixed -0.13 (0.019***) -0.13 (0.019***) -0.14 (0.019***)
## 8 race = Asian -0.17 (0.026***) -0.17 (0.026***) -0.15 (0.026***)
## 9 race = Hispanic / Latin -0.55 (0.027***) -0.54 (0.027***) -0.54 (0.027***)
## 10 race = Black -0.53 (0.027***) -0.52 (0.027***) -0.52 (0.027***)
## 11 race = Other -0.25 (0.033***) -0.26 (0.033***) -0.26 (0.033***)
## 12 race = Indian -0.09 (0.054) -0.06 (0.054) -0.08 (0.054)
## 13 race = Middle Eastern -0.35 (0.081***) -0.34 (0.080***) -0.35 (0.080***)
## 14 race = Native American -0.75 (0.119***) -0.76 (0.119***) -0.76 (0.118***)
## 15 race = Pacific Islander -0.56 (0.121***) -0.55 (0.121***) -0.55 (0.121***)
## 16 orientation4 = Straight <NA> (ref) (ref)
## 17 orientation4 = Bisexual <NA> 0.16 (0.021***) 0.21 (0.022***)
## 18 orientation4 = Gay <NA> -0.05 (0.023) -0.07 (0.023**)
## 19 orientation4 = Other <NA> 0.59 (0.058***) 0.60 (0.063***)
## 20 R2 adj. 0.027 0.029 0.033
## 21 N 33931 33931 33931
#reliability correction
fit_models$full %>% coef() %>% divide_by(sqrt(rel)) %>% round(3)
## Intercept gender3=Woman
## 0.104 -0.178
## gender3=Other orientation4=Bisexual
## 0.033 0.219
## orientation4=Gay orientation4=Other
## -0.086 0.926
## race=Mixed race=Asian
## -0.171 -0.195
## race=Hispanic / Latin race=Black
## -0.690 -0.659
## race=Other race=Indian
## -0.328 -0.106
## race=Middle Eastern race=Native American
## -0.441 -0.959
## race=Pacific Islander age
## -0.692 -0.002
## gender3=Woman * orientation4=Bisexual gender3=Other * orientation4=Bisexual
## 0.064 0.379
## gender3=Woman * orientation4=Gay gender3=Other * orientation4=Gay
## 0.000 -0.022
## gender3=Woman * orientation4=Other gender3=Other * orientation4=Other
## -0.266 -0.250
fit_models$full %>% coef() %>% divide_by(sqrt(rel)) %>% round(3) %>% multiply_by(15)
## Intercept gender3=Woman
## 1.560 -2.670
## gender3=Other orientation4=Bisexual
## 0.495 3.285
## orientation4=Gay orientation4=Other
## -1.290 13.890
## race=Mixed race=Asian
## -2.565 -2.925
## race=Hispanic / Latin race=Black
## -10.350 -9.885
## race=Other race=Indian
## -4.920 -1.590
## race=Middle Eastern race=Native American
## -6.615 -14.385
## race=Pacific Islander age
## -10.380 -0.030
## gender3=Woman * orientation4=Bisexual gender3=Other * orientation4=Bisexual
## 0.960 5.685
## gender3=Woman * orientation4=Gay gender3=Other * orientation4=Gay
## 0.000 -0.330
## gender3=Woman * orientation4=Other gender3=Other * orientation4=Other
## -3.990 -3.750
fit_models2$both %>% coef() %>% divide_by(sqrt(rel)) %>% round(3)
## Intercept gender3=Woman gender3=Other
## 0.104 -0.176 0.012
## orientation4=Bisexual orientation4=Gay orientation4=Other
## 0.268 -0.085 0.762
## race=Mixed race=Asian race=Hispanic / Latin
## -0.171 -0.195 -0.689
## race=Black race=Other race=Indian
## -0.659 -0.327 -0.105
## race=Middle Eastern race=Native American race=Pacific Islander
## -0.441 -0.959 -0.693
## age
## -0.002
fit_models2$gender %>% coef() %>% divide_by(sqrt(rel)) %>% round(3)
## Intercept gender3=Woman gender3=Other
## 0.142 -0.134 0.589
## age race=Mixed race=Asian
## -0.003 -0.164 -0.214
## race=Hispanic / Latin race=Black race=Other
## -0.701 -0.668 -0.319
## race=Indian race=Middle Eastern race=Native American
## -0.115 -0.447 -0.953
## race=Pacific Islander
## -0.712
fit_models2$orientation %>% coef() %>% divide_by(sqrt(rel)) %>% round(3)
## Intercept orientation4=Bisexual orientation4=Gay
## -0.024 0.199 -0.069
## orientation4=Other age race=Mixed
## 0.749 0.000 -0.166
## race=Asian race=Hispanic / Latin race=Black
## -0.220 -0.680 -0.664
## race=Other race=Indian race=Middle Eastern
## -0.326 -0.071 -0.427
## race=Native American race=Pacific Islander
## -0.957 -0.694