Data: This report is based off of the OECD Creditor Reporting System data, accessed via the bulk download files on 6/18/2024.

Filters: I have looked at a subset of the CRS as follows:

  • Country Programmable Aid (excluding items listed in CPA definition)

  • Rows with commitments data

  • Low income and lower middle income countries only

Herfindahl-Hirschman Index (HHI): For a given recipient, the sum of squared shares of aid from each donor

Donors

By Income Group

HHI via sum across countries…

How to interpret: How concentrated by donor are all CPA commitments to low income countries? Here we calculate HHI for low income countries (as a group). For each donor we add up all the CPA commitments they made to low income countries in a given year, and then calculating HHI.

#Total
#plotTS(yr, "hhi","HHI","HHI for low and lower middle income countries, 2005-2022")

#HHI based on totals of for each income group
income_hhi_totals <- yr_income#%>%
  #bind_rows(yr)%>%
  #mutate(Income=ifelse(is.na(Income),"Total",Income))

plotTS(income_hhi_totals, "hhi","HHI","HHI for low and lower middle income countries (Total), 2005-2022", GROUP="Income")

Median HHI across countries…

How to interpret: For a typical low income country, what is the HHI? Here we calculate the HHI for each country and take a simple median across countries in each income group.

#HHI averages across countries in each income group
income_hhi_avg <- yr_recipient%>%
  group_by(Year, Income)%>%
  summarise(hhi_median = median(hhi))

plotTS(income_hhi_avg, "hhi_median","HHI","Median HHI across low and lower middle income countries, 2005-2022", GROUP="Income")

By Region

HHI via sum across countries…

How to interpret: How concentrated by donor are all CPA commitments to countries in Sub-Saharan Africa? Here we calculate HHI for each region as a group. For each donor we add up all the CPA commitments they made to each region in a given year, and then calculating HHI.

#Total
#plotTS(yr, "hhi","HHI","HHI for low and lower middle income countries, 2005-2022")

#HHI based on totals of each Region
region_hhi_totals <- yr_region%>%
  bind_rows(yr)%>%
  mutate(Region=ifelse(is.na(Region),"Total",Region))

plotTS(region_hhi_totals, "hhi","HHI","HHI for low and lower middle income countries (Total), 2005-2022", FACET="Region")

Median HHI across countries…

How to interpret: For a typical country in sub-saharan africa, what is the HHI? Here we calculate the HHI for each country and take a simple median across countries in each region.

#HHI averages across countries in each income group
region_hhi_avg <- yr_recipient%>%
  group_by(Year, Region)%>%
  summarise(hhi_median = median(hhi))

plotTS(region_hhi_avg, "hhi_median","HHI","Median HHI across low and lower middle income countries, 2005-2022", FACET="Region")

By Country

#By Country
licplotdf <- yr_recipient%>%
  filter(Income %in% c("Low income"))%>%
  addSummaryCol("median","hhi")
          
plotTS(licplotdf, "hhi","HHI","HHI for low income countries, 2005-2022", FACET="RecipientName", FACET_SORT = "Slope", FACET_CONST="median")
lmicplotdf <- yr_recipient%>%
  filter(Income %in% c("Lower middle income"))%>%
  addSummaryCol("median","hhi")
          
plotTS(lmicplotdf, "hhi","HHI","HHI for lower middle income countries, 2005-2022", FACET="RecipientName", FACET_SORT = "Slope", FACET_CONST="median")
# #https://stackoverflow.com/questions/57580848/get-trendline-slope-of-multiple-time-series-by-group
# hhi_slopes <- hhi%>%
#   group_by(Income)%>%
#   mutate(rownum = row_number())%>% 
#   summarise(HHI_Slope = lm(HHI ~ rownum)$coefficients['rownum'])

Single country example, before (2006) and after (2022):

Channels

By Income Group

HHI via sum across countries…

How to interpret: How concentrated by channel are all CPA commitments to low income countries? Here we calculate HHI for low income countries (as a group). For each channel we add up all the CPA commitments they made to low income countries in a given year, and then calculating HHI.

#Total
#plotTS(yr, "hhi","HHI","HHI for low and lower middle income countries, 2005-2022")

#HHI based on totals of for each income group
income_hhi_totals <- yr_ch_income#%>%
  #bind_rows(yr_ch)%>%
  #mutate(Income=ifelse(is.na(Income),"Total",Income))

plotTS(income_hhi_totals, "hhi","HHI","HHI for low and lower middle income countries (Total), 2005-2022", GROUP="Income")

Median HHI across countries…

How to interpret: For a typical low income country, what is the HHI? Here we calculate the HHI for each country and take a simple median across countries in each income group.

#HHI averages across countries in each income group
income_hhi_avg <- yr_ch_recipient%>%
  group_by(Year, Income)%>%
  summarise(hhi_median = median(hhi))

plotTS(income_hhi_avg, "hhi_median","HHI","Median HHI across low and lower middle income countries, 2005-2022", GROUP="Income")

By Region

HHI via sum across countries…

How to interpret: How concentrated by channels are all CPA commitments to countries in Sub-Saharan Africa? Here we calculate HHI for each region as a group. For each donor we add up all the CPA commitments they made to each region in a given year, and then calculating HHI.

#Total
#plotTS(yr, "hhi","HHI","HHI for low and lower middle income countries, 2005-2022")

#HHI based on totals of each Region
region_hhi_totals <- yr_ch_region#%>%
  #bind_rows(yr_ch)%>%
  #mutate(Region=ifelse(is.na(Region),"Total",Region))

plotTS(region_hhi_totals, "hhi","HHI","HHI for low and lower middle income countries (Total), 2005-2022", FACET="Region")

Median HHI across countries…

How to interpret: For a typical country in sub-saharan africa, what is the HHI? Here we calculate the HHI for each country and take a simple median across countries in each region.

#HHI averages across countries in each income group
region_hhi_avg <- yr_ch_recipient%>%
  group_by(Year, Region)%>%
  summarise(hhi_median = median(hhi))

plotTS(region_hhi_avg, "hhi_median","HHI","Median HHI across low and lower middle income countries, 2005-2022", FACET="Region")

By Country

#By Country
licplotdf <- yr_ch_recipient%>%
  filter(Income %in% c("Low income"))%>%
  addSummaryCol("median","hhi")
          
plotTS(licplotdf, "hhi","HHI","HHI for low income countries, 2005-2022", FACET="RecipientName", FACET_SORT = "Slope", FACET_CONST="median")
lmicplotdf <- yr_ch_recipient%>%
  filter(Income %in% c("Lower middle income"))%>%
  addSummaryCol("median","hhi")
          
plotTS(lmicplotdf, "hhi","HHI","HHI for lower middle income countries, 2005-2022", FACET="RecipientName", FACET_SORT = "Slope", FACET_CONST="median")
# #https://stackoverflow.com/questions/57580848/get-trendline-slope-of-multiple-time-series-by-group
# hhi_slopes <- hhi%>%
#   group_by(Income)%>%
#   mutate(rownum = row_number())%>% 
#   summarise(HHI_Slope = lm(HHI ~ rownum)$coefficients['rownum'])