Init

library(kirkegaard)
## Loading required package: tidyverse
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ ggplot2 3.3.6     ✔ purrr   0.3.4
## ✔ tibble  3.1.7     ✔ dplyr   1.0.9
## ✔ tidyr   1.2.0     ✔ stringr 1.4.0
## ✔ readr   2.1.2     ✔ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## Loading required package: magrittr
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
## The following object is masked from 'package:tidyr':
## 
##     extract
## Loading required package: weights
## Loading required package: Hmisc
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## Loading required package: assertthat
## 
## Attaching package: 'assertthat'
## The following object is masked from 'package:tibble':
## 
##     has_name
## Loading required package: psych
## 
## Attaching package: 'psych'
## The following object is masked from 'package:Hmisc':
## 
##     describe
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## 
## Attaching package: 'kirkegaard'
## The following object is masked from 'package:psych':
## 
##     rescale
## The following object is masked from 'package:assertthat':
## 
##     are_equal
## The following objects are masked from 'package:purrr':
## 
##     is_logical, is_numeric
## The following object is masked from 'package:base':
## 
##     +
load_packages(
  mirt,
  patchwork
)
## Loading required package: stats4
theme_set(theme_bw())

Data

d = read_csv("data/Benibouti.csv")
## Rows: 6328 Columns: 65
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (1): Sample
## dbl (64): ID, Age, Sex, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, B...
## 
## ℹ 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.
d$Sample %>% table2()
d_Djibouti = d %>% filter(Sample == "Djibouti")
d_Benin = d %>% filter(Sample == "Benin")

Analysis

item_names = d %>% select(A1:E12) %>% names()
item_names
##  [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10" "A11" "A12"
## [13] "B1"  "B2"  "B3"  "B4"  "B5"  "B6"  "B7"  "B8"  "B9"  "B10" "B11" "B12"
## [25] "C1"  "C2"  "C3"  "C4"  "C5"  "C6"  "C7"  "C8"  "C9"  "C10" "C11" "C12"
## [37] "D1"  "D2"  "D3"  "D4"  "D5"  "D6"  "D7"  "D8"  "D9"  "D10" "D11" "D12"
## [49] "E1"  "E2"  "E3"  "E4"  "E5"  "E6"  "E7"  "E8"  "E9"  "E10" "E11" "E12"
item_names %>% length()
## [1] 60
#items with using pass rate is every item except for A1
item_names_ok = item_names[-1]

#ages
ggplot(d, aes(Age, fill = Sample)) +
  geom_bar(position = "dodge") +
  scale_x_continuous("Age", breaks = 0:100)

#item data
items_all = tibble(
  name = item_names_ok,
  pass_rate = d[item_names_ok] %>% colMeans(na.rm = T)
)

items_benin = tibble(
  name = item_names_ok,
  pass_rate = d_Benin[item_names_ok] %>% colMeans(na.rm = T)
)

items_djibouti = tibble(
  name = item_names_ok,
  pass_rate = d_Djibouti[item_names_ok] %>% colMeans(na.rm = T)
)

