Skip to contents
library(tibble)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)
library(stringr)
library(readr)
library(kableExtra)
#> 
#> Attaching package: 'kableExtra'
#> The following object is masked from 'package:dplyr':
#> 
#>     group_rows

library(PrjCompPPTS)
# If resave outputs to data, only do this during development
verbose <- TRUE
bl_tex_save <- FALSE
spt_path_res <- file.path("..", "res-tab", fsep = .Platform$file.sep)
spn_tex_out <- file.path(spt_path_res, "tab_global_children_teachers.tex", fsep = .Platform$file.sep)

Implement PrjCompPPTS-2, Summ: Global teachers and students.

We generate a table with these possible variables:

  • Unit of observation: country at selected years
  • var country
  • var (3) children to teacher ratio in 1960, 1980, 2000, 2020
  • var (1) global ranking in 2020
  • var (1) percentage change in teachers 1980 to 2020
  • var (1) teacher-population elasticity
  • var (1) percentage change in teachers 2000 to 2020
  • var (1) teacher-population elasticity

Generate input file

Load prepped all location level files

Load file with interpolated data.

# Locaiton codes
ppts_code_wrk <- ppts_country_code
# We load in the global population data.
df_ppts <- ppts_easia_weuro_world_pchg

Run PrjCompPPTS functions

Run functions to generate FLR, FPC, and FEL files. Run FLR.

# Generate PLR
df_flr <- PrjCompPPTS::ff_ppts_lrce_flr(
  df_ppts,
  st_year_bins_type = "1940t2020i01",
  ar_it_years = c(1960, 1980, 1990, 2000, 2010, 2020),
  verbose = TRUE
)
#> F-713479, S1
#> [1] 2000 2010 1960 1980 1990 2020
#> F-713479, S2
#> dim of youth wide file: 1616
#> dim of youth wide file: 7
#> F-713479, S2
#> [1] "var_rat_y2t"
#> [1] "var_lvl_youthpop"
#> [1] "var_lvl_teacher"
#> dim FLR: 1616
#> dim FLR: 8
#> F-713479, S2
#> [1] "var_rat_s2t"
#> [1] "var_lvl_student"
#> [1] "var_lvl_teacher"
#> dim FLR: 1616
#> dim FLR: 9
#> F-713479, S2
#> [1] "var_rat_y2s"
#> [1] "var_lvl_youthpop"
#> [1] "var_lvl_school"
#> dim FLR: 1616
#> dim FLR: 10
#> F-713479, S2
#> [1] "var_rat_s2s"
#> [1] "var_lvl_student"
#> [1] "var_lvl_school"
#> dim FLR: 1616
#> dim FLR: 11
#> F-713479, S3
#>  [1] "location_code"    "location_level"   "year_bins"        "var_lvl_student" 
#>  [5] "var_lvl_teacher"  "var_lvl_youthpop" "var_lvl_school"   "var_rat_y2t"     
#>  [9] "var_rat_s2t"      "var_rat_y2s"      "var_rat_s2s"     
#> dim of youth wide ratio file: 1616
#> dim of youth wide ratio file: 11

Run FPC.

# Generate FPC
df_fpc <- PrjCompPPTS::ff_ppts_lrce_fpc(
  df_flr,
  ar_it_years_chg = c(1960, 1980, 2000, 2020),
  ls_chg_years = list(
    "chg_80v60" = c(1960, 1980),
    "chg_00v80" = c(1980, 2000),
    "chg_20v00" = c(2000, 2020),
    "chg_20v80" = c(1980, 2020)
  ), verbose = TRUE
)
#> F-376864, S1
#> dim of youth wide ratio file: 6644
#> dim of youth wide ratio file: 6
#> F-376864, S2
#> dim of youth wide ratio file: 6644
#> dim of youth wide ratio file: 6
#> F-376864, S3
#> dim of youth wide ratio file: 2728
#> dim of youth wide ratio file: 8
#> F-376864, SD3
#> [1] "chg_80v60"
#> [1] "year1960"
#> [1] "year1980"
#> dim FPC: 2728
#> dim FPC: 9
#> F-376864, SD3
#> [1] "chg_00v80"
#> [1] "year1980"
#> [1] "year2000"
#> dim FPC: 2728
#> dim FPC: 10
#> F-376864, SD3
#> [1] "chg_20v00"
#> [1] "year2000"
#> [1] "year2020"
#> dim FPC: 2728
#> dim FPC: 11
#> F-376864, SD3
#> [1] "chg_20v80"
#> [1] "year1980"
#> [1] "year2020"
#> dim FPC: 2728
#> dim FPC: 12
#> F-376864, S4
#> dim FPC: 2728
#> dim FPC: 12

