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_students_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-students elasticity
  • var (1) percentage change in teachers 2000 to 2020
  • var (1) teacher-students 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 students 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 students and teachers

Now we develop the table for students to teacher ratio.

Prep table inputs

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

First, select ratio and elasticity.

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

Second, ranks.

# Select s2t ratio levels and elasticity
tab2_s2t_rat_rank <- df_lrce_region_country %>%
  filter(
    vartype == "rank",
    variable == "s2t"
  ) %>%
  select(
    -vartype, -variable, -location_level, -location_code,
    -year1960, -contains("chg"), -contains("elas"),
  ) %>%
  rename_at(vars(matches("year")), ~ paste0(., "_s2t_rank"))
print(glue::glue("dim tab2_s2t_rat_rank: {dim(tab2_s2t_rat_rank)}"))
#> dim tab2_s2t_rat_rank: 213
#> dim tab2_s2t_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_s2t_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_s2t_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 student 1980 to 2020
  • var (1) percentage change in teachers 1980 to 2020
  • var (1) teacher-students elasticity
# Select data
tab_2_global_student_teacher_v1 <- tab_2_global_pop_teacher %>%
  select(
    contains("location"),
    year1980_s2t, year2000_s2t, year2020_s2t,
    chg_20v00_student, chg_20v00_teacher, elas_20v00_s2t,
    chg_20v80_student, chg_20v80_teacher, elas_20v80_s2t
  )