#mirt
mirt_all = mirt(
  d[item_names_ok],
  model = 1
)
## 
Iteration: 1, Log-Lik: -169436.089, Max-Change: 1.02417
Iteration: 2, Log-Lik: -157836.717, Max-Change: 0.70066
Iteration: 3, Log-Lik: -156444.956, Max-Change: 0.30441
Iteration: 4, Log-Lik: -156313.807, Max-Change: 0.18053
Iteration: 5, Log-Lik: -156271.202, Max-Change: 0.09674
Iteration: 6, Log-Lik: -156247.834, Max-Change: 0.06686
Iteration: 7, Log-Lik: -156233.541, Max-Change: 0.05109
Iteration: 8, Log-Lik: -156226.195, Max-Change: 0.03911
Iteration: 9, Log-Lik: -156221.570, Max-Change: 0.02684
Iteration: 10, Log-Lik: -156218.928, Max-Change: 0.02293
Iteration: 11, Log-Lik: -156217.002, Max-Change: 0.01898
Iteration: 12, Log-Lik: -156215.700, Max-Change: 0.01555
Iteration: 13, Log-Lik: -156212.969, Max-Change: 0.00263
Iteration: 14, Log-Lik: -156212.916, Max-Change: 0.00193
Iteration: 15, Log-Lik: -156212.865, Max-Change: 0.00271
Iteration: 16, Log-Lik: -156212.732, Max-Change: 0.00331
Iteration: 17, Log-Lik: -156212.691, Max-Change: 0.00215
Iteration: 18, Log-Lik: -156212.666, Max-Change: 0.00206
Iteration: 19, Log-Lik: -156212.628, Max-Change: 0.00181
Iteration: 20, Log-Lik: -156212.605, Max-Change: 0.00186
Iteration: 21, Log-Lik: -156212.587, Max-Change: 0.00164
Iteration: 22, Log-Lik: -156212.523, Max-Change: 0.00116
Iteration: 23, Log-Lik: -156212.518, Max-Change: 0.00086
Iteration: 24, Log-Lik: -156212.514, Max-Change: 0.00078
Iteration: 25, Log-Lik: -156212.509, Max-Change: 0.00142
Iteration: 26, Log-Lik: -156212.506, Max-Change: 0.00036
Iteration: 27, Log-Lik: -156212.505, Max-Change: 0.00090
Iteration: 28, Log-Lik: -156212.502, Max-Change: 0.00046
Iteration: 29, Log-Lik: -156212.501, Max-Change: 0.00122
Iteration: 30, Log-Lik: -156212.499, Max-Change: 0.00155
Iteration: 31, Log-Lik: -156212.497, Max-Change: 0.00122
Iteration: 32, Log-Lik: -156212.496, Max-Change: 0.00031
Iteration: 33, Log-Lik: -156212.495, Max-Change: 0.00079
Iteration: 34, Log-Lik: -156212.494, Max-Change: 0.00039
Iteration: 35, Log-Lik: -156212.493, Max-Change: 0.00104
Iteration: 36, Log-Lik: -156212.492, Max-Change: 0.00027
Iteration: 37, Log-Lik: -156212.491, Max-Change: 0.00120
Iteration: 38, Log-Lik: -156212.491, Max-Change: 0.00036
Iteration: 39, Log-Lik: -156212.490, Max-Change: 0.00095
Iteration: 40, Log-Lik: -156212.490, Max-Change: 0.00042
Iteration: 41, Log-Lik: -156212.489, Max-Change: 0.00022
Iteration: 42, Log-Lik: -156212.488, Max-Change: 0.00055
Iteration: 43, Log-Lik: -156212.488, Max-Change: 0.00027
Iteration: 44, Log-Lik: -156212.487, Max-Change: 0.00072
Iteration: 45, Log-Lik: -156212.487, Max-Change: 0.00019
Iteration: 46, Log-Lik: -156212.487, Max-Change: 0.00083
Iteration: 47, Log-Lik: -156212.487, Max-Change: 0.00025
Iteration: 48, Log-Lik: -156212.486, Max-Change: 0.00065
Iteration: 49, Log-Lik: -156212.486, Max-Change: 0.00029
Iteration: 50, Log-Lik: -156212.486, Max-Change: 0.00075
Iteration: 51, Log-Lik: -156212.485, Max-Change: 0.00022
Iteration: 52, Log-Lik: -156212.485, Max-Change: 0.00020
Iteration: 53, Log-Lik: -156212.485, Max-Change: 0.00053
Iteration: 54, Log-Lik: -156212.485, Max-Change: 0.00014
Iteration: 55, Log-Lik: -156212.485, Max-Change: 0.00061
Iteration: 56, Log-Lik: -156212.485, Max-Change: 0.00018
Iteration: 57, Log-Lik: -156212.485, Max-Change: 0.00048
Iteration: 58, Log-Lik: -156212.485, Max-Change: 0.00022
Iteration: 59, Log-Lik: -156212.484, Max-Change: 0.00011
Iteration: 60, Log-Lik: -156212.484, Max-Change: 0.00028
Iteration: 61, Log-Lik: -156212.484, Max-Change: 0.00014
Iteration: 62, Log-Lik: -156212.484, Max-Change: 0.00037
Iteration: 63, Log-Lik: -156212.484, Max-Change: 0.00010
mirt_benin = mirt(
  d_Benin[item_names_ok],
  model = 1
)
## 
Iteration: 1, Log-Lik: -95025.823, Max-Change: 1.28639
Iteration: 2, Log-Lik: -86767.860, Max-Change: 0.77991
Iteration: 3, Log-Lik: -85493.928, Max-Change: 0.35571
Iteration: 4, Log-Lik: -85358.212, Max-Change: 0.23108
Iteration: 5, Log-Lik: -85310.509, Max-Change: 0.13574
Iteration: 6, Log-Lik: -85288.455, Max-Change: 0.08082
Iteration: 7, Log-Lik: -85276.408, Max-Change: 0.07561
Iteration: 8, Log-Lik: -85269.250, Max-Change: 0.05033
Iteration: 9, Log-Lik: -85264.400, Max-Change: 0.03974
Iteration: 10, Log-Lik: -85261.177, Max-Change: 0.03467
Iteration: 11, Log-Lik: -85259.121, Max-Change: 0.02558
Iteration: 12, Log-Lik: -85257.768, Max-Change: 0.02114
Iteration: 13, Log-Lik: -85255.037, Max-Change: 0.00609
Iteration: 14, Log-Lik: -85254.982, Max-Change: 0.00298
Iteration: 15, Log-Lik: -85254.944, Max-Change: 0.00244
Iteration: 16, Log-Lik: -85254.858, Max-Change: 0.00293
Iteration: 17, Log-Lik: -85254.832, Max-Change: 0.00140
Iteration: 18, Log-Lik: -85254.814, Max-Change: 0.00181
Iteration: 19, Log-Lik: -85254.785, Max-Change: 0.00151
Iteration: 20, Log-Lik: -85254.773, Max-Change: 0.00154
Iteration: 21, Log-Lik: -85254.763, Max-Change: 0.00117
Iteration: 22, Log-Lik: -85254.737, Max-Change: 0.00148
Iteration: 23, Log-Lik: -85254.731, Max-Change: 0.00117
Iteration: 24, Log-Lik: -85254.725, Max-Change: 0.00109
Iteration: 25, Log-Lik: -85254.701, Max-Change: 0.00059
Iteration: 26, Log-Lik: -85254.699, Max-Change: 0.00039
Iteration: 27, Log-Lik: -85254.698, Max-Change: 0.00040
Iteration: 28, Log-Lik: -85254.694, Max-Change: 0.00039
Iteration: 29, Log-Lik: -85254.693, Max-Change: 0.00036
Iteration: 30, Log-Lik: -85254.692, Max-Change: 0.00034
Iteration: 31, Log-Lik: -85254.688, Max-Change: 0.00035
Iteration: 32, Log-Lik: -85254.688, Max-Change: 0.00025
Iteration: 33, Log-Lik: -85254.687, Max-Change: 0.00025
Iteration: 34, Log-Lik: -85254.686, Max-Change: 0.00025
Iteration: 35, Log-Lik: -85254.685, Max-Change: 0.00021
Iteration: 36, Log-Lik: -85254.685, Max-Change: 0.00020
Iteration: 37, Log-Lik: -85254.684, Max-Change: 0.00023
Iteration: 38, Log-Lik: -85254.684, Max-Change: 0.00017
Iteration: 39, Log-Lik: -85254.684, Max-Change: 0.00016
Iteration: 40, Log-Lik: -85254.683, Max-Change: 0.00017
Iteration: 41, Log-Lik: -85254.683, Max-Change: 0.00013
Iteration: 42, Log-Lik: -85254.683, Max-Change: 0.00013
Iteration: 43, Log-Lik: -85254.682, Max-Change: 0.00015
Iteration: 44, Log-Lik: -85254.682, Max-Change: 0.00011
Iteration: 45, Log-Lik: -85254.682, Max-Change: 0.00010
Iteration: 46, Log-Lik: -85254.682, Max-Change: 0.00011
Iteration: 47, Log-Lik: -85254.682, Max-Change: 0.00009
mirt_djibouti = mirt(
  d_Djibouti[item_names_ok],
  model = 1
)
## 
Iteration: 1, Log-Lik: -68163.400, Max-Change: 1.09623
Iteration: 2, Log-Lik: -64582.070, Max-Change: 0.41521
Iteration: 3, Log-Lik: -64326.284, Max-Change: 0.15718
Iteration: 4, Log-Lik: -64303.599, Max-Change: 0.07771
Iteration: 5, Log-Lik: -64298.889, Max-Change: 0.03745
Iteration: 6, Log-Lik: -64296.787, Max-Change: 0.02305
Iteration: 7, Log-Lik: -64294.022, Max-Change: 0.00984
Iteration: 8, Log-Lik: -64293.300, Max-Change: 0.00926
Iteration: 9, Log-Lik: -64292.727, Max-Change: 0.00875
Iteration: 10, Log-Lik: -64290.737, Max-Change: 0.00492
Iteration: 11, Log-Lik: -64290.649, Max-Change: 0.00446
Iteration: 12, Log-Lik: -64290.575, Max-Change: 0.00414
Iteration: 13, Log-Lik: -64290.293, Max-Change: 0.00197
Iteration: 14, Log-Lik: -64290.279, Max-Change: 0.00167
Iteration: 15, Log-Lik: -64290.268, Max-Change: 0.00148
Iteration: 16, Log-Lik: -64290.226, Max-Change: 0.00066
Iteration: 17, Log-Lik: -64290.224, Max-Change: 0.00065
Iteration: 18, Log-Lik: -64290.222, Max-Change: 0.00038
Iteration: 19, Log-Lik: -64290.220, Max-Change: 0.00037
Iteration: 20, Log-Lik: -64290.219, Max-Change: 0.00036
Iteration: 21, Log-Lik: -64290.218, Max-Change: 0.00035
Iteration: 22, Log-Lik: -64290.214, Max-Change: 0.00026
Iteration: 23, Log-Lik: -64290.213, Max-Change: 0.00024
Iteration: 24, Log-Lik: -64290.213, Max-Change: 0.00022
Iteration: 25, Log-Lik: -64290.211, Max-Change: 0.00014
Iteration: 26, Log-Lik: -64290.211, Max-Change: 0.00014
Iteration: 27, Log-Lik: -64290.211, Max-Change: 0.00014
Iteration: 28, Log-Lik: -64290.210, Max-Change: 0.00010
Iteration: 29, Log-Lik: -64290.210, Max-Change: 0.00010
mirt_all %>% summary()
##            F1       h2
## A2   0.825873 6.82e-01
## A3   0.897825 8.06e-01
## A4   0.844157 7.13e-01
## A5   0.425902 1.81e-01
## A6   0.434699 1.89e-01
## A7   0.860622 7.41e-01
## A8   0.836762 7.00e-01
## A9   0.827553 6.85e-01
## A10  0.771630 5.95e-01
## A11  0.826930 6.84e-01
## A12  0.295526 8.73e-02
## B1   0.831518 6.91e-01
## B2   0.844162 7.13e-01
## B3   0.850983 7.24e-01
## B4   0.252869 6.39e-02
## B5   0.246125 6.06e-02
## B6   0.798345 6.37e-01
## B7   0.816658 6.67e-01
## B8   0.794854 6.32e-01
## B9   0.784361 6.15e-01
## B10  0.286886 8.23e-02
## B11  0.717972 5.15e-01
## B12  0.288543 8.33e-02
## C1   0.312548 9.77e-02
## C2   0.727221 5.29e-01
## C3   0.670004 4.49e-01
## C4   0.734566 5.40e-01
## C5   0.718707 5.17e-01
## C6   0.611028 3.73e-01
## C7  -0.107268 1.15e-02
## C8   0.801202 6.42e-01
## C9   0.163599 2.68e-02
## C10 -0.164128 2.69e-02
## C11 -0.129840 1.69e-02
## C12 -0.118473 1.40e-02
## D1   0.403002 1.62e-01
## D2   0.675594 4.56e-01
## D3   0.655783 4.30e-01
## D4   0.553737 3.07e-01
## D5   0.031677 1.00e-03
## D6  -0.018341 3.36e-04
## D7  -0.051631 2.67e-03
## D8  -0.022295 4.97e-04
## D9  -0.195893 3.84e-02
## D10 -0.000711 5.06e-07
## D11 -0.036192 1.31e-03
## D12 -0.049425 2.44e-03
## E1   0.073275 5.37e-03
## E2  -0.138435 1.92e-02
## E3   0.148993 2.22e-02
## E4  -0.070713 5.00e-03
## E5   0.087341 7.63e-03
## E6   0.426509 1.82e-01
## E7  -0.066799 4.46e-03
## E8   0.021223 4.50e-04
## E9  -0.071555 5.12e-03
## E10 -0.080564 6.49e-03
## E11 -0.094858 9.00e-03
## E12 -0.052415 2.75e-03
## 
## SS loadings:  16.463 
## Proportion Var:  0.279 
## 
## Factor correlations: 
## 
##    F1
## F1  1
mirt_benin %>% summary()
##            F1       h2
## A2   0.661446 4.38e-01
## A3   0.724436 5.25e-01
## A4   0.697762 4.87e-01
## A5  -0.095253 9.07e-03
## A6  -0.095253 9.07e-03
## A7   0.882081 7.78e-01
## A8   0.902048 8.14e-01
## A9   0.823146 6.78e-01
## A10  0.774914 6.00e-01
## A11  0.875149 7.66e-01
## A12 -0.100514 1.01e-02
## B1   0.502658 2.53e-01
## B2   0.660400 4.36e-01
## B3   0.833825 6.95e-01
## B4  -0.127841 1.63e-02
## B5  -0.114344 1.31e-02
## B6   0.886046 7.85e-01
## B7   0.880945 7.76e-01
## B8   0.860937 7.41e-01
## B9   0.880354 7.75e-01
## B10 -0.116155 1.35e-02
## B11  0.822822 6.77e-01
## B12 -0.098881 9.78e-03
## C1  -0.110490 1.22e-02
## C2   0.637017 4.06e-01
## C3   0.804715 6.48e-01
## C4   0.800257 6.40e-01
## C5   0.831775 6.92e-01
## C6   0.787257 6.20e-01
## C7  -0.030667 9.40e-04
## C8   0.816967 6.67e-01
## C9  -0.089808 8.07e-03
## C10 -0.263248 6.93e-02
## C11 -0.075098 5.64e-03
## C12 -0.065837 4.33e-03
## D1   0.510062 2.60e-01
## D2   0.697313 4.86e-01
## D3   0.690254 4.76e-01
## D4   0.647236 4.19e-01
## D5   0.002835 8.03e-06
## D6   0.003910 1.53e-05
## D7   0.088372 7.81e-03
## D8   0.156295 2.44e-02
## D9  -0.279466 7.81e-02
## D10 -0.083894 7.04e-03
## D11 -0.000238 5.67e-08
## D12 -0.000238 5.67e-08
## E1   0.073299 5.37e-03
## E2  -0.014321 2.05e-04
## E3   0.053004 2.81e-03
## E4   0.018489 3.42e-04
## E5   0.035912 1.29e-03
## E6   0.517665 2.68e-01
## E7  -0.029420 8.66e-04
## E8   0.037451 1.40e-03
## E9   0.039043 1.52e-03
## E10  0.052212 2.73e-03
## E11 -0.075651 5.72e-03
## E12  0.073442 5.39e-03
## 
## SS loadings:  16.132 
## Proportion Var:  0.273 
## 
## Factor correlations: 
## 
##    F1
## F1  1
mirt_djibouti %>% summary()
##           F1       h2
## A2   0.77906 6.07e-01
## A3   0.84023 7.06e-01
## A4   0.75106 5.64e-01
## A5   0.71151 5.06e-01
## A6   0.73943 5.47e-01
## A7   0.73601 5.42e-01
## A8   0.68569 4.70e-01
## A9   0.71820 5.16e-01
## A10  0.51671 2.67e-01
## A11  0.54369 2.96e-01
## A12  0.26500 7.02e-02
## B1   0.84780 7.19e-01
## B2   0.73297 5.37e-01
## B3   0.75174 5.65e-01
## B4   0.40590 1.65e-01
## B5   0.51799 2.68e-01
## B6   0.49294 2.43e-01
## B7   0.57054 3.26e-01
## B8   0.66853 4.47e-01
## B9   0.61803 3.82e-01
## B10  0.52982 2.81e-01
## B11  0.53818 2.90e-01
## B12  0.55756 3.11e-01
## C1   0.69650 4.85e-01
## C2   0.75862 5.76e-01
## C3   0.55673 3.10e-01
## C4   0.63811 4.07e-01
## C5   0.36718 1.35e-01
## C6   0.45722 2.09e-01
## C7  -0.07243 5.25e-03
## C8   0.67895 4.61e-01
## C9   0.08725 7.61e-03
## C10  0.06168 3.81e-03
## C11 -0.03316 1.10e-03
## C12 -0.08594 7.39e-03
## D1  -0.00907 8.23e-05
## D2   0.54323 2.95e-01
## D3   0.61701 3.81e-01
## D4  -0.00500 2.50e-05
## D5  -0.01970 3.88e-04
## D6   0.11805 1.39e-02
## D7   0.21552 4.64e-02
## D8   0.08288 6.87e-03
## D9  -0.24068 5.79e-02
## D10  0.23116 5.34e-02
## D11 -0.15754 2.48e-02
## D12 -0.16815 2.83e-02
## E1   0.28474 8.11e-02
## E2   0.10328 1.07e-02
## E3   0.12816 1.64e-02
## E4   0.04856 2.36e-03
## E5   0.16302 2.66e-02
## E6   0.10262 1.05e-02
## E7  -0.06773 4.59e-03
## E8  -0.11398 1.30e-02
## E9  -0.12145 1.47e-02
## E10 -0.15490 2.40e-02
## E11 -0.09337 8.72e-03
## E12 -0.20330 4.13e-02
## 
## SS loadings:  13.393 
## Proportion Var:  0.227 
## 
## Factor correlations: 
## 
##    F1
## F1  1
#get item data
items_all$loading = mirt_all %>% summary(verbose = F) %>% .$rotF %>% .[, 1]
items_all$difficulty = mirt_all %>% coef(simplify = T) %>% .$items %>% .[, 2]

