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(
    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
)

Data

#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()

African IQs

#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

Imputing African IQs based on SPI

Simplest approach, SPI itself

#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

IRMI standard approach

#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)
    }

Ridge regression

#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()

Impute each world region’s IQs

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)

Meta

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