Run FEL.

# Generate FEL
df_fel <- PrjCompPPTS::ff_ppts_lrce_fel(
  df_fpc,
  verbose = TRUE
)
#> F-307302, S1
#> dim df_fpc_base: 818
#> dim df_fpc_base: 7
#> F-307302, S2
#> dim df_fel_long: 2456
#> dim df_fel_long: 5
#> F-307302, S3
#> dim df_fel_wide: 1055
#> dim df_fel_wide: 7
#> F-307302, S3
#> [1] "var_elas_y2t"
#> [1] "var_chg_youthpop"
#> [1] "var_chg_teacher"
#> dim FEL: 1055
#> dim FEL: 8
#> F-307302, S3
#> [1] "var_elas_s2t"
#> [1] "var_chg_student"
#> [1] "var_chg_teacher"
#> dim FEL: 1055
#> dim FEL: 9
#> F-307302, S3
#> [1] "var_elas_y2s"
#> [1] "var_chg_youthpop"
#> [1] "var_chg_school"
#> dim FEL: 1055
#> dim FEL: 10
#> F-307302, S3
#> [1] "var_elas_s2s"
#> [1] "var_chg_student"
#> [1] "var_chg_school"
#> dim FEL: 1055
#> dim FEL: 11
#> F-307302, S4
#> dim df_fel_elas: 1055
#> dim df_fel_elas: 11
#> F-307302, S4
#> dim FEL: 517
#> dim FEL: 7

Merge FPC and FEL, country and region

Now we combine the level and change information from FPC with the elasticity results from FEL.

We have the LRCE file, level, ratio, change, and elasticity.

df_lrce <- df_fpc %>% left_join(
  df_fel %>% mutate(vartype = "rat"),
  by = (c(
    "location_code" = "location_code",
    "location_level" = "location_level",
    "variable" = "variable",
    "vartype" = "vartype"
  ))
)
print(glue::glue("dim df_lrce: {dim(df_lrce)}"))
#> dim df_lrce: 2728
#> dim df_lrce: 16

Finally, merge in country key info to FPC, country-level information.

df_lrce_country <- df_lrce %>%
  filter(location_level != "multicountry") %>%
  left_join(
    ppts_code_wrk %>%
      select(
        location_name, location_code,
        location_region_group, location_region_group_code
      ),
    by = c("location_code" = "location_code")
  ) %>%
  # mutate(location_name_full = paste0(location_name, " (", location_code, ")")) %>%
  mutate(location_name_full = paste0(location_name)) %>%
  select(-location_name) %>%
  select(location_name_full, location_region_group, everything()) %>%
  arrange(location_region_group_code, location_name_full)

FPC regional information, same variables.

ar_st_wb7 <- c("SSF", "MEA", "LCN", "NAC", "SAS", "ECS", "EAS")
df_lrce_region <- df_lrce %>%
  filter(location_level == "multicountry") %>%
  filter(location_code %in% ar_st_wb7) %>%
  left_join(
    ppts_code_wrk %>%
      select(
        location_name, location_code, location_code_adj,
        location_region_group, location_region_group_code
      ),
    by = c("location_code" = "location_code")
  ) %>%
  select(-location_code) %>%
  rename(location_code = location_code_adj) %>%
  # mutate(location_name_full = paste0(location_name, " (", location_code, ")")) %>%
  mutate(location_name_full = paste0(location_name)) %>%
  select(-location_name) %>%
  select(location_name_full, location_region_group, everything()) %>%
  mutate(
    location_region_group_code = "0WORLD",
    location_region_group = "Global regions"
  ) %>%
  arrange(location_region_group_code, location_code)

Combine region and country.

df_lrce_region_country <- bind_rows(
  df_lrce_region,
  df_lrce_country %>% filter(location_level == "country"),
)

Table population and teachers

Now we develop the table for population to teacher ratio.

Prep table inputs

Select and prep Table 2. Combine national and regional data together.

First, select ratio and elasticity.