items_benin$loading = mirt_benin %>% summary(verbose = F) %>% .$rotF %>% .[, 1]
items_benin$difficulty = mirt_benin %>% coef(simplify = T) %>% .$items %>% .[, 2]

items_djibouti$loading = mirt_djibouti %>% summary(verbose = F) %>% .$rotF %>% .[, 1]
items_djibouti$difficulty = mirt_djibouti %>% coef(simplify = T) %>% .$items %>% .[, 2]

#plot item data
bind_rows(
  items_benin %>% mutate(sample = "Benin"),
  items_djibouti %>% mutate(sample = "Djibouti")
) %>% mutate(
  name = factor(name, levels = item_names_ok)
) -> items_long

#multi-plot of item data
p_passrate = ggplot(items_long, aes(name, pass_rate, color = sample, group = sample)) +
  geom_point() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, .2))
  

  
p_loading = ggplot(items_long, aes(name, loading, color = sample, group = sample)) +
  geom_point() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2))

p_passrate / p_loading

#item par correlations
ggplot(items_long, aes(pass_rate, loading, color = sample)) +
  geom_point() +
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

#scores
d$g = fscores(mirt_all)[, 1]

#distributions
GG_denhist(d, "g", "Sample")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#age correlations
ggplot(d, aes(Age, g, color = Sample)) +
  geom_point(alpha = .1) +
  geom_smooth() +
  scale_x_continuous(breaks = 0:100)
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

