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(
readxl,
tidymodels,
ggrepel
)
## ── Attaching packages ────────────────────────────────────── tidymodels 0.2.0 ──
## ✔ broom 0.8.0 ✔ rsample 0.1.1
## ✔ dials 0.1.1 ✔ tune 0.2.0
## ✔ infer 1.0.0 ✔ workflows 0.2.6
## ✔ modeldata 0.1.1 ✔ workflowsets 0.2.1
## ✔ parsnip 0.2.1 ✔ yardstick 0.0.9
## ✔ recipes 0.2.0
## ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
## ✖ psych::%+%() masks ggplot2::%+%()
## ✖ scales::alpha() masks psych::alpha(), ggplot2::alpha()
## ✖ scales::discard() masks purrr::discard()
## ✖ recipes::discretize() masks kirkegaard::discretize()
## ✖ magrittr::extract() masks tidyr::extract()
## ✖ dplyr::filter() masks stats::filter()
## ✖ recipes::fixed() masks stringr::fixed()
## ✖ assertthat::has_name() masks tibble::has_name()
## ✖ kirkegaard::is_logical() masks purrr::is_logical()
## ✖ kirkegaard::is_numeric() masks purrr::is_numeric()
## ✖ dplyr::lag() masks stats::lag()
## ✖ magrittr::set_names() masks purrr::set_names()
## ✖ yardstick::spec() masks readr::spec()
## ✖ Hmisc::src() masks dplyr::src()
## ✖ recipes::step() masks stats::step()
## ✖ Hmisc::summarize() masks dplyr::summarize()
## ✖ parsnip::translate() masks Hmisc::translate()
## • Use suppressPackageStartupMessages() to eliminate package startup messages
theme_set(theme_bw())
options(
digits = 3
)
#SPI
SPI = read_excel("data/2014-2019-SPI-Public.xlsx", sheet = 2) %>%
df_legalize_names() %>%
rename(ISO = Code)
#Rindermann IQ data
Rindermann = read_excel("data/cognitive_capitalism_appendix.xlsx") %>%
df_legalize_names() %>%
mutate(ISO = pu_translate(Country, ad_level = 0))
## No exact match: Antigua-Barbuda
## No exact match: Benin (Dahomey)
## No exact match: Central Afric R
## No exact match: Congo (Brazz)
## No exact match: Dominican Repub
## No exact match: Equat. Guinea
## No exact match: Korea-North
## No exact match: Korea-South
## No exact match: Nether Antilles
## No exact match: Papua N-Guinea
## No exact match: Sao Tome/Princi
## No exact match: St. Kitts & Nevis
## No exact match: St. Vincent/Gre
## No exact match: Trinidad Tobago
## No exact match: United Arab Emi
## Best fuzzy match found: Antigua-Barbuda -> Antigua & Barbuda with distance 3.00
## Best fuzzy match found: Benin (Dahomey) -> Benin (ex Dahomey) with distance 3.00
## Best fuzzy match found: Central Afric R -> Central Africa with distance 2.00
## Best fuzzy match found: Congo (Brazz) -> Congo (Brazz rep) with distance 4.00
## Best fuzzy match found: Dominican Repub -> Dominican Rep. with distance 2.00
## Best fuzzy match found: Equat. Guinea -> Equ. Guinea with distance 2.00
## Best fuzzy match found: Korea-North -> Korea North with distance 1.00
## Best fuzzy match found: Korea-South -> Korea South with distance 1.00
## Best fuzzy match found: Nether Antilles -> Neth. Antilles with distance 2.00
## Best fuzzy match found: Papua N-Guinea -> Papua New Guinea with distance 3.00
## Best fuzzy match found: Sao Tome/Princi -> Sao Tome & Principe with distance 5.00
## Best fuzzy match found: St. Kitts & Nevis -> St. Kitts en Nevis with distance 2.00
## Best fuzzy match found: St. Vincent/Gre -> St. Vincent with distance 4.00
## Best fuzzy match found: Trinidad Tobago -> Trinidad & Tobago with distance 2.00
## Best fuzzy match found: United Arab Emi -> United Arab Emirates with distance 5.00
#smart fraction data, we need UN regions
sf = read_rds("data/smart fraction data_out.rds")
#becker IQs
becker = read_excel("data/NIQ-DATA (V1.3.3).xlsx", skip = 1, sheet = 2) %>%
df_legalize_names() %>%
mutate(ISO = pu_translate(Country, ad_level = 0)) %>%
filter(!is.na(ISO))
## No exact match: Central African Rep.
## No exact match: Korea, North
## No exact match: Saint Helena, Ascension, and Tristan da Cunha
## No exact match: Virgin Islands
## Best fuzzy match found: Central African Rep. -> Central African Republic with distance 5.00
## Best fuzzy match found: Korea, North -> Korea North with distance 1.00
## Best fuzzy match found: Saint Helena, Ascension, and Tristan da Cunha -> Saint Helena, Ascension and Tristan da Cunha with distance 1.00
## Warning: There were multiple equally good matches for Virgin Islands: Cayman
## Islands | Faroe Islands | Mariana Islands | Pitcairn Islands | U.S. Virgin
## Islands. All with distance 5.00
#world bank harmonized test scores
worldbank = read_csv("data/worldbank harmoized test scores.csv") %>%
filter(Indicator == "Harmonized Test Scores") %>%
df_legalize_names() %>%
rename(ISO = Country_ISO3)
## Rows: 4399 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): Country ISO3, Country Name, Indicator, Subindicator Type
## dbl (5): Indicator Id, 2010, 2017, 2018, 2020
##
## ℹ 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.
#no dups
assert_that(!anyDuplicated(SPI$ISO))
## [1] TRUE
assert_that(!anyDuplicated(Rindermann$ISO))
## [1] TRUE
assert_that(!anyDuplicated(sf$ISO))
## [1] TRUE
assert_that(!anyDuplicated(becker$ISO))
## [1] TRUE
assert_that(!anyDuplicated(worldbank$ISO))
## [1] TRUE
#join
d = full_join(SPI, Rindermann, by = "ISO") %>%
full_join(sf %>% select(ISO, UN_macroregion), by = "ISO") %>%
full_join(becker %>% select(ISO, QNWplusSASplusGEO), by = "ISO") %>%
full_join(worldbank %>% select(ISO, x2020), by = "ISO") %>%
filter(!is.na(ISO))
assert_that(!anyDuplicated(d$ISO))
## [1] TRUE
d = d %>% as.data.frame()
#rename some more
d %<>% mutate(
Lynn2012 = LyVa_IQc,
Becker2019 = QNWplusSASplusGEO,
Rindermann2018 = SAS_IQc,
Worldbank2020 = x2020
)
#IQ vars
IQ_vars = c("Lynn2012", "Becker2019", "Rindermann2018", "Worldbank2020")
#rescale worldbank to IQ scale
#use Rindermann as basis, find overlap set
R_wb_overlap = d %>% select(Rindermann2018, Worldbank2020, ISO) %>% na.omit()
(R_wb_overlap_sumstats = R_wb_overlap %>% describe2())
#rescale
d$Worldbank2020 = d$Worldbank2020 - R_wb_overlap_sumstats$mean[2]
d$Worldbank2020 = d$Worldbank2020 / R_wb_overlap_sumstats$sd[2]
d$Worldbank2020 = R_wb_overlap_sumstats$mean[1] + d$Worldbank2020 * R_wb_overlap_sumstats$sd[1]
#African ISOs
African_ISOs = d %>% filter(UN_macroregion == "Africa") %>% pull(ISO)
#SPI vars
SPI_vars = d %>% select(Undernourishment_pct_of_pop:Percent_of_tertiary_students_enrolled_in_globally_ranked_universities) %>% names()
#imputed SPI data, without IQs (prevent data leakage)
SPI_data_imp = d %>% select(!!SPI_vars) %>% miss_impute()
#direct estimates
d %>%
select(Lynn2012, Rindermann2018, Becker2019, Worldbank2020) %>%
describe2(group = d$UN_macroregion) %>%
select(group, var, mean) %>%
pivot_wider(id_cols = group, names_from = var, values_from = mean) %>%
filter(!is.na(group)) ->
IQ_regions
## 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 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 min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
IQ_regions
#correlations
IQ_regions[-1] %>% wtd.cors()
## Lynn2012 Rindermann2018 Becker2019 Worldbank2020
## Lynn2012 1.000 0.952 0.929 0.809
## Rindermann2018 0.952 1.000 0.983 0.971
## Becker2019 0.929 0.983 1.000 0.810
## Worldbank2020 0.809 0.971 0.810 1.000
#loop across
map_df(IQ_vars, function(v) {
local = d
#rename of ease of use
d$IQ = d[[v]]
local_no_afr = d_noAfr = d %>% filter(UN_macroregion != "Africa")
local_afr = d %>% filter(UN_macroregion == "Africa")
non_afr_lm = lm(IQ ~ Social_Progress_Index, data = local_no_afr)
tibble(
IQ_var = v,
mean_IQ = predict(non_afr_lm, newdata = local_afr) %>% wtd_mean(),
model = list(non_afr_lm)
)
}) -> SPI_lm_results
SPI_lm_results
SPI_lm_results$mean_IQ %>% mean()
## [1] 70.8
GG_scatter(d %>% filter(UN_macroregion != "Africa"), "Social_Progress_Index", "Worldbank2020", case_names = "ISO") +
geom_point(data = {
Afr = d %>% filter(UN_macroregion == "Africa")
tibble(
ISO = Afr$ISO,
Social_Progress_Index = Afr$Social_Progress_Index,
Worldbank2020 = predict(SPI_lm_results$model[[4]], newdata = Afr),
data = "imputed"
)
}, color = "red")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 11 rows containing missing values (geom_point).
GG_save("figs/SPI_africa.png")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 11 rows containing missing values (geom_point).
#first factor of SPI data
(SPI_fa = fa(SPI_data_imp))
## Warning in cor.smooth(R): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(R): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(R): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(r): Matrix was not positive definite, smoothing was done
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.
## Factor Analysis using method = minres
## Call: fa(r = SPI_data_imp)
## Standardized loadings (pattern matrix) based upon correlation matrix
## MR1
## Undernourishment_pct_of_pop -0.80
## Maternal_mortality_rate_deaths_100_000_live_births -0.83
## Child_mortality_rate_deaths_1_000_live_births -0.88
## Child_stunting_pct_of_children -0.88
## Deaths_from_infectious_diseases_deaths_100_000_people -0.80
## Access_to_at_least_basic_drinking_water_pct_of_pop 0.86
## Access_to_piped_water_pct_of_pop 0.84
## Access_to_at_least_basic_sanitation_facilities_pct_of_pop 0.84
## Rural_open_defecation_pct_of_pop -0.64
## Access_to_electricity_pct_of_pop 0.80
## Quality_of_electricity_supply_1_low_7_high 0.86
## Household_air_pollution_attributable_deaths_deaths_100_000_people -0.83
## Access_to_clean_fuels_and_technology_for_cooking_pct_of_pop 0.85
## Homicide_rate_deaths_100_000_people -0.13
## Perceived_criminality_1_low_5_high -0.59
## Political_killings_and_torture_0_low_freedom_1_high_freedom 0.64
## Traffic_deaths_deaths_100_000_people -0.68
## Adult_literacy_rate_pct_of_pop_aged_15plus 0.78
## Primary_school_enrollment_pct_of_children 0.64
## Secondary_school_enrollment_pct_of_children 0.90
## Gender_parity_in_secondary_enrollment_distance_from_parity 0.53
## Access_to_quality_education_0_unequal_4_equal 0.76
## Mobile_telephone_subscriptions_subscriptions_100_people 0.63
## Internet_users_pct_of_pop 0.90
## Access_to_online_governance_0_low_1_high 0.74
## Media_censorship_0_frequent_4_rare 0.45
## Life_expectancy_at_60_years 0.83
## Premature_deaths_from_non_communicable_diseases_deaths_100_000_people -0.58
## Access_to_essential_services_0_none_100_full_coverage 0.94
## Access_to_quality_healthcare_0_unequal_4_equal 0.84
## Outdoor_air_pollution_attributable_deaths_deaths_100_000_people -0.19
## Greenhouse_gas_emissions_CO2_equivalents_GDP -0.45
## Biome_protection 0.23
## Political_rights_0_no_rights_40_full_rights 0.61
## Freedom_of_expression_0_no_freedom_1_full_freedom 0.46
## Freedom_of_religion_0_no_freedom_4_full_freedom 0.33
## Access_to_justice_0_non_existent_1_observed 0.67
## Property_rights_for_women_0_no_rights_5_full_rights 0.67
## Vulnerable_employment_pct_of_employees -0.86
## Early_marriage_pct_of_women -0.75
## Satisfied_demand_for_contraception_pct_of_women 0.66
## Corruption_0_high_100_low 0.80
## Acceptance_of_gays_and_lesbians_0_low_100_high 0.62
## Discrimination_and_violence_against_minorities_1_low_10_high -0.47
## Equality_of_political_power_by_gender_0_unequal_power_4_equal_power 0.51
## Equality_of_political_power_by_socioeconomic_position_0_unequal_power_4_equal_power 0.47
## Equality_of_political_power_by_social_group_0_unequal_power_4_equal_power 0.46
## Years_of_tertiary_schooling 0.79
## Women_s_average_years_in_school 0.87
## Globally_ranked_universities_points 0.28
## Percent_of_tertiary_students_enrolled_in_globally_ranked_universities 0.56
## h2
## Undernourishment_pct_of_pop 0.640
## Maternal_mortality_rate_deaths_100_000_live_births 0.694
## Child_mortality_rate_deaths_1_000_live_births 0.780
## Child_stunting_pct_of_children 0.775
## Deaths_from_infectious_diseases_deaths_100_000_people 0.633
## Access_to_at_least_basic_drinking_water_pct_of_pop 0.742
## Access_to_piped_water_pct_of_pop 0.703
## Access_to_at_least_basic_sanitation_facilities_pct_of_pop 0.709
## Rural_open_defecation_pct_of_pop 0.410
## Access_to_electricity_pct_of_pop 0.645
## Quality_of_electricity_supply_1_low_7_high 0.743
## Household_air_pollution_attributable_deaths_deaths_100_000_people 0.695
## Access_to_clean_fuels_and_technology_for_cooking_pct_of_pop 0.722
## Homicide_rate_deaths_100_000_people 0.017
## Perceived_criminality_1_low_5_high 0.352
## Political_killings_and_torture_0_low_freedom_1_high_freedom 0.413
## Traffic_deaths_deaths_100_000_people 0.463
## Adult_literacy_rate_pct_of_pop_aged_15plus 0.612
## Primary_school_enrollment_pct_of_children 0.405
## Secondary_school_enrollment_pct_of_children 0.818
## Gender_parity_in_secondary_enrollment_distance_from_parity 0.282
## Access_to_quality_education_0_unequal_4_equal 0.572
## Mobile_telephone_subscriptions_subscriptions_100_people 0.396
## Internet_users_pct_of_pop 0.806
## Access_to_online_governance_0_low_1_high 0.545
## Media_censorship_0_frequent_4_rare 0.205
## Life_expectancy_at_60_years 0.688
## Premature_deaths_from_non_communicable_diseases_deaths_100_000_people 0.333
## Access_to_essential_services_0_none_100_full_coverage 0.879
## Access_to_quality_healthcare_0_unequal_4_equal 0.700
## Outdoor_air_pollution_attributable_deaths_deaths_100_000_people 0.034
## Greenhouse_gas_emissions_CO2_equivalents_GDP 0.206
## Biome_protection 0.052
## Political_rights_0_no_rights_40_full_rights 0.371
## Freedom_of_expression_0_no_freedom_1_full_freedom 0.213
## Freedom_of_religion_0_no_freedom_4_full_freedom 0.107
## Access_to_justice_0_non_existent_1_observed 0.444
## Property_rights_for_women_0_no_rights_5_full_rights 0.452
## Vulnerable_employment_pct_of_employees 0.743
## Early_marriage_pct_of_women 0.558
## Satisfied_demand_for_contraception_pct_of_women 0.432
## Corruption_0_high_100_low 0.641
## Acceptance_of_gays_and_lesbians_0_low_100_high 0.384
## Discrimination_and_violence_against_minorities_1_low_10_high 0.223
## Equality_of_political_power_by_gender_0_unequal_power_4_equal_power 0.263
## Equality_of_political_power_by_socioeconomic_position_0_unequal_power_4_equal_power 0.226
## Equality_of_political_power_by_social_group_0_unequal_power_4_equal_power 0.208
## Years_of_tertiary_schooling 0.618
## Women_s_average_years_in_school 0.760
## Globally_ranked_universities_points 0.077
## Percent_of_tertiary_students_enrolled_in_globally_ranked_universities 0.313
## u2
## Undernourishment_pct_of_pop 0.36
## Maternal_mortality_rate_deaths_100_000_live_births 0.31
## Child_mortality_rate_deaths_1_000_live_births 0.22
## Child_stunting_pct_of_children 0.22
## Deaths_from_infectious_diseases_deaths_100_000_people 0.37
## Access_to_at_least_basic_drinking_water_pct_of_pop 0.26
## Access_to_piped_water_pct_of_pop 0.30
## Access_to_at_least_basic_sanitation_facilities_pct_of_pop 0.29
## Rural_open_defecation_pct_of_pop 0.59
## Access_to_electricity_pct_of_pop 0.36
## Quality_of_electricity_supply_1_low_7_high 0.26
## Household_air_pollution_attributable_deaths_deaths_100_000_people 0.31
## Access_to_clean_fuels_and_technology_for_cooking_pct_of_pop 0.28
## Homicide_rate_deaths_100_000_people 0.98
## Perceived_criminality_1_low_5_high 0.65
## Political_killings_and_torture_0_low_freedom_1_high_freedom 0.59
## Traffic_deaths_deaths_100_000_people 0.54
## Adult_literacy_rate_pct_of_pop_aged_15plus 0.39
## Primary_school_enrollment_pct_of_children 0.60
## Secondary_school_enrollment_pct_of_children 0.18
## Gender_parity_in_secondary_enrollment_distance_from_parity 0.72
## Access_to_quality_education_0_unequal_4_equal 0.43
## Mobile_telephone_subscriptions_subscriptions_100_people 0.60
## Internet_users_pct_of_pop 0.19
## Access_to_online_governance_0_low_1_high 0.46
## Media_censorship_0_frequent_4_rare 0.79
## Life_expectancy_at_60_years 0.31
## Premature_deaths_from_non_communicable_diseases_deaths_100_000_people 0.67
## Access_to_essential_services_0_none_100_full_coverage 0.12
## Access_to_quality_healthcare_0_unequal_4_equal 0.30
## Outdoor_air_pollution_attributable_deaths_deaths_100_000_people 0.97
## Greenhouse_gas_emissions_CO2_equivalents_GDP 0.79
## Biome_protection 0.95
## Political_rights_0_no_rights_40_full_rights 0.63
## Freedom_of_expression_0_no_freedom_1_full_freedom 0.79
## Freedom_of_religion_0_no_freedom_4_full_freedom 0.89
## Access_to_justice_0_non_existent_1_observed 0.56
## Property_rights_for_women_0_no_rights_5_full_rights 0.55
## Vulnerable_employment_pct_of_employees 0.26
## Early_marriage_pct_of_women 0.44
## Satisfied_demand_for_contraception_pct_of_women 0.57
## Corruption_0_high_100_low 0.36
## Acceptance_of_gays_and_lesbians_0_low_100_high 0.62
## Discrimination_and_violence_against_minorities_1_low_10_high 0.78
## Equality_of_political_power_by_gender_0_unequal_power_4_equal_power 0.74
## Equality_of_political_power_by_socioeconomic_position_0_unequal_power_4_equal_power 0.77
## Equality_of_political_power_by_social_group_0_unequal_power_4_equal_power 0.79
## Years_of_tertiary_schooling 0.38
## Women_s_average_years_in_school 0.24
## Globally_ranked_universities_points 0.92
## Percent_of_tertiary_students_enrolled_in_globally_ranked_universities 0.69
## com
## Undernourishment_pct_of_pop 1
## Maternal_mortality_rate_deaths_100_000_live_births 1
## Child_mortality_rate_deaths_1_000_live_births 1
## Child_stunting_pct_of_children 1
## Deaths_from_infectious_diseases_deaths_100_000_people 1
## Access_to_at_least_basic_drinking_water_pct_of_pop 1
## Access_to_piped_water_pct_of_pop 1
## Access_to_at_least_basic_sanitation_facilities_pct_of_pop 1
## Rural_open_defecation_pct_of_pop 1
## Access_to_electricity_pct_of_pop 1
## Quality_of_electricity_supply_1_low_7_high 1
## Household_air_pollution_attributable_deaths_deaths_100_000_people 1
## Access_to_clean_fuels_and_technology_for_cooking_pct_of_pop 1
## Homicide_rate_deaths_100_000_people 1
## Perceived_criminality_1_low_5_high 1
## Political_killings_and_torture_0_low_freedom_1_high_freedom 1
## Traffic_deaths_deaths_100_000_people 1
## Adult_literacy_rate_pct_of_pop_aged_15plus 1
## Primary_school_enrollment_pct_of_children 1
## Secondary_school_enrollment_pct_of_children 1
## Gender_parity_in_secondary_enrollment_distance_from_parity 1
## Access_to_quality_education_0_unequal_4_equal 1
## Mobile_telephone_subscriptions_subscriptions_100_people 1
## Internet_users_pct_of_pop 1
## Access_to_online_governance_0_low_1_high 1
## Media_censorship_0_frequent_4_rare 1
## Life_expectancy_at_60_years 1
## Premature_deaths_from_non_communicable_diseases_deaths_100_000_people 1
## Access_to_essential_services_0_none_100_full_coverage 1
## Access_to_quality_healthcare_0_unequal_4_equal 1
## Outdoor_air_pollution_attributable_deaths_deaths_100_000_people 1
## Greenhouse_gas_emissions_CO2_equivalents_GDP 1
## Biome_protection 1
## Political_rights_0_no_rights_40_full_rights 1
## Freedom_of_expression_0_no_freedom_1_full_freedom 1
## Freedom_of_religion_0_no_freedom_4_full_freedom 1
## Access_to_justice_0_non_existent_1_observed 1
## Property_rights_for_women_0_no_rights_5_full_rights 1
## Vulnerable_employment_pct_of_employees 1
## Early_marriage_pct_of_women 1
## Satisfied_demand_for_contraception_pct_of_women 1
## Corruption_0_high_100_low 1
## Acceptance_of_gays_and_lesbians_0_low_100_high 1
## Discrimination_and_violence_against_minorities_1_low_10_high 1
## Equality_of_political_power_by_gender_0_unequal_power_4_equal_power 1
## Equality_of_political_power_by_socioeconomic_position_0_unequal_power_4_equal_power 1
## Equality_of_political_power_by_social_group_0_unequal_power_4_equal_power 1
## Years_of_tertiary_schooling 1
## Women_s_average_years_in_school 1
## Globally_ranked_universities_points 1
## Percent_of_tertiary_students_enrolled_in_globally_ranked_universities 1
##
## MR1
## SS loadings 24.70
## Proportion Var 0.48
##
## Mean item complexity = 1
## Test of the hypothesis that 1 factor is sufficient.
##
## The degrees of freedom for the null model are 1275 and the objective function was 94.7 with Chi Square of 22371
## The degrees of freedom for the model are 1224 and the objective function was 58.4
##
## The root mean square of the residuals (RMSR) is 0.13
## The df corrected root mean square of the residuals is 0.14
##
## The harmonic number of observations is 193 with the empirical chi square 8729 with prob < 0
## The total number of observations was 255 with Likelihood Chi Square = 13754 with prob < 0
##
## Tucker Lewis Index of factoring reliability = 0.379
## RMSEA index = 0.2 and the 90 % confidence intervals are 0.198 0.204
## BIC = 6972
## Fit based upon off diagonal values = 0.93
d$SPI_g = SPI_fa$scores[, 1]
#rerun with new score
map_df(IQ_vars, function(v) {
local = d
#rename of ease of use
d$IQ = d[[v]]
local_no_afr = d_noAfr = d %>% filter(UN_macroregion != "Africa")
local_afr = d %>% filter(UN_macroregion == "Africa")
non_afr_lm = lm(IQ ~ SPI_g, data = local_no_afr)
tibble(
IQ_var = v,
mean_IQ = predict(non_afr_lm, newdata = local_afr) %>% wtd_mean()
)
}) -> S_lm_results
S_lm_results
S_lm_results$mean_IQ %>% mean()
## [1] 69.3
#SPI and IQ vars
SPI_IQ = d %>% select(ISO, UN_macroregion, !!IQ_vars, !!SPI_vars)
#delete African data
for (v in IQ_vars) SPI_IQ[[v]][d$UN_macroregion == "Africa"] = NA
#impute them back
SPI_IQ_imp = miss_impute(SPI_IQ, leave_out = c("ISO", "UN_macroregion"))
#direct estimates
SPI_IQ_imp %>%
select(Lynn2012, Rindermann2018, Becker2019, Worldbank2020) %>%
describe2(group = SPI_IQ_imp$UN_macroregion) %>%
filter(group == "Africa") %>%
{
print(.)
mean(.$mean)
}
#loop across IQ variables
set.seed(1)
results_Afr = tibble()
for (IQ_var in IQ_vars) {
#local copy
SPI_IQ_subset = bind_cols(d %>% select(ISO, !!IQ_var),
SPI_data_imp
) %>% na.omit() %>% map_df(as.vector)
#rename IQ for easy consistency
SPI_IQ_subset %<>% rename(IQ = !!IQ_var)
#African countries split
SPI_IQ_subset_noAfr = SPI_IQ_subset %>% filter(!ISO %in% African_ISOs)
SPI_IQ_subset_Afr = SPI_IQ_subset %>% filter(ISO %in% African_ISOs)
dim(SPI_IQ_subset_noAfr)
dim(SPI_IQ_subset_Afr)
#make recipe
rr_recipe = recipe(
SPI_IQ_subset,
vars = SPI_IQ_subset %>% names(),
roles = c("ID", "outcome", rep("predictor", 51))
)
#model
rr_model = linear_reg(engine = "glmnet", mixture = 0, penalty = tune(), mode = "regression")
#cv folds
rr_folds = vfold_cv(SPI_IQ_subset_noAfr)
#workflow
rr_workflow = workflow() %>%
add_recipe(rr_recipe) %>%
add_model(rr_model)
#fit
rr_fit =
rr_workflow %>%
tune_grid(
resamples = rr_folds,
grid = expand_grid(penalty = 10^seq(0, 1.7, length = 20)),
control = control_grid(
save_pred = TRUE
)
)
#metrics
collect_metrics(rr_fit) %>%
filter(.metric == "rsq") %>%
arrange(.metric)
collect_metrics(rr_fit) %>%
ggplot(aes(penalty, mean)) +
geom_line() +
facet_wrap(".metric", scales = "free_y")
(best_tune = select_best(rr_fit, metric = "rmse"))
#collect preds
rr_preds = collect_predictions(rr_fit, parameters = best_tune) %>% arrange(.row)
#finalize
rr_fit_final = finalize_workflow(rr_workflow, parameters = best_tune) %>%
fit(data = SPI_IQ_subset_noAfr)
#predict for African hold-out set
rr_Afr_preds = bind_cols(
predict(rr_fit_final, new_data = SPI_IQ_subset_Afr),
ISO = SPI_IQ_subset_Afr$ISO
) %>% left_join(SPI_IQ_subset_Afr %>% select(IQ, ISO), by = "ISO")
#save results
results_Afr = bind_rows(
results_Afr,
tibble(
IQ_var = IQ_var,
r_nonAfr = rr_preds %$% wtd.cors(.pred, IQ) %>% as.numeric(),
slope_nonAfr = lm(IQ ~ .pred, data = rr_preds) %>% coef() %>% extract(2),
rmse_nonAfr = rmse(rr_preds, IQ, .pred) %>% pull(.estimate),
r_Afr = rr_Afr_preds %$% wtd.cors(.pred, IQ) %>% as.numeric(),
slope_Afr = lm(IQ ~ .pred, data = rr_Afr_preds) %>% coef() %>% extract(2),
rmse_Afr = rmse(rr_Afr_preds, IQ, .pred) %>% pull(.estimate),
mean_Afr = wtd_mean(rr_Afr_preds$.pred)
)
)
}
#show results
results_Afr
results_Afr$mean_Afr %>% mean()
This has everything from above in one double loop so we can get results across regions and IQ variables.
#western countries
regional_ISO_groups = d %>% filter(!is.na(UN_macroregion)) %>% plyr::dlply("UN_macroregion", function(dd) dd$ISO)
length(regional_ISO_groups)
## [1] 14
#loop across 2 levels: regional groups, and IQ variables
set.seed(1)
region_results = map2_df(regional_ISO_groups, names(regional_ISO_groups), function(group_ISOs, region) {
# browser()
#status
message(str_glue("Current region group: {region}"))
#SPI index
SPI_lm_results = map_df(IQ_vars, function(v) {
local = d
#rename of ease of use
d$IQ = d[[v]]
local_noX = d %>% filter(!ISO %in% group_ISOs)
local_X = d %>% filter(ISO %in% group_ISOs)
noX_lm = lm(IQ ~ Social_Progress_Index, data = local_noX)
tibble(
IQ_var = v,
mean_X = predict(noX_lm, newdata = local_X) %>% wtd_mean()
)
})
#rerun with new score
S_lm_results = map_df(IQ_vars, function(v) {
local = d
#rename of ease of use
d$IQ = d[[v]]
local_noX = d %>% filter(!ISO %in% group_ISOs)
local_X = d %>% filter(ISO %in% group_ISOs)
noX_lm = lm(IQ ~ SPI_g, data = local_noX)
tibble(
IQ_var = v,
mean_X = predict(noX_lm, newdata = local_X) %>% wtd_mean()
)
})
#SPI and IQ vars
SPI_IQ = d %>% select(ISO, UN_macroregion, !!IQ_vars, !!SPI_vars)
#delete African data
for (v in IQ_vars) SPI_IQ[[v]][d$ISO %in% group_ISOs] = NA
#impute them back
SPI_IQ_imp = miss_impute(SPI_IQ, leave_out = c("ISO", "UN_macroregion"))
#direct estimates
irmi_results = SPI_IQ_imp %>%
select(Lynn2012, Rindermann2018, Becker2019, Worldbank2020) %>%
describe2(group = SPI_IQ_imp$UN_macroregion) %>%
filter(group == region)
#ridge regression
rr_results = map_df(IQ_vars, function(IQ_var) {
#status
# message(str_glue("Current IQ var: {IQ_var}"))
#local copy
SPI_IQ_subset = bind_cols(d %>% select(ISO, !!IQ_var),
SPI_data_imp
) %>% na.omit() %>% map_df(as.vector)
#rename IQ for easy consistency
SPI_IQ_subset %<>% rename(IQ = !!IQ_var)
#countries split
SPI_IQ_subset_X = SPI_IQ_subset %>% filter(ISO %in% group_ISOs)
SPI_IQ_subset_noX = SPI_IQ_subset %>% filter(!ISO %in% group_ISOs)
#make recipe
rr_recipe = recipe(
SPI_IQ_subset,
vars = SPI_IQ_subset %>% names(),
roles = c("ID", "outcome", rep("predictor", 51))
)
#model
rr_model = linear_reg(engine = "glmnet", mixture = 0, penalty = tune(), mode = "regression")
#cv folds
rr_folds = vfold_cv(SPI_IQ_subset_noX)
#workflow
rr_workflow = workflow() %>%
add_recipe(rr_recipe) %>%
add_model(rr_model)
#fit
rr_fit =
rr_workflow %>%
tune_grid(
resamples = rr_folds,
grid = expand_grid(penalty = 10^seq(0, 1.7, length = 20)),
control = control_grid(
save_pred = TRUE
)
)
#metrics
collect_metrics(rr_fit) %>%
filter(.metric == "rsq") %>%
arrange(.metric)
collect_metrics(rr_fit) %>%
ggplot(aes(penalty, mean)) +
geom_line() +
facet_wrap(".metric", scales = "free_y")
(best_tune = select_best(rr_fit, metric = "rmse"))
#collect preds
rr_preds = collect_predictions(rr_fit, parameters = best_tune) %>% arrange(.row)
#finalize
rr_fit_final = finalize_workflow(rr_workflow, parameters = best_tune) %>%
fit(data = SPI_IQ_subset_noX)
#predict for hold-out set
rr_X_preds = bind_cols(
predict(rr_fit_final, new_data = SPI_IQ_subset_X),
ISO = SPI_IQ_subset_X$ISO
) %>% left_join(SPI_IQ_subset_X %>% select(IQ, ISO), by = "ISO")
#save results
#if fail, return empty results for this combination
y = try_else(expr = {
tibble(
IQ_var = IQ_var,
r_noX = rr_preds %$% wtd.cors(.pred, IQ) %>% as.numeric(),
slope_noX = lm(IQ ~ .pred, data = rr_preds) %>% coef() %>% extract(2),
rmse_noX = rmse(rr_preds, IQ, .pred) %>% pull(.estimate),
r_X = rr_X_preds %$% wtd.cors(.pred, IQ) %>% as.numeric(),
slope_X = lm(IQ ~ .pred, data = rr_X_preds) %>% coef() %>% extract(2),
rmse_X = rmse(rr_X_preds, IQ, .pred) %>% pull(.estimate),
mean_X = wtd_mean(rr_X_preds$.pred)
)
}, else. = tibble())
y
}
) #end of rr map
#bind and add region
bind_rows(
SPI_lm_results %>% mutate(method = "SPI + lm"),
S_lm_results %>% mutate(method = "SPI g + lm"),
irmi_results %>% select(mean, var) %>% rename(mean_X = mean, IQ_var = var) %>% mutate(method = "IRMI"),
rr_results %>% mutate(method = "ridge regression")
) %>% mutate(region = region)
})
## Current region group: N & W Europe + offshoots
## Current region group: Caribbean
## Current region group: Latin America
## Current region group: Central Asia
## Current region group: Africa
## Current region group: Eastern Asia
## Current region group: Eastern Europe
## Current region group: Melanesia
## Warning in cbind2(1, newx): number of rows of result is not a multiple of vector
## length (arg 1)
## Current region group: Micronesia
## Warning in cbind2(1, newx): number of rows of result is not a multiple of vector
## length (arg 1)
## Current region group: MENA
## Current region group: Polynesia
## Warning in cbind2(1, newx): number of rows of result is not a multiple of vector
## length (arg 1)
## Current region group: South-Eastern Asia
## Current region group: Southern Asia
## Current region group: Southern Europe
region_results
#combine with observed scores
region_results_combined = full_join(
IQ_regions %>% pivot_longer(cols = -group, names_to = "IQ_var", values_to = "observed_mean_IQ") %>% rename(region = group),
region_results %>% select(IQ_var, region, mean_X, method) %>% rename(imputed_mean_IQ = mean_X),
by = c("IQ_var", "region")
)
#plot
region_results_combined %>%
ggplot(aes(observed_mean_IQ, imputed_mean_IQ)) +
geom_point() +
geom_smooth(method = "lm", aes(group = NULL)) +
geom_text_repel(aes(label = region), size = 2.5) +
facet_wrap(c("IQ_var", "method"))
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).
## Warning: Removed 15 rows containing missing values (geom_text_repel).
## Warning: ggrepel: 12 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 11 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 12 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 11 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## ggrepel: 11 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 12 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 8 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 8 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 12 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## ggrepel: 12 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## Warning: ggrepel: 4 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 11 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
GG_save("figs/regions_imputed.png")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).
## Warning: Removed 15 rows containing missing values (geom_text_repel).
## Warning: ggrepel: 4 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 5 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## ggrepel: 1 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## Warning: ggrepel: 8 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 7 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 4 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
#African results
region_results_combined %>%
filter(region == "Africa") %>%
{
print(.)
.$imputed_mean_IQ %>% describe2()
}
## # A tibble: 16 × 5
## region IQ_var observed_mean_IQ imputed_mean_IQ method
## <chr> <chr> <dbl> <dbl> <chr>
## 1 Africa Lynn2012 70.5 79.3 SPI + lm
## 2 Africa Lynn2012 70.5 77.4 SPI g + lm
## 3 Africa Lynn2012 70.5 79.1 IRMI
## 4 Africa Lynn2012 70.5 79.1 ridge regression
## 5 Africa Rindermann2018 66.7 61.9 SPI + lm
## 6 Africa Rindermann2018 66.7 60.2 SPI g + lm
## 7 Africa Rindermann2018 66.7 74.6 IRMI
## 8 Africa Rindermann2018 66.7 65.2 ridge regression
## 9 Africa Becker2019 68.2 76.0 SPI + lm
## 10 Africa Becker2019 68.2 75.3 SPI g + lm
## 11 Africa Becker2019 68.2 82.0 IRMI
## 12 Africa Becker2019 68.2 82.6 ridge regression
## 13 Africa Worldbank2020 69.8 65.7 SPI + lm
## 14 Africa Worldbank2020 69.8 63.8 SPI g + lm
## 15 Africa Worldbank2020 69.8 72.3 IRMI
## 16 Africa Worldbank2020 69.8 72.2 ridge regression
#East Asian
region_results_combined %>%
filter(region == "Eastern Asia") %>%
{
print(.)
.$imputed_mean_IQ %>% describe2()
}
## # A tibble: 16 × 5
## region IQ_var observed_mean_IQ imputed_mean_IQ method
## <chr> <chr> <dbl> <dbl> <chr>
## 1 Eastern Asia Lynn2012 104. 86.7 SPI + lm
## 2 Eastern Asia Lynn2012 104. 88.1 SPI g + lm
## 3 Eastern Asia Lynn2012 104. 85.6 IRMI
## 4 Eastern Asia Lynn2012 104. 89.9 ridge regression
## 5 Eastern Asia Rindermann2018 99.2 81.5 SPI + lm
## 6 Eastern Asia Rindermann2018 99.2 84.9 SPI g + lm
## 7 Eastern Asia Rindermann2018 99.2 88.6 IRMI
## 8 Eastern Asia Rindermann2018 99.2 91.1 ridge regression
## 9 Eastern Asia Becker2019 102. 84.7 SPI + lm
## 10 Eastern Asia Becker2019 102. 86.3 SPI g + lm
## 11 Eastern Asia Becker2019 102. 92.2 IRMI
## 12 Eastern Asia Becker2019 102. 91.5 ridge regression
## 13 Eastern Asia Worldbank2020 93.5 83.3 SPI + lm
## 14 Eastern Asia Worldbank2020 93.5 85.1 SPI g + lm
## 15 Eastern Asia Worldbank2020 93.5 88.7 IRMI
## 16 Eastern Asia Worldbank2020 93.5 91.0 ridge regression
#asian IQs
d %>% filter(UN_macroregion == "Eastern Asia") %>% select(ISO, Country.x, Lynn2012, Rindermann2018, Becker2019, Worldbank2020)
write_sessioninfo()
## R version 4.2.0 (2022-04-22)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Linux Mint 19.3
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=en_DK.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_DK.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_DK.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] glmnet_4.1-4 Matrix_1.4-1 ggrepel_0.9.1
## [4] yardstick_0.0.9 workflowsets_0.2.1 workflows_0.2.6
## [7] tune_0.2.0 rsample_0.1.1 recipes_0.2.0
## [10] parsnip_0.2.1 modeldata_0.1.1 infer_1.0.0
## [13] dials_0.1.1 scales_1.2.0 broom_0.8.0
## [16] tidymodels_0.2.0 readxl_1.4.0 kirkegaard_2022-08-04
## [19] psych_2.2.3 assertthat_0.2.1 weights_1.0.4
## [22] Hmisc_4.7-0 Formula_1.2-4 survival_3.2-13
## [25] lattice_0.20-45 magrittr_2.0.3 forcats_0.5.1
## [28] stringr_1.4.0 dplyr_1.0.9 purrr_0.3.4
## [31] readr_2.1.2 tidyr_1.2.0 tibble_3.1.7
## [34] ggplot2_3.3.6 tidyverse_1.3.1
##
## loaded via a namespace (and not attached):
## [1] backports_1.4.1 plyr_1.8.7 sp_1.4-7
## [4] splines_4.2.0 listenv_0.8.0 digest_0.6.29
## [7] foreach_1.5.2 htmltools_0.5.2 gdata_2.18.0
## [10] fansi_1.0.3 checkmate_2.1.0 cluster_2.1.3
## [13] tzdb_0.3.0 globals_0.14.0 modelr_0.1.8
## [16] gower_1.0.0 vroom_1.5.7 hardhat_0.2.0
## [19] jpeg_0.1-9 colorspace_2.0-3 rvest_1.0.2
## [22] haven_2.5.0 xfun_0.30 crayon_1.5.1
## [25] jsonlite_1.8.0 lme4_1.1-29 zoo_1.8-10
## [28] iterators_1.0.14 glue_1.6.2 gtable_0.3.0
## [31] ipred_0.9-12 car_3.0-13 shape_1.4.6
## [34] future.apply_1.9.0 DEoptimR_1.0-11 abind_1.4-5
## [37] VIM_6.1.1 DBI_1.1.2 Rcpp_1.0.8.3
## [40] laeken_0.5.2 htmlTable_2.4.0 tmvnsim_1.0-2
## [43] proxy_0.4-26 GPfit_1.0-8 foreign_0.8-82
## [46] bit_4.0.4 lava_1.6.10 prodlim_2019.11.13
## [49] vcd_1.4-9 htmlwidgets_1.5.4 httr_1.4.3
## [52] RColorBrewer_1.1-3 ellipsis_0.3.2 mice_3.14.0
## [55] farver_2.1.0 pkgconfig_2.0.3 nnet_7.3-17
## [58] sass_0.4.1 dbplyr_2.1.1 utf8_1.2.2
## [61] labeling_0.4.2 tidyselect_1.1.2 rlang_1.0.2
## [64] DiceDesign_1.9 munsell_0.5.0 cellranger_1.1.0
## [67] tools_4.2.0 cli_3.3.0 generics_0.1.2
## [70] ranger_0.13.1 evaluate_0.15 fastmap_1.1.0
## [73] yaml_2.3.5 knitr_1.39 bit64_4.0.5
## [76] fs_1.5.2 robustbase_0.95-0 future_1.25.0
## [79] nlme_3.1-157 xml2_1.3.3 compiler_4.2.0
## [82] rstudioapi_0.13 png_0.1-7 e1071_1.7-9
## [85] reprex_2.0.1 lhs_1.1.5 bslib_0.3.1
## [88] stringi_1.7.6 highr_0.9 nloptr_2.0.1
## [91] vctrs_0.4.1 stringdist_0.9.8 pillar_1.7.0
## [94] lifecycle_1.0.1 furrr_0.3.0 lmtest_0.9-40
## [97] jquerylib_0.1.4 data.table_1.14.2 R6_2.5.1
## [100] latticeExtra_0.6-29 gridExtra_2.3 parallelly_1.31.1
## [103] codetools_0.2-18 boot_1.3-28 MASS_7.3-57
## [106] gtools_3.9.2 withr_2.5.0 mnormt_2.0.2
## [109] mgcv_1.8-40 parallel_4.2.0 hms_1.1.1
## [112] grid_4.2.0 rpart_4.1.16 timeDate_3043.102
## [115] class_7.3-20 minqa_1.2.4 rmarkdown_2.14
## [118] carData_3.0-5 pROC_1.18.0 lubridate_1.8.0
## [121] base64enc_0.1-3