# Select y2t ratio levels and elasticity
tab2_y2t_rat_elas <- df_lrce_region_country %>%
  filter(
    vartype == "rat",
    variable == "y2t"
  ) %>%
  select(
    -vartype, -variable, -location_level, -location_code,
    -year1960, -contains("chg"), -elas_80v60
  ) %>%
  rename_at(vars(matches("elas_|year")), ~ paste0(., "_y2t"))
print(glue::glue("dim tab2_y2t_rat_elas: {dim(tab2_y2t_rat_elas)}"))
#> dim tab2_y2t_rat_elas: 197
#> dim tab2_y2t_rat_elas: 9

Second, ranks.

# Select y2t ratio levels and elasticity
tab2_y2t_rat_rank <- df_lrce_region_country %>%
  filter(
    vartype == "rank",
    variable == "y2t"
  ) %>%
  select(
    -vartype, -variable, -location_level, -location_code,
    -year1960, -contains("chg"), -contains("elas"),
  ) %>%
  rename_at(vars(matches("year")), ~ paste0(., "_y2t_rank"))
print(glue::glue("dim tab2_y2t_rat_rank: {dim(tab2_y2t_rat_rank)}"))
#> dim tab2_y2t_rat_rank: 197
#> dim tab2_y2t_rat_rank: 6

Second, select percentage changes.

# Select percentage changes in youth
tab2_youthstudentteacher_lvl <- df_lrce_region_country %>%
  filter(
    vartype == "lvl",
    variable %in% c("youthpop", "student", "teacher")
  ) %>%
  select(
    -vartype, -location_level, -location_code,
    -year1960,
    -contains("year"), -contains("elas_"), -chg_80v60
  ) %>%
  pivot_wider(
    id_cols = c(
      "location_name_full",
      "location_region_group",
      "location_region_group_code"
    ),
    names_from = variable,
    names_prefix = "",
    names_sep = "_",
    values_from = c(contains("chg_"))
  )
print(glue::glue("dim tab2_youthstudentteacher_lvl: {dim(tab2_youthstudentteacher_lvl)}"))
#> dim tab2_youthstudentteacher_lvl: 217
#> dim tab2_youthstudentteacher_lvl: 12

Third, combine information together

tab_2_global_pop_teacher <- tab2_youthstudentteacher_lvl %>%
  left_join(
    tab2_y2t_rat_elas,
    by = c(
      "location_name_full" = "location_name_full",
      "location_region_group" = "location_region_group",
      "location_region_group_code" = "location_region_group_code"
    )
  ) %>%
  left_join(
    tab2_y2t_rat_rank,
    by = c(
      "location_name_full" = "location_name_full",
      "location_region_group" = "location_region_group",
      "location_region_group_code" = "location_region_group_code"
    )
  )

Fourth, select a subset of variables for visualizations. Include the following:

  • var country
  • var (3) children to teacher ratio in 1980, 2000, 2020
  • var (1) global ranking in 2020
  • var (1) percentage change in youth 1980 to 2020
  • var (1) percentage change in teachers 1980 to 2020
  • var (1) teacher-population elasticity
# Select data
tab_2_global_pop_teacher_v1 <- tab_2_global_pop_teacher %>%
  select(
    contains("location"),
    year1980_y2t, year2000_y2t, year2020_y2t,
    chg_20v00_youthpop, chg_20v00_teacher, elas_20v00_y2t,
    chg_20v80_youthpop, chg_20v80_teacher, elas_20v80_y2t
  )
# drop no data rows
tab_2_global_pop_teacher_v1 <- tab_2_global_pop_teacher_v1 %>%
  mutate(
    avg_stats = base::rowMeans(
      dplyr::pick(matches("year|chg|elas")),
      na.rm = TRUE
    )
  ) %>%
  drop_na(avg_stats) %>%
  select(-avg_stats)

Fourth, count variables in regional groups.

df_region_counts <- tab_2_global_pop_teacher_v1 %>%
  group_by(
    location_region_group_code, location_region_group
  ) %>%
  summarize(region_count = n()) %>%
  ungroup() %>%
  mutate(region_count_start = cumsum(region_count) - region_count + 1) %>%
  mutate(region_count_end = cumsum(region_count)) %>%
  select(region_count_start, region_count_end, everything())
#> `summarise()` has grouped output by 'location_region_group_code'. You can
#> override using the `.groups` argument.

Third, format variables and replace NAs.