#model
lm(g ~ Age + Sex, data = d) %>% summary()
## 
## Call:
## lm(formula = g ~ Age + Sex, data = d)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.2022 -0.7187 -0.1094  0.6796  2.8695 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.743220   0.062408  -11.91   <2e-16 ***
## Age          0.054558   0.003886   14.04   <2e-16 ***
## Sex          0.007243   0.024121    0.30    0.764    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9461 on 6325 degrees of freedom
## Multiple R-squared:  0.03034,    Adjusted R-squared:  0.03003 
## F-statistic: 98.95 on 2 and 6325 DF,  p-value: < 2.2e-16
lm(g ~ Age + Sex + Sample, data = d) %>% summary()
## 
## Call:
## lm(formula = g ~ Age + Sex + Sample, data = d)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.4444 -0.5504 -0.1039  0.5298  2.6375 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -0.673296   0.051388 -13.102   <2e-16 ***
## Age             0.088256   0.003257  27.096   <2e-16 ***
## Sex            -0.021300   0.019862  -1.072    0.284    
## SampleDjibouti -1.102831   0.020100 -54.867   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7788 on 6324 degrees of freedom
## Multiple R-squared:  0.3431, Adjusted R-squared:  0.3427 
## F-statistic:  1101 on 3 and 6324 DF,  p-value: < 2.2e-16
lm(g ~ Age + Sex + Sample, data = d) %>% stats::anova() %>% sjstats::anova_stats()
## Registered S3 method overwritten by 'parameters':
##   method                         from      
##   format.parameters_distribution datawizard