Nothing
## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
warning = FALSE,
message = FALSE
)
## -----------------------------------------------------------------------------
library(subincomeR)
library(dplyr)
library(ggplot2)
library(extrafont)
library(ggtext)
library(fixest)
library(countrycode)
## -----------------------------------------------------------------------------
# Load DOSE data
data <- getDOSE(years = c(2000, 2019))
# Calculate growth rates and initial income
convergence_data <- data %>%
# filter missing values
filter(!is.na(grp_pc_usd_2015)) %>%
# keep all regions with data for both years
group_by(GID_1) %>%
filter(n() == 2) %>%
arrange(year) %>%
summarize(
initial_pop = first(pop),
initial_income = first(grp_pc_usd_2015),
final_income = last(grp_pc_usd_2015),
growth_rate = (log(final_income) - log(initial_income)) / (max(year) - min(year)),
country = first(GID_0)
) %>%
ungroup() %>%
# get continent
mutate(
continent = countrycode(country, origin = "iso3c", destination = "continent")
)
## -----------------------------------------------------------------------------
# Run convergence regression
model <- feols(
growth_rate ~ log(initial_income),
data = convergence_data,
vcov = "hetero"
)
# Create formatted coefficients for the plot subtitle
model_stats <- summary(model)
beta <- coef(model)["log(initial_income)"]
pval <- model_stats$coeftable["log(initial_income)", "Pr(>|t|)"]
## -----------------------------------------------------------------------------
# Plot convergence regression ----
## Theme ----
theme_convergence <- function() {
theme_minimal() +
theme(
text = element_text(family = "Open Sans", size = 16),
plot.title = element_text(size = 18, margin = margin(b = 20)),
plot.subtitle = element_text(size = 14, color = "grey40"),
plot.caption = element_textbox_simple(
size = 12,
color = "grey40",
margin = margin(t = 20),
hjust = 0
),
legend.position = "top",
legend.justification = "left",
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
axis.title = element_text(size = 14)
)
}
continent_colors <- c(
"Africa" = "#E31C1C", # Red
"Asia" = "#0066CC", # Blue
"Europe" = "#4DAF4A", # Green
"Americas" = "#984EA3", # Purple
"Oceania" = "#FF7F00" # Orange
)
## Plot ----
ggplot(convergence_data,
aes(x = log(initial_income),
y = growth_rate * 100)) +
geom_point(
aes(size = initial_pop,
color = continent),
alpha = 0.4
) +
geom_smooth(
method = "lm",
color = "#0072B2",
linewidth = 1.5,
se = TRUE,
alpha = 0.5
) +
annotate(
"text",
x = 10.5,
y = 7,
label = sprintf("β = %.3f\n(p = %.3f)", beta, pval),
hjust = 0,
size = 5,
family = "Open Sans"
) +
scale_y_continuous(
labels = function(x) paste0(x, "%")
) +
scale_size_continuous(
range = c(1, 8),
guide = "none"
) +
scale_color_manual(
values = continent_colors,
name = NULL
) +
labs(
title = "Regional Income Convergence, 2000-2019",
x = "Log Initial Income (2000)",
y = "Average Annual Growth Rate",
caption = "**Data** DOSE dataset | **Plot** @pablogguz_"
) +
theme_convergence() +
theme(
legend.position = "top",
legend.direction = "horizontal",
legend.justification = "left",
legend.key.size = unit(1, "lines"),
legend.margin = margin(t = 0, b = 0)
) +
guides(
color = guide_legend(override.aes = list(size = 4))
)
## -----------------------------------------------------------------------------
model_conditional <- feols(
growth_rate ~ log(initial_income) | country,
data = convergence_data,
vcov = "hetero"
)
etable(
model,
model_conditional,
title = "Regional Convergence Results",
headers = c("Absolute", "Conditional"),
se.below = TRUE,
keep = "log",
notes = "Heteroskedasticity-robust standard errors in parentheses."
)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.