# Format variables
tab_2_global_pop_teacher_v1 <- tab_2_global_pop_teacher_v1 %>%
  select(-location_region_group, -location_region_group_code) %>%
  mutate_at(
    vars(contains("year")),
    list(~ paste0(
      format(round(., 0), nsmall = 0, big.mark = ",")
    ))
  ) %>%
  mutate_at(
    vars(contains("elas")),
    list(~ paste0(
      format(round(., 2), nsmall = 0, big.mark = ",")
    ))
  ) %>%
  mutate_at(
    vars(contains("chg")),
    list(~ paste0(
      format(round(., 2) * 100,
        nsmall = 0,
        big.mark = ","
      ),
      "%"
    ))
  )
# Replace NAs
tab_2_global_pop_teacher_v1 <- tab_2_global_pop_teacher_v1 %>%
  mutate_at(vars(starts_with("chg")), ~ str_replace(., "NA%", "")) %>%
  mutate_at(vars(starts_with("year")), ~ str_replace(., "NA", "")) %>%
  mutate_at(vars(starts_with("elas")), ~ str_replace(., "NA", ""))

Generate table

Now we generate the table.

ar_st_kableformat <- c("latex", "html")
for (st_kableformat in ar_st_kableformat) {
  # Column names
  ar_st_col_names <- c(
    "Country by region",
    "1980",
    "2000",
    "2020",
    "Youth",
    "Teachers",
    "$\\Delta$\\%T/$\\Delta$\\%Y",
    "Youth",
    "Teachers",
    "$\\Delta$\\%T/$\\Delta$\\%Y"
  )
  # Define column groups, grouping the names above
  # =1/3/2 are number of columns group title covers
  ar_st_col_groups_l1 <- c(
    " " = 1,
    "Ratios" = 3,
    # "Rank" = 1,
    "\\% change" = 2,
    "Elasticity" = 1,
    "\\% change" = 2,
    "Elasticity" = 1
  )
  ar_st_col_groups_l2 <- c(
    " " = 1,
    "Youth to teacher" = 3,
    "2000 to 2020" = 3,
    "1980 to 2020" = 3
  )

  # Second, we construct main table, and add styling.
  bk_youth_teacher_rela <- kbl(
    tab_2_global_pop_teacher_v1 %>%
      select(
        location_name_full,
        year1980_y2t, year2000_y2t, year2020_y2t,
        chg_20v00_youthpop, chg_20v00_teacher, elas_20v00_y2t,
        chg_20v80_youthpop, chg_20v80_teacher, elas_20v80_y2t
      ),
    format = st_kableformat,
    label = "main:tab:global:pop:teachers",
    # escape = F,
    linesep = "",
    booktabs = T,
    longtable = T,
    align = "c",
    caption = "Global changes in youth (Age 0-14) and primary teachers",
    col.names = ar_st_col_names
  ) %>%
    # see https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html#Bootstrap_table_classes
    kable_styling(
      bootstrap_options = c("striped", "hover", "condensed", "responsive"),
      full_width = F, position = "left"
    )

  # Third, we add in column groups.
  bk_youth_teacher_rela <- bk_youth_teacher_rela %>%
    add_header_above(ar_st_col_groups_l1) %>%
    add_header_above(ar_st_col_groups_l2)

  # Fourth, we add in row groups.
  for (it_region in seq(1, dim(df_region_counts)[1])) {
    # Reion full name info
    st_loc <- as.character(df_region_counts[[it_region, "location_region_group"]])

    # Regions start and end
    it_region_count_start <- df_region_counts[[it_region, "region_count_start"]]
    it_region_count_end <- df_region_counts[[it_region, "region_count_end"]]

    # Add to table
    bk_youth_teacher_rela <- bk_youth_teacher_rela %>%
      pack_rows(
        st_loc, it_region_count_start, it_region_count_end,
        latex_gap_space = "1em",
        latex_align = "c",
        hline_after = TRUE
      )
  }

  # Fifth, column formatting.
  fl_width_country <- 3.4
  st_width_country <- paste0(fl_width_country, "cm")
  bk_youth_teacher_rela <- bk_youth_teacher_rela %>%
    column_spec(1, width = st_width_country) %>%
    column_spec(2:10, width = "0.9cm")

  # Final adjustments
  # Headings on all pages, note use `sub` to replace first midrule
  st_headend <- paste0(
    "\\midrule\\endhead\n",
    "\\addlinespace[0.2em]\\hline\\addlinespace[0.2em]\n",
    "\\multicolumn{10}{r}{\\emph{Continued on next page}}\\\\\n",
    "\\endfoot\\endlastfoot"
  )
  bk_youth_teacher_rela <- sub(bk_youth_teacher_rela,
    pattern = "\\midrule", replacement = st_headend,
    fixed = TRUE
  )
  # country-names left-align
  bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
    pattern = paste0("\\centering\\arraybackslash}p{", st_width_country, "}"),
    replacement = paste0("\\raggedright\\arraybackslash}p{", st_width_country, "}"),
    fixed = TRUE
  )
  # midrule replacing hline
  bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
    pattern = "hline",
    replacement = "midrule", fixed = TRUE
  )
  # Backslash replace
  bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
    pattern = "\\textbackslash{}Delta", replacement = "\\Delta", fixed = TRUE
  )
  bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
    pattern = "\\textbackslash{}", replacement = "", fixed = TRUE
  )
  bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
    pattern = "\\$", replacement = "$", fixed = TRUE
  )
  # bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
  #   pattern = "\\%Y",  replacement = "%Y", fixed = TRUE
  # )
  # bk_youth_teacher_rela <- gsub(bk_youth_teacher_rela,
  #   pattern = "\\% change",  replacement = "% change", fixed = TRUE
  # )

  # Sixth, display.
  # pl_bk_asset_count <- bk_asset_count %>% as_image()
  if (st_kableformat == "html") {
    print(dim(bk_youth_teacher_rela))
  } else {
    if (bl_tex_save) {
      fileConn <- file(spn_tex_out)
      writeLines(bk_youth_teacher_rela, fileConn)
      close(fileConn)
      if (verbose) {
        print(glue::glue("Latex saved: {spn_tex_out}"))
      }
    }
  }
}
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#>                                     use label_row_css instead.
#> NULL
bk_youth_teacher_rela
Global changes in youth (Age 0-14) and primary teachers
Youth to teacher
2000 to 2020
1980 to 2020
Ratios
% change
Elasticity
% change
Elasticity
Country by region 1980 2000 2020 Youth Teachers Δ\Delta%T/Δ\Delta%Y Youth Teachers Δ\Delta%T/Δ\Delta%Y
Global regions
Sub-Saharan Africa 129 137 93 62% 138% 0.45 176% 281% 0.63
Middle East & North Africa 96 62 54 20% 39% 0.51 72% 208% 0.35
Latin America & Caribbean 76 61 52 -7% 9% -0.78 9% 61% 0.15
North America 35 37 37 0% 0% 1.05 17% 9% 1.94
South Asia 174 133 84 3% 63% 0.04 42% 194% 0.22
Europe & Central Asia 66 51 47 -2% 7% -0.33 -13% 22% -0.57
East Asia & Pacific 71 57 41 -13% 20% -0.66 -18% 42% -0.43
Sub-Saharan Africa (SSF)
Angola 118 193 301 97% 27% 3.66 296% 55% 5.38
Benin 254 175 89 64% 222% 0.29 206% 771% 0.27
Botswana 82 52 68 24% -4% -5.49 80% 118% 0.68
Burkina Faso 891 311 106 71% 401% 0.18 198% 2,402% 0.08
Burundi 402 251 104 68% 306% 0.22 190% 1,019% 0.19
Cabo Verde 96 58 50 -15% -1% 10.45 16% 125% 0.13
Cameroon 152 167 112 60% 137% 0.44 190% 293% 0.65
Central African Republic 232 357 183 33% 161% 0.21 127% 187% 0.68
Chad 544 307 167 87% 242% 0.36 275% 1,119% 0.25
Comoros 119 94 162 42% -17% -2.46 146% 81% 1.80
Congo, Dem. Rep.  118 137 63 91% 318% 0.29 249% 556% 0.45
Congo, Rep.  120 190 69 73% 379% 0.19 178% 384% 0.46
Côte d’Ivoire 148 166 108 53% 134% 0.39 201% 311% 0.65
Equatorial Guinea 127 146 103 109% 197% 0.55 430% 553% 0.78
Eritrea 168 51%
Eswatini 90 63 47 0% 36% 0.01 48% 183% 0.26
Ethiopia 517 354 85 49% 519% 0.09 189% 1,652% 0.11
Gabon 82 96 65% 190%
Gambia 202 133 99 71% 131% 0.54 283% 683% 0.41
Ghana 108 108 62 41% 145% 0.28 123% 286% 0.43
Guinea 308 221 129 48% 153% 0.31 168% 542% 0.31
Guinea-Bissau 110 160 51% 143%
Kenya 99 69 43% 106% 0.41 152%
Lesotho 121 95 54 -15% 49% -0.31 12% 150% 0.08
Liberia 94 88 68% 80% 0.85 145%
Madagascar 117 155 84 56% 185% 0.30 176% 281% 0.62
Malawi 127 89 60% 127% 0.47 187%
Mali 443 327 150 87% 309% 0.28 205% 802% 0.26
Mauritania 376 145 128 61% 83% 0.74 163% 676% 0.24
Mauritius 54 59 37 -31% 11% -2.67 -38% -10% 4.00
Mozambique 303 198 110 75% 214% 0.35 173% 649% 0.27
Namibia 61 44 24% 74% 0.33 90%
Niger 538 384 183 120% 361% 0.33 317% 1,125% 0.28
Nigeria 107 119 87 68% 130% 0.52 177% 240% 0.74
Rwanda 247 133 112 45% 73% 0.62 107% 358% 0.30
Senegal 282 201 107 63% 205% 0.31 176% 624% 0.28
Seychelles 59 34 38 1% -9% -0.08 -4% 51% -0.07
Sierra Leone 159 140 69 59% 224% 0.26 123% 415% 0.30
Somalia 316 360 75% 167%
South Sudan 184 66% 132%
Sudan 46% 155%
São Tomé and Príncipe 79 87 66 45% 92% 0.49 101% 142% 0.71
Tanzania 108 143 134 73% 85% 0.86 203% 145% 1.40
Togo 142 87 81 58% 71% 0.82 166% 367% 0.45
Uganda 152 106 95 79% 101% 0.78 260% 477% 0.54
Zambia 132 152 88 67% 189% 0.36 185% 329% 0.56
Zimbabwe 131 75 82 25% 14% 1.72 69% 170% 0.41
Middle East & North Africa (MEA)
Algeria 104 63 67 27% 18% 1.50 52% 135% 0.38
Bahrain 50 44 34 55% 102% 0.54 150% 268% 0.56
Djibouti 463 282 124 -3% 122% -0.02 71% 542% 0.13
Egypt 129 73 66 37% 53% 0.70 97% 285% 0.34
Iran 98 70 78 -7% -16% 0.43 23% 55% 0.42
Iraq 69 59 50% 137%
Israel 33 35 32 45% 61% 0.74 100% 104% 0.96
Jordan 84 61 51 65% 96% 0.68 188% 369% 0.51
Kuwait 71 57 27 58% 235% 0.25 66% 342% 0.19
Lebanon 45 42 42 43% 44% 0.98 69% 82% 0.84
Libya 48 5% 24%
Malta 48 43 34 -4% 21% -0.21 -2% 38% -0.04
Morocco 159 76 59 2% 31% 0.08 14% 207% 0.07
Oman 145 67 41 36% 123% 0.30 121% 684% 0.18
Qatar 37 32 30 158% 173% 0.91 422% 545% 0.78
Saudi Arabia 92 41 35 9% 30% 0.29 103% 443% 0.23
Syrian Arab Republic 87 60 -20% 23%
Tunisia 100 47 38 0% 24% 0.00 8% 185% 0.04
United Arab Emirates 58 48 59 80% 46% 1.74 411% 398% 1.03
West Bank and Gaza 130 79 32% 118% 0.27
Yemen 82 67 36% 66% 0.54 194%
Latin America & Caribbean (LCN)
Antigua and Barbuda 59 31 27 -2% 15% -0.13 -9% 99% -0.09
Argentina 44 43 6% 31%
Aruba 43 -12% 16%
Bahamas, The 64 38 59 -3% -36% 0.08 9% 19% 0.49
Barbados 57 43 33 -19% 6% -3.13 -36% 12% -2.93
Belize 52 45 15% 35% 0.43 73%
Bolivia 53 46 11% 28% 0.39 55%
Brazil 83 64 57 -16% -6% 2.77 -5% 38% -0.12
British Virgin Islands 74% 177%
Cayman Islands 46% 210%
Chile 75 39 -12% 71% -0.17 -4%
Colombia 79 65 61 -13% -6% 1.98 5% 36% 0.14
Costa Rica 70 56 25 -14% 95% -0.15 21% 242% 0.08
Cuba 36 26 21 -25% -7% 3.60 -42% -2% 19.35
Curaçao -16% -39%
Dominica -14% 14%
Dominican Republic 118 67 46 1% 48% 0.01 20% 210% 0.09
Ecuador 84 54 63 9% -8% -1.14 44% 92% 0.48
El Salvador 101 66 -20% 22% -0.93 -14%
Grenada 61 43 35 -22% -5% 4.78 -25% 29% -0.85
Guatemala 134 86 48 11% 98% 0.11 76% 388% 0.20
Guyana 83 64 -18% -34%
Haiti 171 66 9% 61%
Honduras 106 88 81 8% 17% 0.45 74% 130% 0.57
Jamaica 98 79 61 -19% 5% -3.80 -19% 29% -0.68
Mexico 88 62 58 -2% 5% -0.28 10% 67% 0.15
Nicaragua 115 86 -3% 27%
Panama 65 60 60 18% 18% 1.01 41% 54% 0.76
Paraguay 71 53 1% 52%
Peru 88 60 39 -11% 40% -0.27 10% 150% 0.06
Puerto Rico 53 38 42 -42% -47% 0.90 -49% -34% 1.42
St. Kitts and Nevis 53% 65%
St. Lucia 55 46 31 -35% -1% 27.16 -36% 14% -2.53
St. Vincent 37 33 26 -28% -9% 3.24 -45% -21% 2.12
Suriname 41 47 29 2% 65% 0.02 9% 57% 0.16
Trinidad and Tobago 57 40 -13% -24%
Turks and Caicos Islands 61% 119%
Uruguay 53 47 31 -13% 30% -0.44 -10% 53% -0.19
Venezuela 71 -6% 24%
Virgin Islands (U.S.) 32 -27% -43%
North America (NAC)
Bermuda 0% 99%
Canada 39 42 2% 8%
United States 36 39 37 -1% 5% -0.12 18% 17% 1.07
South Asia (SAS)
Afghanistan 319 314 119 60% 324% 0.19 164% 611% 0.27
Bangladesh 231 167 76 -7% 106% -0.06 24% 279% 0.09
Bhutan 188 114 65 -18% 42% -0.44 8% 211% 0.04
India 167 129 78 -2% 62% -0.03 32% 180% 0.18
Maldives 35 19 -6% 74% -0.09 47%
Nepal 224 99 42 -14% 103% -0.14 35% 624% 0.06
Pakistan 237 141 165 29% 10% 2.84 130% 231% 0.56
Sri Lanka 87 75 66 3% 18% 0.19 -4% 27% -0.14
Europe & Central Asia (ECS)
Albania 75 51 -48% -23% 2.08 -49%
Andorra 26% 63%
Armenia 67 77 -22% -31% 0.70 -34%
Austria 56 40 34 -5% 10% -0.46 -17% 35% -0.48
Azerbaijan 67 59 -5% 7% -0.74 11%
Belarus 56 74 -13% -34% 0.37 -26%
Belgium 45 29 26 9% 19% 0.48 -1% 69% -0.01
Bosnia and Herzegovina 50 -39% -60%
Bulgaria 55 46 -20% -5% 4.24 -48%
Channel Islands 3% 11%
Croatia 73 47 -24% 19% -1.24 -39%
Cyprus 78 59 37 -5% 48% -0.11 17% 143% 0.12
Czechia 105 44 0% -30%
Denmark 30 26 20 -4% 22% -0.17 -11% 32% -0.35
Estonia 29 26 -11% -3% 3.07 -31%
Finland 39 40 32 -7% 19% -0.34 -10% 12% -0.82
France 42 36 37 3% 1% 3.21 -4% 10% -0.38
Georgia 68 48 23 -11% 84% -0.13 -34% 95% -0.36
Germany 60 49 -10% 10% -0.96
Gibraltar 117% 53%
Greece 63 34 19 -10% 63% -0.16 -36% 116% -0.31
Hungary 37 37 -18% -19% 0.98 -40%
Iceland 42 28 21 9% 43% 0.21 13% 125% 0.11
Ireland 73 38 27% 0%
Italy 45 32 31 -5% -3% 1.73 -38% -9% 4.26
Kazakhstan 66 61 33% 46% 0.73 14%
Kyrgyz Republic 134 89 98 26% 14% 1.87 61% 120% 0.51
Latvia 72 47 30 -26% 18% -1.49 -39% 49% -0.80
Liechtenstein 38%
Lithuania 117 53 51 -38% -36% 1.07 -46% 25% -1.81
Luxembourg 38 31 19 19% 90% 0.21 44% 185% 0.24
Moldova 94 57 54 -39% -36% 1.09 -43% 0% -306.94
Monaco 97% 116%
Montenegro -14% -28%
Netherlands 22 20 -7% 4% -1.62
North Macedonia 78 44 -26% 32% -0.84 -41%
Norway 36 24 18 3% 35% 0.10 2% 98% 0.03
Poland 23 26 -23% -29% 0.78 -33%
Portugal 37 27 26 -19% -17% 1.09 -47% -26% 1.82
Romania 100 65 63 -28% -26% 1.09 -50% -20% 2.49
Russian Federation 143 77 76 -1% 0% 3.08 -12% 66% -0.18
San Marino 8% 91%
Serbia 56 -31% -42%
Slovak Republic 60 56 -20% -13% 1.52 -35%
Slovenia 48 14 1% 240% 0.01 -28%
Spain 75 34 29 14% 36% 0.39 -30% 84% -0.36
Sweden 41 25 25 12% 9% 1.26 12% 80% 0.15
Switzerland 51 34 24 3% 50% 0.06 1% 117% 0.01
Tajikistan 83 84 34% 33% 1.05 113%
Turkmenistan 82 13% 55%
Türkiye 87 76 66 4% 19% 0.23 16% 53% 0.30
Ukraine 81 63 -16% 7% -2.35 -34%
United Kingdom 44 45 42 6% 14% 0.44 0% 4% 0.09
Uzbekistan 116 76 81 7% 1% 13.72 52% 118% 0.44
East Asia & Pacific (EAS)
Australia 41 38 24% 33%
Brunei Darussalam 45 31 23 -4% 28% -0.16 29% 155% 0.19
Cambodia 95 113 100 2% 15% 0.15 88% 78% 1.12
China 64 53 39 -20% 10% -2.06 -29% 17% -1.71
Fiji 61 70 39 -8% 64% -0.13 4% 63% 0.07
French Polynesia 43 32 -19% 2%
Guam 40 -15% 12%
Hong Kong SAR, China 71 49 32 -16% 27% -0.58 -26% 62% -0.41
Indonesia 85 50 39 9% 41% 0.23 17% 154% 0.11
Japan 59 46 37 -16% 4% -4.49 -43% -10% 4.45
Kiribati 54 73 61 27% 53% 0.51 83% 62% 1.35
Korea, Dem. People’s Rep.  68 -14% -20%
Korea, Rep.  108 69 34 -33% 35% -0.93 -50% 59% -0.84
Lao PDR 97 84 67 1% 26% 0.03 61% 132% 0.46
Macao SAR, China 68 62 37 -5% 61% -0.08 65% 207% 0.32
Malaysia 74 50 31 -2% 57% -0.03 39% 230% 0.17
Micronesia 31 51 59 -17% -29% 0.58 4% -46% -0.08
Mongolia 165 107 91 22% 45% 0.50 38% 151% 0.25
Myanmar 171 102 74 -9% 27% -0.32 -2% 128% -0.01
Nauru -15% -8%
New Caledonia 40 -7% 15%
New Zealand 40 45 36 13% 41% 0.31 17% 30% 0.55
Papua New Guinea 162 147 69 35% 190% 0.19 102% 376% 0.27
Philippines 81 83 62 10% 48% 0.20 61% 111% 0.55
Samoa 50 61 4% 3%
Singapore 69 64 42 -7% 42% -0.17 7% 78% 0.09
Solomon Islands 95 55 60 59% 45% 1.31 152% 297% 0.51
Taiwan 83 46 31 -37% -5% 8.14 -48% 40% -1.20
Thailand 66 51 28 -23% 41% -0.58 -38% 46% -0.82
Timor-Leste 173 64 22% 232% 0.10 103%
Tonga 50 50 47 -3% 3% -0.76 -5% 0% 20.48
Tuvalu 72%
Vanuatu 52 49 8 54% 783% 0.07 129% 1,317% 0.10
Vietnam 102 74 60 -11% 11% -0.97 2% 74% 0.02