Complements or Substitutes?
Carolina Torreblanca
University of Pennsylvania
Global Development: Intermediate Topics in Politics, Policy, and Data
PSCI 3200 - Spring 2026
Your Research Design is due TONIGHT
Last week: the state and security
Today: the state and health
Development has undoubtedly prolonged life: vaccines, sanitation, medicine, nutrition, heating.
But development also brings negative externalities:
Today’s paper: a case where a development policy had unintended health consequences
Air quality in China is notoriously poor
During the 1950–1980 period of central planning, the Chinese government gave free coal winter heating
But due to budgetary constraints, this right was only extended to areas north of the Huai River.
Cities north of the solid line were covered by the heating policy.
Does sustained exposure to air pollution reduce life expectancy?
Coal combustion releases Total Suspended Particulates (TSPs) into the air
Air pollution: TSP concentrations from 90 cities (1981–2000)
Health: Mortality data from China’s Disease Surveillance Points (DSPs)
**Treatment: north or south of the Huai River
Imagine you want to know: does passing a class improve your career?
This is what Chen et al. exploit: the Huai River is a cutoff that assigns free coal.
Key concern: is there anything else that jumps at the river?
TSP concentrations jump by ~200 \(\mu g/m^3\) at the Huai River.
Life expectancy drops by 5.5 years north of the Huai River.
rdrobusty: outcome variablex: running variable (distance from cutoff)c: the cutoff valuerdrobust automatically picks the optimal bandwidth and polynomialSame interpretation as lm() — but the estimate is local to the cutoff
library(ggplot2)
set.seed(42)
n <- 200
latitude <- runif(n, -8, 8)
north <- as.numeric(latitude >= 0)
# True effect: 5.5 fewer years north of the river
life_exp <- 78 - 0.3 * latitude - 5.5 * north + rnorm(n, 0, 3)
sim_data <- data.frame(latitude, north, life_exp)
ggplot(sim_data, aes(x = latitude, y = life_exp, color = factor(north))) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(method = "lm", se = FALSE, linewidth = 1.2) +
geom_vline(xintercept = 0, linetype = "dashed", linewidth = 1) +
scale_color_manual(values = c("0" = "#011F5B", "1" = "red"),
labels = c("South", "North")) +
annotate("label", x = 0, y = 85, label = "Huai River",
size = 5, color = "grey30") +
labs(x = "Degrees of latitude from Huai River",
y = "Life expectancy (years)",
title = "Simulated RDD: life expectancy drops north of the river",
color = "") +
theme_minimal(base_size = 16) +
theme(legend.position = "bottom")rdrobust on Simulated DataSharp RD estimates using local polynomial regression.
Number of Obs. 200
BW type mserd
Kernel Triangular
VCE method NN
Number of Obs. 89 111
Eff. Number of Obs. 23 28
Order est. (p) 1 1
Order bias (q) 2 2
BW est. (h) 2.057 2.057
BW bias (b) 3.581 3.581
rho (h/b) 0.574 0.574
Unique Obs. 89 111
=============================================================================
Method Coef. Std. Err. z P>|z| [ 95% C.I. ]
=============================================================================
Conventional -4.363 2.440 -1.788 0.074 [-9.145 , 0.419]
Robust - - -1.188 0.235 [-9.613 , 2.357]
=============================================================================
rdplot(y = sim_data$life_exp,
x = sim_data$latitude,
c = 0,
title = "RDD Plot: Life Expectancy at the Huai River",
x.label = "Degrees of latitude from Huai River",
y.label = "Life expectancy (years)")