# drop no data rows
tab_2_global_student_teacher_v1 <- tab_2_global_student_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_student_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_student_teacher_v1 <- tab_2_global_student_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_student_teacher_v1 <- tab_2_global_student_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",
    "Students",
    "Teachers",
    "$\\Delta$\\%T/$\\Delta$\\%Y",
    "Students",
    "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,
    "Student to teacher" = 3,
    "2000 to 2020" = 3,
    "1980 to 2020" = 3
  )

  # Second, we construct main table, and add styling.
  bk_student_teacher_rela <- kbl(
    tab_2_global_student_teacher_v1 %>%
      select(
        location_name_full,
        year1980_s2t, year2000_s2t, year2020_s2t,
        chg_20v00_student, chg_20v00_teacher, elas_20v00_s2t,
        chg_20v80_student, chg_20v80_teacher, elas_20v80_s2t
      ),
    format = st_kableformat,
    label = "main:tab:global:students:teachers",
    # escape = F,
    linesep = "",
    booktabs = T,
    longtable = T,
    align = "c",
    caption = "Global changes in primary students and 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_student_teacher_rela <- bk_student_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_student_teacher_rela <- bk_student_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_student_teacher_rela <- bk_student_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_student_teacher_rela <- sub(bk_student_teacher_rela,
    pattern = "\\midrule", replacement = st_headend,
    fixed = TRUE
  )
  # country-names left-align
  bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
    pattern = paste0("\\centering\\arraybackslash}p{", st_width_country, "}"),
    replacement = paste0("\\raggedright\\arraybackslash}p{", st_width_country, "}"),
    fixed = TRUE
  )
  # midrule replacing hline
  bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
    pattern = "hline",
    replacement = "midrule", fixed = TRUE
  )
  # Backslash replace
  bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
    pattern = "\\textbackslash{}Delta", replacement = "\\Delta", fixed = TRUE
  )
  bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
    pattern = "\\textbackslash{}", replacement = "", fixed = TRUE
  )
  bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
    pattern = "\\$", replacement = "$", fixed = TRUE
  )
  # bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
  #   pattern = "\\%Y",  replacement = "%Y", fixed = TRUE
  # )
  # bk_student_teacher_rela <- gsub(bk_student_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_student_teacher_rela))
  } else {
    if (bl_tex_save) {
      fileConn <- file(spn_tex_out)
      writeLines(bk_student_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_student_teacher_rela
Global changes in primary students and teachers
Student to teacher
2000 to 2020
1980 to 2020
Ratios
% change
Elasticity
% change
Elasticity
Country by region 1980 2000 2020 Students Teachers Δ\Delta%T/Δ\Delta%Y Students Teachers Δ\Delta%T/Δ\Delta%Y
Global regions
Sub-Saharan Africa 37 42 36 104% 138% 0.76 271% 281% 0.97
Middle East & North Africa 29 23 21 31% 39% 0.78 126% 208% 0.61
Latin America & Caribbean 30 25 21 -11% 9% -1.16 11% 61% 0.17
North America 14 15 15 -1% 0% 4.87 18% 9% 2.04
South Asia 43 40 28 15% 63% 0.24 94% 194% 0.49
Europe & Central Asia 20 17 15 -3% 7% -0.39 -8% 22% -0.34
East Asia & Pacific 29 24 17 -14% 20% -0.72 -15% 42% -0.36
Sub-Saharan Africa (SSF)
Angola 43 42 127 288% 27% 10.85 355% 55% 6.44
Benin 55 53 38 134% 222% 0.60 511% 771% 0.66
Botswana 32 27 31 13% -4% -2.91 112% 118% 0.95
Burkina Faso 53 49 37 280% 401% 0.70 1,653% 2,402% 0.69
Burundi 35 55 44 220% 306% 0.72 1,313% 1,019% 1.29
Cabo Verde 42 29 19 -33% -1% 23.02 5% 125% 0.04
Cameroon 52 53 46 106% 137% 0.77 254% 293% 0.86
Central African Republic 61 98 87 131% 161% 0.81 311% 187% 1.66
Chad 65 69 55 176% 242% 0.72 932% 1,119% 0.83
Comoros 47 37 62 39% -17% -2.27 138% 81% 1.70
Congo, Dem. Rep.  41 29 29 331% 318% 1.04 374% 556% 0.67
Congo, Rep.  56 60 24 91% 379% 0.24 109% 384% 0.28
Côte d’Ivoire 39 45 41 111% 134% 0.83 330% 311% 1.06
Equatorial Guinea 56 43 19 30% 197% 0.15 122% 553% 0.22
Eritrea 48 38 20% 51% 0.39
Eswatini 34 31 25 10% 36% 0.28 110% 183% 0.60
Ethiopia 59 67 38 249% 519% 0.48 1,027% 1,652% 0.62
Gabon 43 51
Gambia 27 37 36 125% 131% 0.95 949% 683% 1.39
Ghana 28 34 25 79% 145% 0.54 234% 286% 0.82
Guinea 38 46 48 167% 153% 1.09 702% 542% 1.30
Guinea-Bissau 25 44
Kenya 34 29 75% 106% 0.71 146%
Lesotho 48 48 31 -5% 49% -0.10 59% 150% 0.40
Liberia 38 25 17% 80% 0.21 294%
Madagascar 46 48 34 101% 185% 0.55 178% 281% 0.63
Malawi 67 52 76% 127% 0.60 612%
Mali 42 65 37 132% 309% 0.43 690% 802% 0.86
Mauritania 46 45 48 97% 83% 1.17 723% 676% 1.07
Mauritius 20 26 15 -38% 11% -3.31 -35% -10% 3.63
Mozambique 84 64 58 184% 214% 0.86 413% 649% 0.64
Namibia 32 24 34% 74% 0.46
Niger 39 41 40 352% 361% 0.98 1,147% 1,125% 1.02
Nigeria 36 43 30 59% 130% 0.45 181% 240% 0.75
Rwanda 56 54 55 76% 73% 1.05 351% 358% 0.98
Senegal 43 51 34 104% 205% 0.51 476% 624% 0.76
Seychelles 23 15 15 -5% -9% 0.58 -1% 51% -0.02
Sierra Leone 34 31 38 297% 224% 1.33 477% 415% 1.15
Somalia 31 27
South Sudan 43
Sudan 114%
São Tomé and Príncipe 29 35 28 56% 92% 0.61 140% 142% 0.99
Tanzania 42 42 56 149% 85% 1.75 224% 145% 1.55
Togo 54 37 39 79% 71% 1.11 238% 367% 0.65
Uganda 34 59 42 44% 101% 0.43 623% 477% 1.31
Zambia 49 50 39 123% 189% 0.65 240% 329% 0.73
Zimbabwe 44 37 38 17% 14% 1.16 132% 170% 0.78
Middle East & North Africa (MEA)
Algeria 36 28 24 0% 18% 0.01 59% 135% 0.43
Bahrain 20 17 13 52% 102% 0.50 142% 268% 0.53
Djibouti 42 37 30 81% 122% 0.67 354% 542% 0.65
Egypt 33 23 26 75% 53% 1.43 207% 285% 0.73
Iran 29 26 32 5% -16% -0.31 76% 55% 1.39
Iraq 28 21
Israel 12 14 12 45% 61% 0.73 106% 104% 1.02
Jordan 32 22 17 56% 96% 0.58 151% 369% 0.41
Kuwait 19 14 8 99% 235% 0.42 92% 342% 0.27
Lebanon 17 14 13 28% 44% 0.63 33% 82% 0.40
Libya 20
Malta 21 19 13 -21% 21% -1.02 -17% 38% -0.44
Morocco 38 29 27 24% 31% 0.77 121% 207% 0.59
Oman 23 25 11 -4% 123% -0.03 263% 684% 0.38
Qatar 14 13 12 168% 173% 0.97 475% 545% 0.87
Saudi Arabia 18 12 14 44% 30% 1.46 308% 443% 0.70
Syrian Arab Republic 29 25
Tunisia 39 23 17 -10% 24% -0.43 23% 185% 0.12
United Arab Emirates 16 16 19 69% 46% 1.52 475% 398% 1.19
West Bank and Gaza 36 21 30% 118% 0.25
Yemen 24 23 59% 66% 0.90
Latin America & Caribbean (LCN)
Antigua and Barbuda 25 19 13 -19% 15% -1.31 6% 99% 0.06
Argentina 20 20 -2% 23%
Aruba 19
Bahamas, The 26 15 20 -16% -36% 0.45 -11% 19% -0.58
Barbados 24 18 13 -21% 6% -3.59 -39% 12% -3.15
Belize 23 19 10% 35% 0.30 76%
Bolivia 24 18 -5% 28% -0.16 63%
Brazil 29 25 20 -24% -6% 4.13 -4% 38% -0.11
British Virgin Islands 19 17 9 -2% 74% -0.03 36% 177% 0.20
Cayman Islands 19 14 13 32% 46% 0.69 115% 210% 0.55
Chile 32 16 -13% 71% -0.18 -11%
Colombia 31 26 23 -19% -6% 3.01 1% 36% 0.04
Costa Rica 28 25 11 -11% 95% -0.11 41% 242% 0.17
Cuba 18 11 9 -27% -7% 3.95 -51% -2% 23.34
Dominica 34 20 12 -47% -14% 3.48 -60% 14% -4.38
Dominican Republic 51 31 19 -10% 48% -0.21 14% 210% 0.07
Ecuador 36 23 25 -3% -8% 0.32 29% 92% 0.32
El Salvador 44 23 -38% 22% -1.75 -15%
Grenada 32 20 17 -22% -5% 4.69 -32% 29% -1.10
Guatemala 34 33 20 23% 98% 0.24 192% 388% 0.50
Guyana 33 26
Haiti 43 31
Honduras 37 34 29 -1% 17% -0.08 80% 130% 0.61
Jamaica 41 30 19 -33% 5% -6.55 -39% 29% -1.38
Mexico 41 27 24 -5% 5% -1.02 -1% 67% -0.02
Nicaragua 35 36
Panama 27 25 22 5% 18% 0.30 25% 54% 0.46
Paraguay 27 25 -28% 33%
Peru 37 29 18 -11% 40% -0.29 22% 150% 0.14
Puerto Rico 25 15 15 -47% -47% 0.98 -60% -34% 1.73
St. Kitts and Nevis 25 19 10 -22% 53% -0.41 -35% 65% -0.54
St. Lucia 32 23 14 -39% -1% 30.34 -49% 14% -3.45
St. Vincent 18 19 14 -29% -9% 3.35 -37% -21% 1.77
Suriname 23 19 13 6% 65% 0.10 -15% 57% -0.26
Trinidad and Tobago 26 21
Turks and Caicos Islands 21 18 26 131% 61% 2.15 175% 119% 1.46
Uruguay 22 21 13 -20% 30% -0.67 -13% 53% -0.24
Venezuela 28 -10% 22%
Virgin Islands (U.S.) 12
North America (NAC)
Bermuda 23 10 8 -15% 0% 4,017.14 -27% 99% -0.27
Canada 15 17 -2% 9%
United States 15 5% 17%
South Asia (SAS)
Afghanistan 50 23 51 837% 324% 2.58 631% 611% 1.03
Bangladesh 54 52 30 20% 106% 0.19 114% 279% 0.41
Bhutan 32 41 32 11% 42% 0.25 215% 211% 1.02
India 43 40 26 7% 62% 0.11 71% 180% 0.39
Maldives 23 9 -30% 74% -0.40 69%
Nepal 38 38 19 3% 103% 0.03 264% 624% 0.42
Pakistan 37 33 52 73% 10% 7.27 365% 231% 1.58
Sri Lanka 34 27 21 -5% 18% -0.27 -19% 27% -0.68
Europe & Central Asia (ECS)
Albania 23 17 -43% -23% 1.86 -40%
Andorra 12 12 10 5% 26% 0.21 46% 63% 0.73
Armenia 15 19 -14% -31% 0.45
Austria 15 12 9 -12% 10% -1.15 -13% 35% -0.38
Azerbaijan 19 16 -7% 7% -0.97 38%
Belarus 18 20 -27% -34% 0.80 -40%
Belgium 19 12 11 7% 19% 0.34 -4% 69% -0.06
Bosnia and Herzegovina 16
Bulgaria 17 11 -36% -5% 7.49 -52%
Croatia 19 12 -21% 19% -1.10
Cyprus 23 18 11 -6% 48% -0.13 18% 143% 0.13
Czechia 29 17 -10% -14%
Denmark 13 10 10 19% 22% 0.84 3% 32% 0.09
Estonia 14 11 -26% -3% 7.49 -30%
Finland 16 17 13 -4% 19% -0.20 -4% 12% -0.38
France 21 17 17 0% 1% -0.22 -11% 10% -1.13
Georgia 19 17 10 9% 84% 0.11 0% 95% 0.00
Germany 16 12 -15% 10% -1.47
Gibraltar 18 23 13 22% 117% 0.19 7% 53% 0.12
Greece 25 13 8 -3% 63% -0.04 -30% 116% -0.26
Hungary 11 9 -29% -19% 1.56 -39%
Iceland 16 13 10 6% 43% 0.14 35% 125% 0.28
Ireland 29 21 27% 37%
Italy 16 11 11 -1% -3% 0.42 -38% -9% 4.28
Kazakhstan 20 17 25% 46% 0.55 44%
Kyrgyz Republic 30 24 26 22% 14% 1.57 89% 120% 0.74
Latvia 20 15 11 -11% 18% -0.63 -15% 49% -0.31
Liechtenstein 11 7 -6% 38% -0.15
Lithuania 25 16 14 -46% -36% 1.27 -31% 25% -1.23
Luxembourg 14 12 8 24% 90% 0.26 57% 185% 0.31
Moldova 29 21 18 -45% -36% 1.25 -39% 0% -277.32
Monaco 18 22 11 -2% 97% -0.02 34% 116% 0.29
Montenegro 3%
Netherlands 12 11 -9% 4% -2.17
North Macedonia 22 14 -12% 32% -0.38
Norway 15 11 9 7% 35% 0.20 14% 98% 0.14
Poland 10 10 -29% -29% 0.99 -25%
Portugal 18 13 12 -26% -17% 1.51 -51% -26% 1.99
Romania 25 19 19 -23% -26% 0.89 -38% -20% 1.92
Russian Federation 29 18 21 19% 0% -55.82 23% 66% 0.34
San Marino 12 5 6 28% 8% 3.48 4% 91% 0.05
Serbia 14 -26%
Slovak Republic 18 15 -24% -13% 1.85
Slovenia 13 6 57% 240% 0.24 28%
Spain 28 15 13 19% 36% 0.53 -16% 84% -0.19
Sweden 17 12 12 14% 9% 1.52 31% 80% 0.38
Switzerland 17 13 10 12% 50% 0.24 20% 117% 0.17
Tajikistan 22 23 38% 33% 1.15
Turkmenistan 26
Türkiye 28 26 18 -17% 19% -0.90 -3% 53% -0.06
Ukraine 20 15 -17% 7% -2.48 -21%
United Kingdom 19 19 18 7% 14% 0.50 -4% 4% -0.85
Uzbekistan 24 21 21 -4% 1% -6.75 86% 118% 0.73
East Asia & Pacific (EAS)
American Samoa 18
Australia 19 18 20% 33%
Brunei Darussalam 18 14 9 -13% 28% -0.45 30% 155% 0.19
Cambodia 41 50 42 -4% 15% -0.25 85% 78% 1.09
China 27 22 17 -18% 10% -1.79 -27% 17% -1.57
Fiji 24 28 19 10% 64% 0.15 27% 63% 0.43
French Polynesia 21 11
Guam 20
Hong Kong SAR, China 30 22 13 -24% 27% -0.90 -30% 62% -0.49
Indonesia 34 22 16 4% 41% 0.09 22% 154% 0.14
Japan 25 18 15 -14% 4% -3.94 -47% -10% 4.82
Kiribati 30 32 26 26% 53% 0.50 39% 62% 0.63
Korea, Dem. People’s Rep.  20
Korea, Rep.  48 29 14 -33% 35% -0.94 -52% 59% -0.89
Lao PDR 31 30 22 -9% 26% -0.33 64% 132% 0.49
Macao SAR, China 30 30 13 -28% 61% -0.46 37% 207% 0.18
Malaysia 27 20 13 1% 57% 0.02 53% 230% 0.23
Marshall Islands 16 -20%
Micronesia 21 23 21 -36% -29% 1.20 -47% -46% 1.01
Mongolia 32 33 31 36% 45% 0.80 143% 151% 0.95
Myanmar 48 33 27 6% 27% 0.20 29% 128% 0.23
Nauru 21 21 23 -7% -15% 0.48 4% -8% -0.43
New Caledonia 20
New Zealand 18 18 14 8% 41% 0.19 2% 30% 0.06
Palau 16 -22%
Papua New Guinea 31 35 33 172% 190% 0.91 408% 376% 1.09
Philippines 32 35 24 2% 48% 0.04 60% 111% 0.54
Samoa 20 24 21% 20%
Singapore 31 24 14 -16% 42% -0.37 -19% 78% -0.24
Solomon Islands 25 18 24 90% 45% 2.00 277% 297% 0.93
Taiwan 32 19 12 -39% -5% 8.60 -47% 40% -1.18
Thailand 26 21 12 -20% 41% -0.49 -33% 46% -0.70
Timor-Leste 81 26 8% 232% 0.03
Tonga 24 22 22 2% 3% 0.65 -10% 0% 40.18
Tuvalu 20 10 -12% 72% -0.16 35%
Vanuatu 24 23 4 58% 783% 0.07 142% 1,317% 0.11
Vietnam 36 30 23 -13% 11% -1.23 10% 74% 0.14