<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>development | Carlos Mendez</title><link>https://carlos-mendez.org/tag/development/</link><atom:link href="https://carlos-mendez.org/tag/development/index.xml" rel="self" type="application/rss+xml"/><description>development</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><copyright>Carlos Mendez</copyright><lastBuildDate>Sat, 09 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://carlos-mendez.org/media/icon_huedfae549300b4ca5d201a9bd09a3ecd5_79625_512x512_fill_lanczos_center_3.png</url><title>development</title><link>https://carlos-mendez.org/tag/development/</link></image><item><title>Do Institutions Cause Prosperity? An IV Tutorial in Python</title><link>https://carlos-mendez.org/post/python_iv/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://carlos-mendez.org/post/python_iv/</guid><description>&lt;h2 id="1-overview">1. Overview&lt;/h2>
&lt;p>A simple cross-country plot tells a striking story: countries with stronger property-rights institutions are vastly richer than countries with weaker ones. The slope is real, the gradient is huge, and almost every development economist agrees that &lt;strong>something&lt;/strong> about institutions matters for prosperity. But that simple plot cannot tell us &lt;em>which way the arrow points&lt;/em>. Maybe rich countries can simply afford to build better courts, regulators, and parliaments. Maybe a third factor — geography, climate, culture, or human capital — drives both income and institutions. The slope might describe correlation; it cannot prove causation.&lt;/p>
&lt;p>Acemoglu, Johnson and Robinson (2001) — henceforth &lt;strong>AJR&lt;/strong> — proposed a now-famous solution: use the &lt;strong>mortality rate of European settlers&lt;/strong> during colonization as an &lt;em>instrumental variable&lt;/em> for modern institutional quality. Their argument is that places where Europeans died en masse (tropical lowlands with malaria and yellow fever) became &lt;em>extractive&lt;/em> colonies, while places where Europeans survived became &lt;em>settler&lt;/em> colonies with European-style property-rights protections. Because settler mortality was determined by the disease environment of 1500–1900 — not by the income of countries in 1995 — it provides a source of variation in institutions that is &lt;em>plausibly&lt;/em> unrelated to all the modern unobserved factors that confound the simple plot.&lt;/p>
&lt;p>This tutorial replicates AJR&amp;rsquo;s headline result on a sample of 64 ex-colonies using a &lt;strong>hybrid Python stack&lt;/strong>: &lt;a href="https://pyfixest.org/" target="_blank" rel="noopener">&lt;code>pyfixest&lt;/code>&lt;/a> (the Python port of R&amp;rsquo;s &lt;code>fixest&lt;/code>) for the structural 2SLS estimates and OLS comparisons, and &lt;a href="https://bashtage.github.io/linearmodels/" target="_blank" rel="noopener">&lt;code>linearmodels&lt;/code>&lt;/a> for the canonical Kleibergen-Paap weak-IV F-statistic, Hansen J overidentification test, and Wu-Hausman endogeneity test. We start with the naive OLS slope of 0.522, walk through the three identification conditions an instrument must satisfy, and arrive at a 2SLS estimate of &lt;strong>0.944&lt;/strong> — about 81% larger. We then layer on five families of robustness checks (colonial controls, geography, health, alternative instruments, overidentification) and confront Albouy&amp;rsquo;s (2012) imputation critique honestly. The numbers reproduce the Stata &lt;code>ivreg2&lt;/code> reference (see &lt;a href="../stata_iv/">the companion Stata post&lt;/a>) to three decimal places. The case study question is direct: &lt;strong>&amp;ldquo;Do better institutions cause higher GDP per capita, or are they merely correlated with it?&amp;quot;&lt;/strong>&lt;/p>
&lt;h3 id="the-iv-identification-strategy-at-a-glance">The IV identification strategy at a glance&lt;/h3>
&lt;p>Before we estimate anything, here is the picture of the strategy. The dashed red arrow is the assumption we cannot test directly — it is the heart of every IV paper.&lt;/p>
&lt;pre>&lt;code class="language-mermaid">flowchart LR
Z[&amp;quot;Settler mortality&amp;lt;br/&amp;gt;(logem4)&amp;quot;]
X[&amp;quot;Modern institutions&amp;lt;br/&amp;gt;(avexpr)&amp;quot;]
Y[&amp;quot;Log GDP per capita&amp;lt;br/&amp;gt;(logpgp95)&amp;quot;]
U[&amp;quot;Unobserved confounders&amp;lt;br/&amp;gt;(geography? culture?&amp;lt;br/&amp;gt;human capital?)&amp;quot;]
Z --&amp;gt;|&amp;quot;first stage&amp;lt;br/&amp;gt;relevance ✓&amp;quot;| X
X --&amp;gt;|&amp;quot;causal effect&amp;lt;br/&amp;gt;(what we want)&amp;quot;| Y
U --&amp;gt;|&amp;quot;bias OLS&amp;quot;| X
U --&amp;gt;|&amp;quot;bias OLS&amp;quot;| Y
Z -.-&amp;gt;|&amp;quot;exclusion restriction:&amp;lt;br/&amp;gt;no direct arrow&amp;quot;| Y
style Z fill:#6a9bcc,stroke:#141413,color:#fff
style X fill:#d97757,stroke:#141413,color:#fff
style Y fill:#00d4c8,stroke:#141413,color:#141413
style U fill:#1a3a8a,stroke:#141413,color:#fff,stroke-dasharray: 5 5
&lt;/code>&lt;/pre>
&lt;p>The diagram shows what makes IV work: the instrument &lt;code>logem4&lt;/code> (settler mortality) influences the outcome &lt;code>logpgp95&lt;/code> (log GDP) &lt;strong>only&lt;/strong> through the endogenous regressor &lt;code>avexpr&lt;/code> (institutions). The dashed arrow from &lt;code>Z&lt;/code> to &lt;code>Y&lt;/code> is forbidden — that is the &lt;em>exclusion restriction&lt;/em>. Unobserved confounders &lt;code>U&lt;/code> may freely contaminate both &lt;code>X&lt;/code> and &lt;code>Y&lt;/code>, but as long as they do not also drive &lt;code>Z&lt;/code>, the IV estimator isolates the part of variation in &lt;code>X&lt;/code> that is exogenous (the part predicted by &lt;code>Z&lt;/code>) and uses only that part to estimate the causal effect on &lt;code>Y&lt;/code>.&lt;/p>
&lt;h3 id="learning-objectives">Learning objectives&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Recognize&lt;/strong> when ordinary least squares (OLS) is biased by reverse causality, omitted variables, and measurement error.&lt;/li>
&lt;li>&lt;strong>State&lt;/strong> the three conditions an instrumental variable must satisfy: relevance, exclusion, and exogeneity.&lt;/li>
&lt;li>&lt;strong>Estimate&lt;/strong> the AJR (2001) 2SLS coefficient on institutions using &lt;code>pyfixest.feols&lt;/code> with the formula &lt;code>&amp;quot;Y ~ exog | endog ~ Z&amp;quot;&lt;/code> syntax, and compare it to &lt;code>linearmodels.iv.IV2SLS&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Diagnose&lt;/strong> weak instruments using the Kleibergen-Paap rk Wald F-statistic (via &lt;code>linearmodels&lt;/code>) and the Stock-Yogo critical values.&lt;/li>
&lt;li>&lt;strong>Interpret&lt;/strong> the 2SLS coefficient as a Local Average Treatment Effect (LATE) under heterogeneous effects (Imbens-Angrist 1994).&lt;/li>
&lt;li>&lt;strong>Test&lt;/strong> the exclusion restriction with the Hansen J overidentification test (via &lt;code>linearmodels.iv.IV2SLS.sargan&lt;/code>) and recognize what it cannot tell you.&lt;/li>
&lt;/ul>
&lt;h3 id="key-concepts-at-a-glance">Key concepts at a glance&lt;/h3>
&lt;p>The post leans on a small vocabulary repeatedly. The rest of the tutorial assumes you can move between these terms quickly. Each concept below has three parts. The &lt;strong>definition&lt;/strong> is always visible. The &lt;strong>example&lt;/strong> and &lt;strong>analogy&lt;/strong> sit behind clickable cards: open them when you need them, leave them collapsed for a quick scan. If a later section mentions &amp;ldquo;exclusion restriction&amp;rdquo; or &amp;ldquo;LATE&amp;rdquo; and the term feels slippery, this is the section to re-read.&lt;/p>
&lt;p>&lt;strong>1. Endogeneity.&lt;/strong>
A regressor is &lt;em>endogenous&lt;/em> when it is correlated with the error term. In our context, &lt;code>avexpr&lt;/code> (institutions) is endogenous because it is jointly determined with GDP, shares unobserved confounders with GDP, and is measured imperfectly. OLS estimates of endogenous regressors are biased — they do not equal the true causal effect even in large samples.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>The Wu-Hausman endogeneity test in Table 4 Col 1 returns $F = 24.22$ with $p &amp;lt; 0.0001$. We reject the null that OLS is consistent: &lt;code>avexpr&lt;/code> &lt;em>is&lt;/em> statistically endogenous in this dataset, so IV is empirically warranted, not just theoretically motivated.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A bathroom scale that you stand on while holding a heavy weight. The reading is real, but it does not reflect just your body weight — it bundles your weight with the weight you are holding. OLS bundles the causal effect with confounding. We need a different tool to separate them.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>2. Instrumental variable&lt;/strong> (instrument, $Z$).
A variable that affects the outcome &lt;code>Y&lt;/code> &lt;em>only&lt;/em> through its effect on the endogenous regressor &lt;code>X&lt;/code>. Three conditions must hold: (i) &lt;strong>relevance&lt;/strong> — &lt;code>Z&lt;/code> and &lt;code>X&lt;/code> are correlated; (ii) &lt;strong>exclusion&lt;/strong> — &lt;code>Z&lt;/code> does not enter the outcome equation directly; (iii) &lt;strong>exogeneity&lt;/strong> — &lt;code>Z&lt;/code> is uncorrelated with the error term &lt;code>U&lt;/code>.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>&lt;code>logem4&lt;/code> (log settler mortality) satisfies (i) by construction — the first-stage coefficient is $-0.607$ with $F \approx 16.85$ (linearmodels' HC-robust partial F, the closest analogue to Stata &lt;code>ivreg2&lt;/code>&amp;rsquo;s Kleibergen-Paap rk Wald F). (ii) and (iii) are AJR&amp;rsquo;s substantive claim: settler mortality circa 1700 cannot directly affect 1995 GDP except by shaping the colonial institutions that countries inherited. (ii) and (iii) are &lt;strong>untestable in general&lt;/strong> but can be partially examined via overidentification (Hansen J / Sargan).&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A coin flip that decides which patient gets the drug. The flip influences the outcome (recovery) only through whether the patient took the drug. The flip itself does not heal anyone. That is what an instrument is supposed to be: a clean external nudge.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>3. Two-Stage Least Squares (2SLS).&lt;/strong>
The standard IV estimator. Stage 1: regress the endogenous &lt;code>X&lt;/code> on the instrument &lt;code>Z&lt;/code> (and any controls). Stage 2: regress &lt;code>Y&lt;/code> on the &lt;em>predicted&lt;/em> &lt;code>X̂&lt;/code> from stage 1. The 2SLS coefficient on &lt;code>X̂&lt;/code> is the IV estimate. Both &lt;code>pyfixest.feols&lt;/code> and &lt;code>linearmodels.iv.IV2SLS&lt;/code> perform both stages internally; you only see the second-stage output.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>Stage 1: &lt;code>avexpr = 9.341 - 0.607 × logem4&lt;/code>. Stage 2: &lt;code>logpgp95 = 1.910 + 0.944 × avexpr_hat&lt;/code>. The 0.944 is the 2SLS coefficient — it uses only the part of &lt;code>avexpr&lt;/code> predicted by &lt;code>logem4&lt;/code>, throwing away the part contaminated by unobserved confounders.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Filtering muddy water through a sieve. The sieve (stage 1) catches the dirt (unobserved confounding). What passes through (stage 2) is the clean signal you can drink — the part of &lt;code>X&lt;/code> driven only by the exogenous instrument.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>4. Weak instrument.&lt;/strong>
An instrument that has only a weak correlation with the endogenous regressor. Even with infinite data, weak instruments produce IV estimators with massive standard errors and substantial finite-sample bias. The conventional rule of thumb (Staiger and Stock 1997) is that the first-stage F-statistic should exceed 10. Stock and Yogo (2005) give more refined critical values.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>In our main spec, &lt;code>linearmodels&lt;/code>' robust first-stage F = 16.85 (the Stata &lt;code>ivreg2&lt;/code> reference reports a closely related Kleibergen-Paap rk Wald F = 16.32). Both straddle the F &amp;gt; 10 rule of thumb and the Stock-Yogo 10% maximal-IV-size threshold of 16.38. Several robustness specs (Tables 6 and 7) drop the F below 5, which means the IV estimate&amp;rsquo;s confidence interval should not be taken literally.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A radio antenna pointing in roughly the right direction. If the signal is strong enough you hear the music clearly. If the signal is weak (low F) you hear mostly static. The static is the bias.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>5. LATE vs ATE.&lt;/strong>
Under heterogeneous treatment effects, 2SLS does &lt;strong>not&lt;/strong> identify the population average treatment effect (ATE). Imbens and Angrist (1994) show that 2SLS identifies the &lt;strong>Local Average Treatment Effect (LATE)&lt;/strong> — the effect for the subpopulation of &amp;ldquo;compliers&amp;rdquo;, i.e., units whose treatment status would change in response to a change in the instrument. Under constant effects, LATE = ATE.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>Our 0.944 coefficient is the effect of &lt;code>avexpr&lt;/code> on &lt;code>logpgp95&lt;/code> for the subset of countries whose 1995 institutional quality would have been &lt;em>different&lt;/em> had their settler mortality been different. It is &lt;em>not&lt;/em> a population-average claim like &amp;ldquo;if every country improved its institutions by one point, GDP would rise by 94%.&amp;rdquo;&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A drug trial where eligibility depends on a coin flip. The trial estimates the effect &lt;em>for people who comply with the coin flip&lt;/em>. People who would always take the drug regardless, and people who would never take it, are not in the LATE. The LATE is a real effect on real people — just not on everyone.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>6. Hansen J / Sargan overidentification test.&lt;/strong>
When you have &lt;em>more&lt;/em> instruments than endogenous regressors, you can test the joint exogeneity of the instrument set. The Hansen J test (&lt;code>sargan&lt;/code> attribute on &lt;code>linearmodels.iv.IV2SLS&lt;/code> results) compares the moment conditions across instruments: if they all agree on the same causal effect, the test does not reject. Critical caveat: Hansen J cannot test a &lt;em>single&lt;/em> instrument in a just-identified model, and it has low power against shared imputation bias.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>In Table 8 Panel C we pair each alternative instrument with &lt;code>logem4&lt;/code> and run 2SLS via &lt;code>linearmodels&lt;/code>. Hansen J p-values range from 0.18 to 0.79 across five instrument pairs — uniformly failing to reject. But Albouy (2012) shows ~36% of mortality observations are imputed or shared across countries, so this non-rejection does not rule out shared imputation noise.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Two witnesses giving the same alibi. Their agreement is &lt;em>consistent with&lt;/em> truth, but if they share a flawed memory of the same event, they will agree falsely. Hansen J cannot tell consistent witnesses from coordinated ones.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>7. First stage and reduced form.&lt;/strong>
The &lt;strong>first stage&lt;/strong> is the regression of the endogenous regressor &lt;code>X&lt;/code> on the instrument &lt;code>Z&lt;/code> (and controls). The &lt;strong>reduced form&lt;/strong> is the regression of the outcome &lt;code>Y&lt;/code> directly on the instrument &lt;code>Z&lt;/code> (and controls). The 2SLS coefficient equals the ratio: $\hat{\beta}_{IV} = \hat{\beta}_{RF} / \hat{\beta}_{FS}$ when there is one instrument and one endogenous regressor.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>First stage: $\hat{\beta}_{FS} = -0.607$ (logem4 → avexpr). Reduced form: $\hat{\beta}_{RF} = -0.573$ (logem4 → logpgp95, computed in §6 below). Ratio: $-0.573 / -0.607 = 0.944$ — exactly the 2SLS coefficient. The whole IV machinery boils down to this one division.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>If pulling a rope (the instrument) by 1 meter moves a hidden box (the endogenous regressor) by 0.6 meters, and that pulling also lifts a flag (the outcome) by 0.57 meters, then moving the box by 1 meter must lift the flag by 0.57/0.6 = 0.94 meters. IV is just this proportion calculation.&lt;/p>
&lt;/details>
&lt;/div>
&lt;hr>
&lt;h2 id="2-setup-and-dependencies">2. Setup and dependencies&lt;/h2>
&lt;p>The script depends on five Python packages: &lt;a href="https://pyfixest.org/" target="_blank" rel="noopener">&lt;code>pyfixest&lt;/code>&lt;/a> (the IV / fixed-effects workhorse), &lt;a href="https://bashtage.github.io/linearmodels/" target="_blank" rel="noopener">&lt;code>linearmodels&lt;/code>&lt;/a> (for Kleibergen-Paap, Hansen J, Wu-Hausman), &lt;code>pandas&lt;/code>, &lt;code>numpy&lt;/code>, and &lt;code>matplotlib&lt;/code>. A two-line install is enough:&lt;/p>
&lt;pre>&lt;code class="language-python"># pip install pyfixest linearmodels pandas numpy matplotlib
import warnings; warnings.filterwarnings(&amp;quot;ignore&amp;quot;)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pyfixest as pf
from linearmodels.iv import IV2SLS
np.random.seed(42)
&lt;/code>&lt;/pre>
&lt;p>Why a hybrid stack? &lt;code>pyfixest&lt;/code> excels at idiomatic fixed-effects and IV estimation via the formula syntax &lt;code>&amp;quot;Y ~ exog | FE | endog ~ Z&amp;quot;&lt;/code>, reports the Olea-Pflueger (2013) effective F via &lt;code>.IV_Diag()&lt;/code>, and surfaces the first-stage regression via &lt;code>.first_stage()&lt;/code>. But &lt;code>pyfixest&lt;/code> does &lt;strong>not&lt;/strong> natively report Kleibergen-Paap rk Wald F, Hansen J / Sargan, Wu-Hausman, or Anderson-Rubin — and the &lt;a href="https://pyfixest.org/llms.txt" target="_blank" rel="noopener">llms-friendly docs&lt;/a> explicitly note that &amp;ldquo;multiple endogenous variables are not supported&amp;rdquo;, which blocks Tab 7 Cols 7–9 (where AJR instruments two regressors at once). &lt;code>linearmodels.iv.IV2SLS&lt;/code> handles all of those out of the box. Each library does the job it does best:&lt;/p>
&lt;pre>&lt;code class="language-python"># Site color palette (dark theme)
STEEL_BLUE = &amp;quot;#6a9bcc&amp;quot;
WARM_ORANGE = &amp;quot;#d97757&amp;quot;
TEAL = &amp;quot;#00d4c8&amp;quot;
DARK_NAVY = &amp;quot;#0f1729&amp;quot;
GRID_LINE = &amp;quot;#1f2b5e&amp;quot;
LIGHT_TEXT = &amp;quot;#c8d0e0&amp;quot;
WHITE_TEXT = &amp;quot;#e8ecf2&amp;quot;
plt.rcParams.update({
&amp;quot;figure.facecolor&amp;quot;: DARK_NAVY,
&amp;quot;axes.facecolor&amp;quot;: DARK_NAVY,
&amp;quot;axes.labelcolor&amp;quot;: LIGHT_TEXT,
&amp;quot;axes.titlecolor&amp;quot;: WHITE_TEXT,
&amp;quot;axes.grid&amp;quot;: True,
&amp;quot;grid.color&amp;quot;: GRID_LINE,
&amp;quot;xtick.color&amp;quot;: LIGHT_TEXT,
&amp;quot;ytick.color&amp;quot;: LIGHT_TEXT,
&amp;quot;text.color&amp;quot;: WHITE_TEXT,
})
# Data-loading mode: True = GitHub raw URL (replicable), False = local folder
USE_GITHUB = True
DATA_URL = (
&amp;quot;https://raw.githubusercontent.com/cmg777/starter-academic-v501/master/content/post/stata_iv&amp;quot;
if USE_GITHUB
else &amp;quot;../stata_iv&amp;quot;
)
&lt;/code>&lt;/pre>
&lt;p>Notice that the data live alongside the &lt;strong>companion Stata post&lt;/strong> at &lt;code>content/post/stata_iv/&lt;/code> — no data duplication, and the same eight &lt;code>.dta&lt;/code> files feed both the Stata &lt;code>ivreg2&lt;/code> replication and this Python &lt;code>pyfixest&lt;/code>/&lt;code>linearmodels&lt;/code> replication. That is exactly the cross-language replicability the post is teaching: same inputs, same numbers, different language. With &lt;code>USE_GITHUB = True&lt;/code> (the default), &lt;code>pd.read_stata&lt;/code> pulls each file from the site&amp;rsquo;s GitHub repo so a reader can &lt;code>python analysis.py&lt;/code> from any environment with internet access.&lt;/p>
&lt;hr>
&lt;h2 id="3-data-overview">3. Data overview&lt;/h2>
&lt;p>AJR provide eight datasets — one per table in the original paper. Table 1&amp;rsquo;s dataset (&lt;code>maketable1.dta&lt;/code>) covers the full ~163-country world; Tables 2–8 progressively narrow to the 64-country &lt;strong>base sample&lt;/strong> (&lt;code>baseco==1&lt;/code>) of ex-colonies with valid settler-mortality data. We start with summary statistics on both samples to see how restricting to ex-colonies changes the variable distributions.&lt;/p>
&lt;pre>&lt;code class="language-python">df1 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable1.dta&amp;quot;)
print(&amp;quot;*** Whole world ***&amp;quot;)
print(df1[[&amp;quot;logpgp95&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;euro1900&amp;quot;]].describe().T)
print(&amp;quot;*** AJR base sample (baseco==1) ***&amp;quot;)
base = df1[df1[&amp;quot;baseco&amp;quot;] == 1]
print(base[[&amp;quot;logpgp95&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;euro1900&amp;quot;, &amp;quot;logem4&amp;quot;]].describe().T)
base_summary = base[[&amp;quot;logpgp95&amp;quot;, &amp;quot;loghjypl&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;cons00a&amp;quot;, &amp;quot;cons1&amp;quot;,
&amp;quot;democ00a&amp;quot;, &amp;quot;euro1900&amp;quot;, &amp;quot;logem4&amp;quot;]].describe().T
base_summary[[&amp;quot;count&amp;quot;, &amp;quot;mean&amp;quot;, &amp;quot;std&amp;quot;, &amp;quot;min&amp;quot;, &amp;quot;max&amp;quot;]].to_csv(&amp;quot;tab1_summary.csv&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">*** Whole world ***
count mean std min max
logpgp95 162.0000 8.3040 1.0710 6.1090 10.2890
avexpr 129.0000 6.9890 1.8320 1.6360 10.0000
euro1900 166.0000 30.1020 41.8640 0.0000 100.0000
*** AJR base sample (baseco==1) ***
count mean std min max
logpgp95 64.0000 8.0620 1.0430 6.1090 10.2160
avexpr 64.0000 6.5160 1.4690 3.5000 10.0000
euro1900 63.0000 16.1810 25.5330 0.0000 99.0000
logem4 64.0000 4.6570 1.2580 2.1460 7.9860
&lt;/code>&lt;/pre>
&lt;p>The base sample has 64 former colonies — about 39% of the 162-country universe. Restricting to ex-colonies lowers the mean of &lt;code>avexpr&lt;/code> from 6.99 to 6.52 (institutions are weaker on average among ex-colonies than the world average) and lowers the mean of &lt;code>euro1900&lt;/code> from 30.1 to 16.2 (ex-colonies had fewer European settlers in 1900). The instrument &lt;code>logem4&lt;/code> ranges from 2.15 (very low mortality, ~9 deaths per 1,000) to 7.99 (extremely high, ~2,940 per 1,000), giving cross-country variation of nearly six log points. Log GDP per capita varies from 6.11 (~\$450, the poorest country) to 10.22 (~\$27,400) — a 60-fold income range that is exactly the variation we want to explain. With this much variation in both the instrument and the outcome, the data has enough range to support a credible IV strategy. The next step is to ask: how &lt;em>would&lt;/em> a naive OLS estimate look on this sample?&lt;/p>
&lt;hr>
&lt;h2 id="4-the-naive-ols-benchmark-table-2">4. The naive OLS benchmark (Table 2)&lt;/h2>
&lt;p>Before we instrument anything, we should know what OLS thinks. If OLS already gave us the right answer, IV would be unnecessary. The OLS regression of log GDP per capita on &lt;code>avexpr&lt;/code> (and a few controls) is the natural starting point. We follow AJR Table 2&amp;rsquo;s column structure: full sample, base sample, latitude, continent dummies. All standard errors are heteroskedasticity-robust (HC1).&lt;/p>
&lt;pre>&lt;code class="language-python">df2 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable2.dta&amp;quot;)
m_full = pf.feols(&amp;quot;logpgp95 ~ avexpr&amp;quot;, data=df2, vcov=&amp;quot;HC1&amp;quot;)
m_base = pf.feols(&amp;quot;logpgp95 ~ avexpr&amp;quot;, data=df2[df2[&amp;quot;baseco&amp;quot;] == 1], vcov=&amp;quot;HC1&amp;quot;)
m_lat = pf.feols(&amp;quot;logpgp95 ~ avexpr + lat_abst&amp;quot;, data=df2, vcov=&amp;quot;HC1&amp;quot;)
m_cont = pf.feols(&amp;quot;logpgp95 ~ avexpr + lat_abst + africa + asia + other&amp;quot;, data=df2, vcov=&amp;quot;HC1&amp;quot;)
for name, m in [(&amp;quot;Col 1: Full&amp;quot;, m_full),
(&amp;quot;Col 2: Base&amp;quot;, m_base),
(&amp;quot;Col 3: +Latitude&amp;quot;, m_lat),
(&amp;quot;Col 4: +Continents&amp;quot;, m_cont)]:
b, se = m.coef()[&amp;quot;avexpr&amp;quot;], m.se()[&amp;quot;avexpr&amp;quot;]
print(f&amp;quot;{name:24s} avexpr = {b:.3f} (SE {se:.3f}) N = {int(m._N)}&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">Col 1: Full avexpr = 0.532 (SE 0.029) N = 111
Col 2: Base avexpr = 0.522 (SE 0.050) N = 64
Col 3: +Latitude avexpr = 0.463 (SE 0.052) N = 111
Col 4: +Continents avexpr = 0.390 (SE 0.051) N = 111
&lt;/code>&lt;/pre>
&lt;p>The naive OLS coefficient is remarkably stable across specifications: 0.532 in the full 111-country sample (Col 1), 0.522 in the 64-country base sample (Col 2), and falls only to 0.390 once continent dummies are added (Col 4). At face value, a one-point increase in expropriation protection (on AJR&amp;rsquo;s 0–10 scale) is associated with a 39%–53% rise in income per capita, statistically significant at the 1% level. But these estimates carry three known biases: reverse causality (rich countries can afford better institutions), omitted variables (geography, culture, human capital), and measurement error in the institutional-quality index, which attenuates OLS toward zero. We need IV to find out how much of the 0.522 is bias and how much is the true causal effect.&lt;/p>
&lt;hr>
&lt;h2 id="5-the-first-stage-and-the-reduced-form-table-3-and-figures-12">5. The first stage and the reduced form (Table 3 and Figures 1–2)&lt;/h2>
&lt;p>An instrument must first be &lt;strong>relevant&lt;/strong> — it must move the endogenous regressor. We test relevance with the first-stage regression: &lt;code>avexpr&lt;/code> on &lt;code>logem4&lt;/code> and any controls. Table 3 of AJR shows that settler mortality predicts current institutions (Panel A) &lt;em>and&lt;/em> historical institutions in 1900 (Panel B). The full first-stage F-statistic for the main spec arrives in §6; here we visualize the relationship.&lt;/p>
&lt;pre>&lt;code class="language-python">df4 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable4.dta&amp;quot;)
base = df4[df4[&amp;quot;baseco&amp;quot;] == 1].dropna(subset=[&amp;quot;logpgp95&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;logem4&amp;quot;])
# linearmodels.IV2SLS gives the canonical Kleibergen-Paap-style first-stage F
y = base[&amp;quot;logpgp95&amp;quot;].values
X_endog = base[[&amp;quot;avexpr&amp;quot;]]
X_exog = pd.DataFrame({&amp;quot;const&amp;quot;: np.ones(len(base))}, index=base.index)
Z = base[[&amp;quot;logem4&amp;quot;]]
res = IV2SLS(y, X_exog, X_endog, Z).fit(cov_type=&amp;quot;robust&amp;quot;)
fs_F = float(res.first_stage.diagnostics.loc[&amp;quot;avexpr&amp;quot;, &amp;quot;f.stat&amp;quot;])
fs_pv = float(res.first_stage.diagnostics.loc[&amp;quot;avexpr&amp;quot;, &amp;quot;f.pval&amp;quot;])
print(f&amp;quot;First-stage robust F (~Kleibergen-Paap): {fs_F:.2f} (p = {fs_pv:.2e})&amp;quot;)
print(f&amp;quot;Stock-Yogo 10% maximal IV size threshold: 16.38 (IID)&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">First-stage robust F (~Kleibergen-Paap): 16.85 (p = 4.05e-05)
Stock-Yogo 10% maximal IV size threshold: 16.38 (IID)
&lt;/code>&lt;/pre>
&lt;p>A one-log-point increase in settler mortality lowers modern expropriation protection by 0.607 points, with a t-statistic of about 4. The first-stage HC-robust F-statistic from &lt;code>linearmodels&lt;/code> is &lt;strong>16.85&lt;/strong>, just above the Staiger-Stock (1997) rule of thumb of F &amp;gt; 10 and almost exactly at the Stock-Yogo (2005) iid threshold of 16.38 for ≤10% maximal IV size distortion. (The Stata &lt;code>ivreg2&lt;/code> reference in the &lt;a href="../stata_iv/">companion post&lt;/a> reports a closely related Kleibergen-Paap rk Wald F = 16.32 — the small drift between 16.85 and 16.32 reflects different small-sample adjustments between the two libraries.) Honest disclosure: this F is &lt;em>borderline&lt;/em>, not comfortable. Under heteroskedasticity-robust standard errors, the more rigorous benchmark is the Olea-Pflueger (2013) effective F (available in &lt;code>pyfixest&lt;/code> via &lt;code>.IV_Diag()&lt;/code> then &lt;code>._eff_F&lt;/code>); we will fall back on the weak-IV-robust Anderson-Rubin Wald test in §6 to confirm significance even if one is uncomfortable with the conventional asymptotics.&lt;/p>
&lt;p>The next two figures make the same point graphically. Figure 1 plots the first stage: each point is one country, the orange line is the fitted regression slope, and the cyan labels are ISO country codes.&lt;/p>
&lt;pre>&lt;code class="language-python">fig, ax = plt.subplots(figsize=(10, 6.5))
ax.scatter(base[&amp;quot;logem4&amp;quot;], base[&amp;quot;avexpr&amp;quot;], color=STEEL_BLUE, s=28, alpha=0.85)
for x_, y_, lab in zip(base[&amp;quot;logem4&amp;quot;], base[&amp;quot;avexpr&amp;quot;], base[&amp;quot;shortnam&amp;quot;]):
ax.annotate(lab, (x_, y_), xytext=(4, 2), textcoords=&amp;quot;offset points&amp;quot;,
fontsize=6, color=TEAL, alpha=0.8)
slope = res.first_stage.individual[&amp;quot;avexpr&amp;quot;].params[&amp;quot;logem4&amp;quot;]
intercept = res.first_stage.individual[&amp;quot;avexpr&amp;quot;].params[&amp;quot;const&amp;quot;]
xfit = np.linspace(base[&amp;quot;logem4&amp;quot;].min(), base[&amp;quot;logem4&amp;quot;].max(), 100)
ax.plot(xfit, intercept + slope * xfit, color=WARM_ORANGE, linewidth=2.2)
ax.set_title(&amp;quot;Figure 1. First stage: settler mortality predicts institutions&amp;quot;)
ax.set_xlabel(&amp;quot;Log settler mortality (logem4)&amp;quot;)
ax.set_ylabel(&amp;quot;Avg. protection from expropriation (avexpr)&amp;quot;)
plt.savefig(&amp;quot;python_iv_first_stage.png&amp;quot;, dpi=200, bbox_inches=&amp;quot;tight&amp;quot;,
facecolor=DARK_NAVY, edgecolor=DARK_NAVY)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="python_iv_first_stage.png" alt="First stage: settler mortality predicts institutions">
&lt;em>Figure 1. First-stage scatter of &lt;code>avexpr&lt;/code> (modern expropriation protection) on &lt;code>logem4&lt;/code> (log settler mortality), 64 ex-colonies. Slope = −0.607, F = 16.85, R² = 0.27.&lt;/em>&lt;/p>
&lt;p>The negative slope is unmistakable. Australia (&lt;code>AUS&lt;/code>), New Zealand (&lt;code>NZL&lt;/code>), and the United States (&lt;code>USA&lt;/code>) — the three lowest-mortality colonies — sit at &lt;code>avexpr&lt;/code> ≈ 9–10. Sierra Leone (&lt;code>SLE&lt;/code>), Niger (&lt;code>NER&lt;/code>), and Mali (&lt;code>MLI&lt;/code>) — among the highest-mortality colonies — sit near &lt;code>avexpr&lt;/code> ≈ 3.5–5. The fit captures 27% of the variation in modern institutions across countries. This is the empirical foundation of AJR&amp;rsquo;s argument: deadly disease environments produced extractive colonies, which produced weak modern institutions.&lt;/p>
&lt;p>Figure 2 plots the &lt;strong>reduced form&lt;/strong> — the regression of the &lt;em>outcome&lt;/em> on the &lt;em>instrument&lt;/em> directly, skipping &lt;code>avexpr&lt;/code>. If the IV strategy works, this slope should also be negative (high mortality → low GDP).&lt;/p>
&lt;p>&lt;img src="python_iv_reduced_form.png" alt="Reduced form: settler mortality predicts log GDP">
&lt;em>Figure 2. Reduced-form scatter of &lt;code>logpgp95&lt;/code> (log GDP per capita, 1995, PPP) on &lt;code>logem4&lt;/code>, 64 ex-colonies. The slope (≈ −0.573) is the total effect of the instrument on the outcome.&lt;/em>&lt;/p>
&lt;p>The reduced-form gradient is steep: across the 5.8-log-point span of &lt;code>logem4&lt;/code>, the fitted line predicts a GDP gap of about 3.4 log points — roughly &lt;strong>30× poorer&lt;/strong> for the highest-mortality colonies relative to the lowest-mortality ones. This is the &lt;em>total&lt;/em> effect of the instrument on the outcome. The IV decomposes it into two pieces: the first-stage effect (mortality → institutions) and the second-stage effect (institutions → GDP). When we divide the reduced-form slope by the first-stage slope, the institutions-mediated channel pops out: &lt;strong>−0.573 / −0.607 = 0.944&lt;/strong> — exactly the 2SLS coefficient we will recover in the next section.&lt;/p>
&lt;hr>
&lt;h2 id="6-the-main-2sls-estimate-table-4">6. The main 2SLS estimate (Table 4)&lt;/h2>
&lt;p>This is the headline result. We instrument &lt;code>avexpr&lt;/code> with &lt;code>logem4&lt;/code>, all standard errors are heteroskedasticity-robust, and we run the Wu-Hausman endogeneity test via &lt;code>linearmodels&lt;/code>. Before running the regression, two equations make the IV machinery explicit. The structural model is:&lt;/p>
&lt;p>$$Y_i = \alpha + \beta X_i + U_i, \quad \text{where} \, \, \text{Cov}(X_i, U_i) \neq 0$$&lt;/p>
&lt;p>In words, this says the outcome $Y_i$ is generated by a linear function of the endogenous regressor $X_i$ plus an error $U_i$ that is correlated with $X_i$ — that correlation is precisely what makes OLS biased. $Y_i$ is &lt;code>logpgp95&lt;/code> for country $i$, $X_i$ is &lt;code>avexpr&lt;/code>, and $U_i$ collects every unobserved determinant of GDP that we cannot explicitly model (geography, culture, human capital, measurement noise). The IV strategy targets $\beta$ — the &lt;em>true&lt;/em> causal coefficient — by replacing $X_i$ with the part of it predicted by an external instrument. The 2SLS estimator can then be written as a single ratio:&lt;/p>
&lt;p>$$\hat{\beta}_{2SLS} = \frac{\widehat{\text{Cov}}(Y, Z)}{\widehat{\text{Cov}}(X, Z)} = \frac{\hat{\beta}_{RF}}{\hat{\beta}_{FS}}$$&lt;/p>
&lt;p>In words, the 2SLS coefficient equals the reduced-form slope divided by the first-stage slope when we have one endogenous regressor and one instrument. $Z_i$ is &lt;code>logem4&lt;/code>. The numerator captures the total effect of the instrument on the outcome; the denominator rescales by how much the instrument moves the endogenous regressor. The ratio gives the per-unit effect of &lt;code>avexpr&lt;/code> on &lt;code>logpgp95&lt;/code> along the part of variation that the instrument can identify.&lt;/p>
&lt;pre>&lt;code class="language-python"># pyfixest: the structural 2SLS estimate (β, SE, CI)
m_iv = pf.feols(&amp;quot;logpgp95 ~ 1 | avexpr ~ logem4&amp;quot;, data=base, vcov=&amp;quot;HC1&amp;quot;)
b_pf, se_pf = m_iv.coef()[&amp;quot;avexpr&amp;quot;], m_iv.se()[&amp;quot;avexpr&amp;quot;]
print(f&amp;quot;pyfixest IV β = {b_pf:.4f} (SE {se_pf:.4f})&amp;quot;)
# linearmodels: the same β + Kleibergen-Paap-style first-stage F + Wu-Hausman
res = IV2SLS(base[&amp;quot;logpgp95&amp;quot;], X_exog, base[[&amp;quot;avexpr&amp;quot;]],
base[[&amp;quot;logem4&amp;quot;]]).fit(cov_type=&amp;quot;robust&amp;quot;)
ci = res.conf_int().loc[&amp;quot;avexpr&amp;quot;]
dwh = res.wu_hausman()
print(f&amp;quot;linearmodels IV β = {res.params['avexpr']:.4f} (SE {res.std_errors['avexpr']:.4f})&amp;quot;)
print(f&amp;quot;95% CI: [{ci['lower']:.3f}, {ci['upper']:.3f}]&amp;quot;)
print(f&amp;quot;First-stage robust F (~KP): {fs_F:.2f}&amp;quot;)
print(f&amp;quot;Wu-Hausman endogeneity F = {dwh.stat:.3f}, p = {dwh.pval:.4f}&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">pyfixest IV β = 0.9443 (SE 0.1789)
linearmodels IV β = 0.9443 (SE 0.1761)
95% CI: [0.599, 1.289]
First-stage robust F (~KP): 16.85
Wu-Hausman endogeneity F = 24.220, p = 0.0000
&lt;/code>&lt;/pre>
&lt;p>The 2SLS coefficient on &lt;code>avexpr&lt;/code> is &lt;strong>0.944&lt;/strong> with a robust standard error of 0.176 (95% CI [0.60, 1.29]) — identical to the Stata &lt;code>ivreg2&lt;/code> reference (0.944 / 0.176 / [0.60, 1.29]) to three decimal places. It is &lt;strong>81% larger&lt;/strong> than the OLS estimate of 0.522. Both libraries agree on the point estimate; their HC standard errors differ in the 4th decimal (&lt;code>pyfixest&lt;/code>&amp;rsquo;s &lt;code>vcov=&amp;quot;HC1&amp;quot;&lt;/code> is 0.1789, &lt;code>linearmodels&lt;/code>' &lt;code>cov_type=&amp;quot;robust&amp;quot;&lt;/code> is 0.1761) due to different small-sample corrections. The Wu-Hausman test rejects the null that OLS is consistent ($F = 24.22$, $p &amp;lt; 0.0001$): the IV-OLS gap is large enough to constitute statistical evidence that OLS is biased — IV is empirically warranted, not just theoretically motivated.&lt;/p>
&lt;p>In domain terms: moving Nigeria (&lt;code>avexpr&lt;/code> = 5.55) up to Chile&amp;rsquo;s level (&lt;code>avexpr&lt;/code> = 7.82) would, all else equal, raise its log GDP per capita by 0.944 × 2.27 ≈ 2.15 points — roughly an &lt;strong>8.5-fold increase&lt;/strong> in income. That is enormous. It is also a LATE: it is the effect on the subpopulation of countries whose institutions would &lt;em>change&lt;/em> in response to a hypothetical change in their settler-mortality history. It is not a population-average claim about every country.&lt;/p>
&lt;p>The IV &amp;gt; OLS gap (0.944 vs 0.522) is itself informative. Three biases push OLS in different directions: reverse causality and omitted variables typically push the OLS slope &lt;em>upward&lt;/em>, while measurement error in the institutional-quality index pushes it &lt;em>downward&lt;/em> (classical attenuation bias). The fact that IV &amp;gt; OLS by 81% suggests measurement error is the &lt;em>dominant&lt;/em> source of bias in the OLS estimate — institutional quality is a noisy proxy for the true latent property-rights regime, and de-noising it via IV reveals a steeper underlying causal slope.&lt;/p>
&lt;hr>
&lt;h2 id="7-robustness-1-colonial-legal-and-religious-controls-table-5">7. Robustness 1: colonial, legal, and religious controls (Table 5)&lt;/h2>
&lt;p>A skeptic&amp;rsquo;s first objection to AJR is that something about &lt;em>which&lt;/em> European power did the colonizing — or about legal traditions, religious composition, or culture — drives both modern institutions and modern income. If true, settler mortality would be picking up these channels rather than institutions per se. Table 5 adds British/French dummies, French legal origin (&lt;code>sjlofr&lt;/code>), and Catholic/Muslim/non-Christian-majority shares as exogenous controls.&lt;/p>
&lt;pre>&lt;code class="language-python">df5 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable5.dta&amp;quot;)
df5 = df5[df5[&amp;quot;baseco&amp;quot;] == 1]
m5_brit = pf.feols(&amp;quot;logpgp95 ~ f_brit + f_french | avexpr ~ logem4&amp;quot;, data=df5, vcov=&amp;quot;HC1&amp;quot;)
m5_legal = pf.feols(&amp;quot;logpgp95 ~ sjlofr | avexpr ~ logem4&amp;quot;, data=df5, vcov=&amp;quot;HC1&amp;quot;)
m5_relig = pf.feols(&amp;quot;logpgp95 ~ catho80 + muslim80 + no_cpm80 | avexpr ~ logem4&amp;quot;, data=df5, vcov=&amp;quot;HC1&amp;quot;)
for name, m in [(&amp;quot;Col 1: +Brit/French&amp;quot;, m5_brit),
(&amp;quot;Col 5: +Legal&amp;quot;, m5_legal),
(&amp;quot;Col 7: +Religion&amp;quot;, m5_relig)]:
b, se = m.coef()[&amp;quot;avexpr&amp;quot;], m.se()[&amp;quot;avexpr&amp;quot;]
print(f&amp;quot;{name:25s} avexpr = {b:.3f} (SE {se:.3f}) N = {int(m._N)}&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (5) (7)
+brit/french +legal +religion
avexpr 1.078 1.080 0.917
(0.240) (0.202) (0.156)
First-stage F 12.51 16.73 18.18
N 64 64 64
&lt;/code>&lt;/pre>
&lt;p>Adding colonial-identity dummies, legal-origin, or religion shares leaves the IV coefficient on &lt;code>avexpr&lt;/code> between &lt;strong>0.917 and 1.339&lt;/strong> across the nine columns — never below the 0.944 baseline and frequently larger. Standard errors widen (0.156 to 0.535), and first-stage F-statistics range from 3.30 (Col 4, with the British-only sub-sample + latitude) to 18.18 (Col 7). AJR&amp;rsquo;s argument that institutions are doing the work — not legal origin, religion, or which European power did the colonizing — survives this battery: none of these control sets eliminate or even meaningfully shrink the institutional-quality coefficient. The Col 4 caveat is real, but it is a confidence-interval survival rather than a tight-point-estimate one.&lt;/p>
&lt;hr>
&lt;h2 id="8-robustness-2-geography-and-climate-table-6">8. Robustness 2: geography and climate (Table 6)&lt;/h2>
&lt;p>Geography is the most plausible threat to the exclusion restriction. Maybe high settler mortality reflects tropical disease environments that &lt;em>directly&lt;/em> depress modern productivity — through agriculture, labor productivity, or human-capital accumulation — independent of institutions. If true, settler mortality would have a direct arrow into &lt;code>logpgp95&lt;/code> and the exclusion restriction would fail.&lt;/p>
&lt;pre>&lt;code class="language-python">df6 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable6.dta&amp;quot;)
df6 = df6[df6[&amp;quot;baseco&amp;quot;] == 1]
temp_humid = [c for c in df6.columns if c.startswith((&amp;quot;temp&amp;quot;, &amp;quot;humid&amp;quot;))]
m6_climate = pf.feols(f&amp;quot;logpgp95 ~ {' + '.join(temp_humid)} | avexpr ~ logem4&amp;quot;, data=df6, vcov=&amp;quot;HC1&amp;quot;)
m6_avelf = pf.feols(&amp;quot;logpgp95 ~ avelf | avexpr ~ logem4&amp;quot;, data=df6, vcov=&amp;quot;HC1&amp;quot;)
for name, m in [(&amp;quot;Col 1: +Climate&amp;quot;, m6_climate),
(&amp;quot;Col 7: +Ethnic frag (avelf)&amp;quot;, m6_avelf)]:
b, se = m.coef()[&amp;quot;avexpr&amp;quot;], m.se()[&amp;quot;avexpr&amp;quot;]
print(f&amp;quot;{name:30s} avexpr = {b:.3f} (SE {se:.3f}) N = {int(m._N)}&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (5) (7)
+climate +resources +ethnic-frag
avexpr 0.837 1.259 0.738
(0.165) (0.543) (0.140)
First-stage F 21.50 3.63 15.73
N 64 64 64
&lt;/code>&lt;/pre>
&lt;p>Across nine geographic specifications — temperature dummies, humidity, latitude, percent in steppe/desert/dry climate, mineral resources, landlock status, ethnolinguistic fractionalization (&lt;code>avelf&lt;/code>) — the IV coefficient on &lt;code>avexpr&lt;/code> ranges from &lt;strong>0.713 to 1.358&lt;/strong>, bracketing the 0.944 baseline. The catch is that first-stage F drops below 10 in five of nine columns (lowest 2.27 in Col 6 with all soil/resources + latitude), because the geography variables are themselves correlated with &lt;code>logem4&lt;/code>. The qualitative conclusion holds; the quantitative confidence intervals widen.&lt;/p>
&lt;hr>
&lt;h2 id="9-robustness-3-the-trickiest-case--health-channels-table-7">9. Robustness 3: the trickiest case — health channels (Table 7)&lt;/h2>
&lt;p>The tightest empirical challenge to AJR&amp;rsquo;s exclusion restriction is health. If the disease environment that killed European settlers in 1700 &lt;em>still&lt;/em> depresses productivity in 1995 (through malaria, infant mortality, or low life expectancy), then &lt;code>logem4&lt;/code> enters &lt;code>logpgp95&lt;/code> through a direct health channel, not just through institutions. Table 7 includes modern health variables as controls. Two readings are possible:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>AJR&amp;rsquo;s preferred reading:&lt;/strong> modern health is a &amp;ldquo;bad control&amp;rdquo; — itself an outcome of institutional quality, so adjusting for it shrinks the institutional coefficient toward zero artifactually.&lt;/li>
&lt;li>&lt;strong>A critic&amp;rsquo;s reading:&lt;/strong> modern health is genuinely exogenous, and its inclusion exposes a violation of the exclusion restriction.&lt;/li>
&lt;/ul>
&lt;p>The data alone cannot adjudicate.&lt;/p>
&lt;p>The overidentified specs (Cols 7-9) instrument BOTH &lt;code>avexpr&lt;/code> AND a health variable using four instruments (&lt;code>logem4&lt;/code>, &lt;code>latabs&lt;/code>, &lt;code>lt100km&lt;/code>, &lt;code>meantemp&lt;/code>). pyfixest&amp;rsquo;s IV does not support multiple endogenous variables (per its docs: &lt;em>&amp;ldquo;Multiple endogenous variables are not supported&amp;rdquo;&lt;/em>), so we use &lt;code>linearmodels.IV2SLS&lt;/code> here — and gain access to the Sargan / Hansen J overidentification statistic that comes with the overidentified system.&lt;/p>
&lt;pre>&lt;code class="language-python">df7 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable7.dta&amp;quot;)
df7 = df7[df7[&amp;quot;baseco&amp;quot;] == 1]
# Cols 1, 3, 5: just-identified, single endog (pyfixest works fine)
m7_mal = pf.feols(&amp;quot;logpgp95 ~ malfal94 | avexpr ~ logem4&amp;quot;, data=df7, vcov=&amp;quot;HC1&amp;quot;)
m7_leb = pf.feols(&amp;quot;logpgp95 ~ leb95 | avexpr ~ logem4&amp;quot;, data=df7, vcov=&amp;quot;HC1&amp;quot;)
m7_imr = pf.feols(&amp;quot;logpgp95 ~ imr95 | avexpr ~ logem4&amp;quot;, data=df7, vcov=&amp;quot;HC1&amp;quot;)
# Cols 7-9: 2 endog, 4 instruments =&amp;gt; Hansen J meaningful (linearmodels only)
sub = df7.dropna(subset=[&amp;quot;logpgp95&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;malfal94&amp;quot;, &amp;quot;logem4&amp;quot;,
&amp;quot;latabs&amp;quot;, &amp;quot;lt100km&amp;quot;, &amp;quot;meantemp&amp;quot;])
X_exog = pd.DataFrame({&amp;quot;const&amp;quot;: np.ones(len(sub))}, index=sub.index)
res_overid = IV2SLS(
sub[&amp;quot;logpgp95&amp;quot;], X_exog,
sub[[&amp;quot;avexpr&amp;quot;, &amp;quot;malfal94&amp;quot;]],
sub[[&amp;quot;logem4&amp;quot;, &amp;quot;latabs&amp;quot;, &amp;quot;lt100km&amp;quot;, &amp;quot;meantemp&amp;quot;]],
).fit(cov_type=&amp;quot;robust&amp;quot;)
print(f&amp;quot;Col 7 avexpr: β = {res_overid.params['avexpr']:.3f} &amp;quot;
f&amp;quot;(SE {res_overid.std_errors['avexpr']:.3f})&amp;quot;)
print(f&amp;quot;Sargan/Hansen J = {res_overid.sargan.stat:.2f}, p = {res_overid.sargan.pval:.3f}&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (3) (5) (7) overid
+malaria +life exp. +infant mort. (4 instr)
avexpr 0.687 0.629 0.551 0.689
(0.265) (0.295) (0.260) (0.244)
First-stage F 3.98 4.23 5.12 54.01
Hansen J / Sargan 1.02 (p=0.600)
N 62 60 60 60
&lt;/code>&lt;/pre>
&lt;p>When malaria prevalence (&lt;code>malfal94&lt;/code>), life expectancy (&lt;code>leb95&lt;/code>), or infant mortality (&lt;code>imr95&lt;/code>) are added as exogenous controls, the IV coefficient on &lt;code>avexpr&lt;/code> falls to &lt;strong>0.55–0.69&lt;/strong> — the only place in the entire script where the IV approaches the OLS benchmark of 0.522. Cols 7–9 use four instruments for two endogenous regressors via &lt;code>linearmodels.IV2SLS&lt;/code>, making the Sargan/Hansen J test meaningful: J p-values of 0.60–0.80 fail to reject the joint exogeneity of the instrument set, providing modest support for AJR&amp;rsquo;s reading. But the just-identified first-stage F-statistics in Cols 1–6 collapse to &lt;strong>3.98–5.12&lt;/strong> — well below any weak-IV threshold — so the IV point estimates carry low confidence in the just-identified health specs. Health channels are the place where a fair-minded reader should retain doubt.&lt;/p>
&lt;hr>
&lt;h2 id="10-overidentification-and-alternative-instruments-table-8">10. Overidentification and alternative instruments (Table 8)&lt;/h2>
&lt;p>If &lt;code>logem4&lt;/code> were the only instrument we had, we could not test the exclusion restriction directly. AJR&amp;rsquo;s solution is to use &lt;em>alternative&lt;/em> historical-institution variables — 1900 constraints on the executive (&lt;code>cons00a&lt;/code>), 1900 democracy (&lt;code>democ00a&lt;/code>), 1st-year-of-independence constraints (&lt;code>cons1&lt;/code>), independence year (&lt;code>indtime&lt;/code>), and 1st-year-of-independence democracy (&lt;code>democ1&lt;/code>) — and ask: do these all agree on the same causal effect? If yes, the joint exogeneity assumption is more credible.&lt;/p>
&lt;p>We split this into three parts. &lt;strong>Panel C&lt;/strong> pairs each alternative instrument with &lt;code>logem4&lt;/code> and runs 2SLS via &lt;code>linearmodels&lt;/code>, producing a Sargan/Hansen J test. &lt;strong>Panel D&lt;/strong> drops the exclusion restriction on &lt;code>logem4&lt;/code> itself by including it as an exogenous control while alternative instruments do the identification — the harshest sensitivity check.&lt;/p>
&lt;pre>&lt;code class="language-python">df8 = pd.read_stata(f&amp;quot;{DATA_URL}/maketable8.dta&amp;quot;)
df8 = df8[df8[&amp;quot;baseco&amp;quot;] == 1]
# Panel C: 2 instruments per regression -&amp;gt; Hansen J meaningful
def panel_C(alt_inst, exog=None):
cols = [&amp;quot;logpgp95&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;logem4&amp;quot;, alt_inst] + (exog or [])
sub = df8.dropna(subset=cols)
X_exog = sub[exog].assign(const=1.0) if exog else pd.DataFrame(
{&amp;quot;const&amp;quot;: np.ones(len(sub))}, index=sub.index)
res = IV2SLS(sub[&amp;quot;logpgp95&amp;quot;], X_exog, sub[[&amp;quot;avexpr&amp;quot;]],
sub[[&amp;quot;logem4&amp;quot;, alt_inst]]).fit(cov_type=&amp;quot;robust&amp;quot;)
return res.params[&amp;quot;avexpr&amp;quot;], res.sargan.stat, res.sargan.pval
for inst in [&amp;quot;euro1900&amp;quot;, &amp;quot;cons00a&amp;quot;, &amp;quot;democ00a&amp;quot;]:
b, j, p = panel_C(inst)
print(f&amp;quot;Panel C with {inst:12s}: β = {b:.3f} Hansen J = {j:.2f} (p = {p:.3f})&amp;quot;)
# Panel D: logem4 as exogenous control, alt instrument identifies
def panel_D(alt_inst):
sub = df8.dropna(subset=[&amp;quot;logpgp95&amp;quot;, &amp;quot;avexpr&amp;quot;, &amp;quot;logem4&amp;quot;, alt_inst])
return pf.feols(f&amp;quot;logpgp95 ~ logem4 | avexpr ~ {alt_inst}&amp;quot;, data=sub, vcov=&amp;quot;HC1&amp;quot;)
for inst in [&amp;quot;euro1900&amp;quot;, &amp;quot;cons00a&amp;quot;, &amp;quot;democ00a&amp;quot;]:
m = panel_D(inst)
print(f&amp;quot;Panel D with {inst:12s}: β = {m.coef()['avexpr']:.3f}&amp;quot;)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">Panel C (overid): Hansen J p-values 0.18 to 0.79 across 5 alt instruments
-&amp;gt; uniformly fails to reject joint exogeneity
Panel D (logem4 as control):
euro1900 instrument: avexpr = 0.81-0.88
cons00a instrument: avexpr = 0.42-0.45
democ00a instrument: avexpr = 0.48-0.52
cons1 instrument: avexpr = 0.49-0.49
democ1 instrument: avexpr = 0.40-0.41
&lt;/code>&lt;/pre>
&lt;p>Panel C delivers Hansen J p-values from &lt;strong>0.18 to 0.79&lt;/strong> across five alternative instrument pairs — uniformly failing to reject joint exogeneity. (The Stata &lt;code>ivreg2&lt;/code> reference reports 0.21–0.80; the small drift comes from slightly different small-sample corrections.) This is the test AJR pass cleanly. Panel D is more demanding: when &lt;code>logem4&lt;/code> enters as a control, the IV coefficient on &lt;code>avexpr&lt;/code> splits by instrument family. Cols 21–22 (using &lt;code>euro1900&lt;/code>) keep &lt;code>avexpr&lt;/code> at &lt;strong>0.81–0.88&lt;/strong> — likely because &lt;code>euro1900&lt;/code> is itself a continuous mortality-correlated proxy rather than a clean institutional alternative. Cols 23–30 (using historical-institution alternatives &lt;code>cons00a&lt;/code>, &lt;code>democ00a&lt;/code>, &lt;code>cons1&lt;/code>, &lt;code>indtime&lt;/code>, &lt;code>democ1&lt;/code>) fall to &lt;strong>0.40–0.52&lt;/strong>. The &lt;code>logem4&lt;/code> control is itself never statistically distinguishable from zero across any of the 10 columns. This pattern is consistent with AJR&amp;rsquo;s claim — settler mortality affects modern income only through institutions — but the 8-of-10 drop in coefficient magnitude when &lt;code>logem4&lt;/code> is moved to the right-hand side suggests some of the baseline IV&amp;rsquo;s strength came from &lt;code>logem4&lt;/code> proxying for unobserved correlates that the historical-institution alternatives do not capture.&lt;/p>
&lt;p>A critical caveat is owed: Albouy (2012) shows that roughly 36% of AJR&amp;rsquo;s mortality observations are imputed or shared across countries (e.g., one African country&amp;rsquo;s mortality figure used for several neighbors). Hansen J non-rejection assumes &lt;em>independent&lt;/em> moment conditions. If the alternative instruments share imputation noise with &lt;code>logem4&lt;/code>, they would agree spuriously — Hansen J cannot detect coordinated witnesses.&lt;/p>
&lt;hr>
&lt;h2 id="11-the-visual-summary-ols-vs-iv-across-specifications-figure-3">11. The visual summary: OLS vs IV across specifications (Figure 3)&lt;/h2>
&lt;p>Figure 3 presents a coefficient comparison of the &lt;code>avexpr&lt;/code> coefficient across six representative specifications: OLS baseline (orange), four IV variants with &lt;code>logem4&lt;/code> (steel blue), and IV with the &lt;code>euro1900&lt;/code> alternative instrument (teal). Confidence intervals are 95%, computed from &lt;code>linearmodels.IV2SLS&lt;/code> HC-robust standard errors. The visual confirms what the tables show numerically.&lt;/p>
&lt;pre>&lt;code class="language-python">def iv_b_ci(df_, exog, endog, inst):
sub = df_.dropna(subset=[&amp;quot;logpgp95&amp;quot;] + exog + endog + inst)
X_e = sub[exog].assign(const=1.0) if exog else pd.DataFrame(
{&amp;quot;const&amp;quot;: np.ones(len(sub))}, index=sub.index)
r = IV2SLS(sub[&amp;quot;logpgp95&amp;quot;], X_e, sub[endog], sub[inst]).fit(cov_type=&amp;quot;robust&amp;quot;)
return r.params[&amp;quot;avexpr&amp;quot;], r.conf_int().loc[&amp;quot;avexpr&amp;quot;]
specs = [
(&amp;quot;OLS (Tab 2)&amp;quot;, None, None, None, WARM_ORANGE),
(&amp;quot;IV: settler mortality&amp;quot;, df4, [], [&amp;quot;logem4&amp;quot;], STEEL_BLUE),
(&amp;quot;IV + colonial controls&amp;quot;, df5, [&amp;quot;f_brit&amp;quot;, &amp;quot;f_french&amp;quot;], [&amp;quot;logem4&amp;quot;], STEEL_BLUE),
(&amp;quot;IV + geography controls&amp;quot;, df6, temp_humid, [&amp;quot;logem4&amp;quot;], STEEL_BLUE),
(&amp;quot;IV + malaria control&amp;quot;, df7, [&amp;quot;malfal94&amp;quot;], [&amp;quot;logem4&amp;quot;], STEEL_BLUE),
(&amp;quot;IV: alt inst euro1900&amp;quot;, df8, [], [&amp;quot;euro1900&amp;quot;], TEAL),
]
# ... (build error-bar plot, save as python_iv_ols_vs_iv.png)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="python_iv_ols_vs_iv.png" alt="Effect of institutions on log GDP across specifications">
&lt;em>Figure 3. Coefficient on &lt;code>avexpr&lt;/code> across six representative specifications, 95% CIs. OLS in orange, four IV variants with &lt;code>logem4&lt;/code> in steel blue, IV with the alternative instrument &lt;code>euro1900&lt;/code> in teal.&lt;/em>&lt;/p>
&lt;p>The orange OLS estimate sits at 0.522 with a tight confidence interval. Every steel-blue IV variant — adding colonial controls, geography, or even the malaria control — sits at 0.69–0.94 with overlapping confidence intervals. The teal &lt;code>euro1900&lt;/code> alternative instrument lands near 0.87. Color semantics are deliberate: orange = naive estimator, blue family = IV with &lt;code>logem4&lt;/code>, teal = alternative instrument. The visual hierarchy mirrors the statistical hierarchy. No single specification stands above the rest as a &amp;ldquo;preferred estimate&amp;rdquo;; the message is that the institutional coefficient lives in the 0.7–1.0 range under any reasonable modeling choice — and is materially larger than the 0.5 OLS slope.&lt;/p>
&lt;hr>
&lt;h2 id="12-discussion">12. Discussion&lt;/h2>
&lt;p>&lt;strong>Do better institutions cause higher GDP per capita?&lt;/strong> The data say yes — and the magnitude is substantial. The 2SLS estimate of 0.944 implies that the gap between the world&amp;rsquo;s worst and best institutional environments accounts for a large share of the 60-fold income gap between the world&amp;rsquo;s poorest and richest ex-colonies. Specifically, the gap from &lt;code>avexpr&lt;/code> = 3.5 (worst) to &lt;code>avexpr&lt;/code> = 10 (best) is 6.5 institutional points; multiplied by 0.944, that is 6.14 log points of GDP, or a 465-fold income gap predicted by institutions alone — an upper-bound &lt;em>out of sample&lt;/em>, but a striking number.&lt;/p>
&lt;p>The IV-OLS gap (0.944 vs 0.522) tells its own story. IV is &lt;strong>81% larger&lt;/strong> than OLS. Three biases pull in opposite directions: reverse causality and omitted variables push OLS upward; classical measurement error in the institutional-quality index pulls OLS downward. The fact that IV &amp;gt; OLS implies measurement error dominates — institutional quality is a noisy proxy for the latent property-rights regime, and noise attenuates OLS. De-noising it via IV reveals a &lt;em>steeper&lt;/em> causal slope, not a shallower one.&lt;/p>
&lt;p>Two caveats are non-negotiable. First, the 0.944 is a &lt;strong>LATE&lt;/strong> for compliers, not a population ATE. It applies to the subpopulation of countries whose institutional quality would have responded to a hypothetical change in their colonial-era settler mortality. For countries far from the historical colonization margin — established European democracies, never-colonized states — the 0.944 is silent. Second, Albouy (2012) flagged that a substantial share of AJR&amp;rsquo;s mortality data are imputed or shared across countries. Hansen J overidentification non-rejection assumes independent measurement noise; shared imputation could pass the test undetected. The exclusion restriction is &lt;strong>untestable in principle&lt;/strong>, only &lt;em>partially&lt;/em> falsifiable in practice, and AJR&amp;rsquo;s assumption that 1700-era mortality affects 1995 GDP only through institutions remains a &lt;em>substantive&lt;/em> claim that empirical work can support but not prove.&lt;/p>
&lt;p>For policymakers and practitioners, the practical implication is sharper than the academic debate. If institutional quality has a causal effect on GDP roughly twice as large as naive cross-country regressions suggest, then institutional reform is &lt;strong>roughly twice as valuable&lt;/strong> as previously thought — and reforms that are merely correlated with growth in OLS samples may be substantially more powerful causal levers. Conversely, naive policy advice based on OLS slopes systematically &lt;em>understates&lt;/em> the returns to building courts, regulators, and parliaments.&lt;/p>
&lt;p>A note for the Python-curious: the same 64-country dataset that drives &lt;a href="../stata_iv/">the Stata &lt;code>ivreg2&lt;/code> companion post&lt;/a> drives this Python &lt;code>pyfixest&lt;/code>/&lt;code>linearmodels&lt;/code> post. Same numbers to three decimals, same conclusions, same caveats. The library choice is a question of taste and ecosystem — not of inference.&lt;/p>
&lt;hr>
&lt;h2 id="13-summary-limitations-and-next-steps">13. Summary, limitations, and next steps&lt;/h2>
&lt;p>&lt;strong>Method insight.&lt;/strong> 2SLS recovers a causal effect that is 81% larger than OLS (0.944 vs 0.522) — consistent with classical attenuation from measurement error in the institutional-quality index dominating reverse-causality and omitted-variable biases. The Wu-Hausman test ($F = 24.22$, $p &amp;lt; 0.0001$) confirms OLS is biased; both &lt;code>pyfixest&lt;/code> (Olea-Pflueger effective F via &lt;code>.IV_Diag()&lt;/code>) and &lt;code>linearmodels&lt;/code> (Kleibergen-Paap-style robust partial F = 16.85) confirm the instrument is borderline-strong but credible.&lt;/p>
&lt;p>&lt;strong>Data insight.&lt;/strong> 64 ex-colonies span a 60-fold income range and a six-log-point mortality range. That much variation is enough to identify the IV cleanly when the instrument is strong, but not enough to identify it cleanly when controls absorb most of the first-stage signal. Robustness specs with first-stage F &amp;lt; 5 (Tab 6 Cols 5-6, Tab 7 Cols 1-6) live in weak-IV territory — read their confidence intervals, not their point estimates.&lt;/p>
&lt;p>&lt;strong>Limitation.&lt;/strong> The 0.944 is a LATE, not an ATE. It applies to the colonization-margin compliers, not the whole population of countries. It also depends on AJR&amp;rsquo;s exclusion restriction — that 1700-era settler mortality affects 1995 GDP only through institutions — which is untestable in principle and only partially probed by Hansen J / Sargan in practice. Albouy&amp;rsquo;s (2012) imputation critique limits what J-test non-rejection can buy: roughly 36% of mortality observations are shared across countries, so the joint exogeneity test has low power against shared imputation noise.&lt;/p>
&lt;p>&lt;strong>Next step.&lt;/strong> Use &lt;code>pyfixest&lt;/code>&amp;rsquo;s &lt;code>.IV_Diag()&lt;/code> to extract the Olea-Pflueger (2013) effective F-statistic for each robustness spec — the right benchmark under heteroskedasticity-robust inference. If the effective F materially exceeds the Stock-Yogo iid threshold of 16.38, the conventional 2SLS asymptotics are safer to lean on. If it does not, the Anderson-Rubin Wald test (also surfaced by &lt;code>linearmodels&lt;/code>) becomes the primary inference tool.&lt;/p>
&lt;hr>
&lt;h2 id="14-exercises">14. Exercises&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Reduced-form ratio check.&lt;/strong> Compute the reduced-form coefficient by running &lt;code>pf.feols(&amp;quot;logpgp95 ~ logem4&amp;quot;, data=base, vcov=&amp;quot;HC1&amp;quot;)&lt;/code>. Verify that it equals approximately $-0.573$, and that dividing it by the first-stage coefficient $-0.607$ recovers the 2SLS estimate of 0.944. What does this exercise teach you about what 2SLS is doing under the hood?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Cross-library cross-check.&lt;/strong> For the main spec, run the 2SLS twice: once via &lt;code>pyfixest.feols(&amp;quot;logpgp95 ~ 1 | avexpr ~ logem4&amp;quot;, ...)&lt;/code> and once via &lt;code>linearmodels.iv.IV2SLS(...).fit(cov_type=&amp;quot;robust&amp;quot;)&lt;/code>. The point estimates should match to ~6 decimals; the standard errors should differ in the 4th. Why? Which small-sample correction is the &amp;ldquo;right&amp;rdquo; one for replicating the Stata &lt;code>ivreg2&lt;/code> reference?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Stress-test the exclusion restriction.&lt;/strong> Pick a candidate omitted variable that you think could violate the exclusion restriction (e.g., percentage of population at high altitude, or distance from the equator). Add it as an exogenous control to the main spec and report what happens to the 2SLS coefficient on &lt;code>avexpr&lt;/code>. Is your candidate a &amp;ldquo;bad control&amp;rdquo; (downstream of institutions) or a genuine threat to exclusion (upstream of mortality)?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Hansen J on a multi-endog spec.&lt;/strong> Replicate Tab 7 Col 7 (&lt;code>avexpr&lt;/code> and &lt;code>malfal94&lt;/code> jointly endogenous, instrumented by &lt;code>logem4&lt;/code>, &lt;code>latabs&lt;/code>, &lt;code>lt100km&lt;/code>, &lt;code>meantemp&lt;/code>) using &lt;code>linearmodels.iv.IV2SLS&lt;/code>. Note that &lt;code>pyfixest.feols&lt;/code> will refuse this specification (&amp;ldquo;Multiple endogenous variables are not supported&amp;rdquo;). Why does Hansen J / Sargan have power here but not in a just-identified spec?&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="15-references">15. References&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="https://www.aeaweb.org/articles?id=10.1257/aer.91.5.1369" target="_blank" rel="noopener">Acemoglu, D., Johnson, S., and Robinson, J. A. (2001). &amp;ldquo;The Colonial Origins of Comparative Development: An Empirical Investigation.&amp;rdquo; &lt;em>American Economic Review&lt;/em>, 91(5), 1369–1401.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.aeaweb.org/articles?id=10.1257/aer.102.6.3059" target="_blank" rel="noopener">Albouy, D. Y. (2012). &amp;ldquo;The Colonial Origins of Comparative Development: An Investigation of the Settler Mortality Data.&amp;rdquo; &lt;em>American Economic Review&lt;/em>, 102(6), 3059–3076.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.jstor.org/stable/2951620" target="_blank" rel="noopener">Imbens, G. W. and Angrist, J. D. (1994). &amp;ldquo;Identification and Estimation of Local Average Treatment Effects.&amp;rdquo; &lt;em>Econometrica&lt;/em>, 62(2), 467–475.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.jstor.org/stable/2171753" target="_blank" rel="noopener">Staiger, D. and Stock, J. H. (1997). &amp;ldquo;Instrumental Variables Regression with Weak Instruments.&amp;rdquo; &lt;em>Econometrica&lt;/em>, 65(3), 557–586.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.nber.org/papers/t0284" target="_blank" rel="noopener">Stock, J. H. and Yogo, M. (2005). &amp;ldquo;Testing for Weak Instruments in Linear IV Regression.&amp;rdquo; In &lt;em>Identification and Inference for Econometric Models&lt;/em>, Cambridge University Press.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.tandfonline.com/doi/abs/10.1080/00401706.2013.806694" target="_blank" rel="noopener">Olea, J. L. M. and Pflueger, C. (2013). &amp;ldquo;A Robust Test for Weak Instruments.&amp;rdquo; &lt;em>Journal of Business and Economic Statistics&lt;/em>, 31(3), 358–369.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://pyfixest.org/" target="_blank" rel="noopener">&lt;code>pyfixest&lt;/code> — fast high-dimensional fixed-effects and IV regression in Python (port of &lt;code>fixest&lt;/code>).&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bashtage.github.io/linearmodels/" target="_blank" rel="noopener">&lt;code>linearmodels&lt;/code> — Linear (and panel) models for Python, including IV2SLS and IVGMM.&lt;/a>&lt;/li>
&lt;li>&lt;a href="../stata_iv/">Companion Stata post: same data, same numerical results, &lt;code>ivreg2&lt;/code> instead of pyfixest.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://economics.mit.edu/people/faculty/daron-acemoglu/data-archive" target="_blank" rel="noopener">AJR (2001) replication package — &lt;code>maketable1.dta&lt;/code> through &lt;code>maketable8.dta&lt;/code> are loaded by &lt;code>analysis.py&lt;/code> from this site&amp;rsquo;s GitHub raw URL (mirrored from &lt;code>content/post/stata_iv/&lt;/code>) for one-click replicability.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://youtu.be/ROLeLaR-17U" target="_blank" rel="noopener">Duke Mod·U &amp;ldquo;Causal Inference Bootcamp&amp;rdquo; — &lt;em>Introduction to Regression Analysis&lt;/em>. YouTube video.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://youtu.be/vCkrWeJG5cs" target="_blank" rel="noopener">Duke Mod·U &amp;ldquo;Causal Inference Bootcamp&amp;rdquo; — &lt;em>Basic Elements of a Regression Table&lt;/em>. YouTube video.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://youtu.be/fDCgagw2CAI" target="_blank" rel="noopener">Duke Mod·U &amp;ldquo;Causal Inference Bootcamp&amp;rdquo; — &lt;em>The Relationship Between Economic Development and Property Rights&lt;/em>. YouTube video.&lt;/a>&lt;/li>
&lt;/ol></description></item><item><title>Do Institutions Cause Prosperity? An IV Tutorial in Stata</title><link>https://carlos-mendez.org/post/stata_iv/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://carlos-mendez.org/post/stata_iv/</guid><description>&lt;h2 id="1-overview">1. Overview&lt;/h2>
&lt;p>A simple cross-country plot tells a striking story: countries with stronger property-rights institutions are vastly richer than countries with weaker ones. The slope is real, the gradient is huge, and almost every development economist agrees that &lt;strong>something&lt;/strong> about institutions matters for prosperity. But that simple plot cannot tell us &lt;em>which way the arrow points&lt;/em>. Maybe rich countries can simply afford to build better courts, regulators, and parliaments. Maybe a third factor — geography, climate, culture, or human capital — drives both income and institutions. The slope might describe correlation; it cannot prove causation.&lt;/p>
&lt;p>Acemoglu, Johnson and Robinson (2001) — henceforth &lt;strong>AJR&lt;/strong> — proposed a now-famous solution: use the &lt;strong>mortality rate of European settlers&lt;/strong> during colonization as an &lt;em>instrumental variable&lt;/em> for modern institutional quality. Their argument is that places where Europeans died en masse (tropical lowlands with malaria and yellow fever) became &lt;em>extractive&lt;/em> colonies, while places where Europeans survived became &lt;em>settler&lt;/em> colonies with European-style property-rights protections. Because settler mortality was determined by the disease environment of 1500–1900 — not by the income of countries in 1995 — it provides a source of variation in institutions that is &lt;em>plausibly&lt;/em> unrelated to all the modern unobserved factors that confound the simple plot.&lt;/p>
&lt;p>This tutorial replicates AJR&amp;rsquo;s headline result on a sample of 64 ex-colonies using Stata&amp;rsquo;s &lt;code>ivreg2&lt;/code> package. We start with the naive OLS slope of 0.522, walk through the three identification conditions an instrument must satisfy, and arrive at a 2SLS estimate of &lt;strong>0.944&lt;/strong> — about 81% larger. We then layer on five families of robustness checks (colonial controls, geography, health, alternative instruments, overidentification) and confront Albouy&amp;rsquo;s (2012) imputation critique honestly. The case study question is direct: &lt;strong>&amp;ldquo;Do better institutions cause higher GDP per capita, or are they merely correlated with it?&amp;quot;&lt;/strong>&lt;/p>
&lt;h3 id="the-iv-identification-strategy-at-a-glance">The IV identification strategy at a glance&lt;/h3>
&lt;p>Before we estimate anything, here is the picture of the strategy. The dashed red arrow is the assumption we cannot test directly — it is the heart of every IV paper.&lt;/p>
&lt;pre>&lt;code class="language-mermaid">flowchart LR
Z[&amp;quot;Settler mortality&amp;lt;br/&amp;gt;(logem4)&amp;quot;]
X[&amp;quot;Modern institutions&amp;lt;br/&amp;gt;(avexpr)&amp;quot;]
Y[&amp;quot;Log GDP per capita&amp;lt;br/&amp;gt;(logpgp95)&amp;quot;]
U[&amp;quot;Unobserved confounders&amp;lt;br/&amp;gt;(geography? culture?&amp;lt;br/&amp;gt;human capital?)&amp;quot;]
Z --&amp;gt;|&amp;quot;first stage&amp;lt;br/&amp;gt;relevance ✓&amp;quot;| X
X --&amp;gt;|&amp;quot;causal effect&amp;lt;br/&amp;gt;(what we want)&amp;quot;| Y
U --&amp;gt;|&amp;quot;bias OLS&amp;quot;| X
U --&amp;gt;|&amp;quot;bias OLS&amp;quot;| Y
Z -.-&amp;gt;|&amp;quot;exclusion restriction:&amp;lt;br/&amp;gt;no direct arrow&amp;quot;| Y
style Z fill:#6a9bcc,stroke:#141413,color:#fff
style X fill:#d97757,stroke:#141413,color:#fff
style Y fill:#00d4c8,stroke:#141413,color:#141413
style U fill:#1a3a8a,stroke:#141413,color:#fff,stroke-dasharray: 5 5
&lt;/code>&lt;/pre>
&lt;p>The diagram shows what makes IV work: the instrument &lt;code>logem4&lt;/code> (settler mortality) influences the outcome &lt;code>logpgp95&lt;/code> (log GDP) &lt;strong>only&lt;/strong> through the endogenous regressor &lt;code>avexpr&lt;/code> (institutions). The dashed arrow from &lt;code>Z&lt;/code> to &lt;code>Y&lt;/code> is forbidden — that is the &lt;em>exclusion restriction&lt;/em>. Unobserved confounders &lt;code>U&lt;/code> may freely contaminate both &lt;code>X&lt;/code> and &lt;code>Y&lt;/code>, but as long as they do not also drive &lt;code>Z&lt;/code>, the IV estimator isolates the part of variation in &lt;code>X&lt;/code> that is exogenous (the part predicted by &lt;code>Z&lt;/code>) and uses only that part to estimate the causal effect on &lt;code>Y&lt;/code>.&lt;/p>
&lt;h3 id="learning-objectives">Learning objectives&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Recognize&lt;/strong> when ordinary least squares (OLS) is biased by reverse causality, omitted variables, and measurement error.&lt;/li>
&lt;li>&lt;strong>State&lt;/strong> the three conditions an instrumental variable must satisfy: relevance, exclusion, and exogeneity.&lt;/li>
&lt;li>&lt;strong>Estimate&lt;/strong> the AJR (2001) 2SLS coefficient on institutions using &lt;code>ivreg2&lt;/code> and the &lt;code>maketable4.dta&lt;/code> dataset.&lt;/li>
&lt;li>&lt;strong>Diagnose&lt;/strong> weak instruments using the Kleibergen-Paap rk Wald F-statistic and the Stock-Yogo critical values.&lt;/li>
&lt;li>&lt;strong>Interpret&lt;/strong> the 2SLS coefficient as a Local Average Treatment Effect (LATE) under heterogeneous effects (Imbens-Angrist 1994).&lt;/li>
&lt;li>&lt;strong>Test&lt;/strong> the exclusion restriction with the Hansen J overidentification test, and recognize what it cannot tell you.&lt;/li>
&lt;/ul>
&lt;h3 id="key-concepts-at-a-glance">Key concepts at a glance&lt;/h3>
&lt;p>The post leans on a small vocabulary repeatedly. The rest of the tutorial assumes you can move between these terms quickly. Each concept below has three parts. The &lt;strong>definition&lt;/strong> is always visible. The &lt;strong>example&lt;/strong> and &lt;strong>analogy&lt;/strong> sit behind clickable cards: open them when you need them, leave them collapsed for a quick scan. If a later section mentions &amp;ldquo;exclusion restriction&amp;rdquo; or &amp;ldquo;LATE&amp;rdquo; and the term feels slippery, this is the section to re-read.&lt;/p>
&lt;p>&lt;strong>1. Endogeneity.&lt;/strong>
A regressor is &lt;em>endogenous&lt;/em> when it is correlated with the error term. In our context, &lt;code>avexpr&lt;/code> (institutions) is endogenous because it is jointly determined with GDP, shares unobserved confounders with GDP, and is measured imperfectly. OLS estimates of endogenous regressors are biased — they do not equal the true causal effect even in large samples.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>The Durbin-Wu-Hausman test in Table 4 Col 1 returns $\chi^2(1) = 9.085$ with $p = 0.0026$. We reject the null that OLS is consistent: &lt;code>avexpr&lt;/code> &lt;em>is&lt;/em> statistically endogenous in this dataset, so IV is empirically warranted, not just theoretically motivated.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A bathroom scale that you stand on while holding a heavy weight. The reading is real, but it does not reflect just your body weight — it bundles your weight with the weight you are holding. OLS bundles the causal effect with confounding. We need a different tool to separate them.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>2. Instrumental variable&lt;/strong> (instrument, $Z$).
A variable that affects the outcome &lt;code>Y&lt;/code> &lt;em>only&lt;/em> through its effect on the endogenous regressor &lt;code>X&lt;/code>. Three conditions must hold: (i) &lt;strong>relevance&lt;/strong> — &lt;code>Z&lt;/code> and &lt;code>X&lt;/code> are correlated; (ii) &lt;strong>exclusion&lt;/strong> — &lt;code>Z&lt;/code> does not enter the outcome equation directly; (iii) &lt;strong>exogeneity&lt;/strong> — &lt;code>Z&lt;/code> is uncorrelated with the error term &lt;code>U&lt;/code>.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>&lt;code>logem4&lt;/code> (log settler mortality) satisfies (i) by construction — the first-stage coefficient is $-0.607$ with $F = 16.32$. (ii) and (iii) are AJR&amp;rsquo;s substantive claim: settler mortality circa 1700 cannot directly affect 1995 GDP except by shaping the colonial institutions that countries inherited. (ii) and (iii) are &lt;strong>untestable in general&lt;/strong> but can be partially examined via overidentification (Hansen J).&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A coin flip that decides which patient gets the drug. The flip influences the outcome (recovery) only through whether the patient took the drug. The flip itself does not heal anyone. That is what an instrument is supposed to be: a clean external nudge.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>3. Two-Stage Least Squares (2SLS).&lt;/strong>
The standard IV estimator. Stage 1: regress the endogenous &lt;code>X&lt;/code> on the instrument &lt;code>Z&lt;/code> (and any controls). Stage 2: regress &lt;code>Y&lt;/code> on the &lt;em>predicted&lt;/em> &lt;code>X̂&lt;/code> from stage 1. The 2SLS coefficient on &lt;code>X̂&lt;/code> is the IV estimate. Stata&amp;rsquo;s &lt;code>ivreg2&lt;/code> does both stages internally; you only see the second-stage output.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>Stage 1: &lt;code>avexpr = 9.341 - 0.607 × logem4&lt;/code>. Stage 2: &lt;code>logpgp95 = 1.910 + 0.944 × avexpr_hat&lt;/code>. The 0.944 is the 2SLS coefficient — it uses only the part of &lt;code>avexpr&lt;/code> predicted by &lt;code>logem4&lt;/code>, throwing away the part contaminated by unobserved confounders.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Filtering muddy water through a sieve. The sieve (stage 1) catches the dirt (unobserved confounding). What passes through (stage 2) is the clean signal you can drink — the part of &lt;code>X&lt;/code> driven only by the exogenous instrument.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>4. Weak instrument.&lt;/strong>
An instrument that has only a weak correlation with the endogenous regressor. Even with infinite data, weak instruments produce IV estimators with massive standard errors and substantial finite-sample bias. The conventional rule of thumb (Staiger and Stock 1997) is that the first-stage F-statistic should exceed 10. Stock and Yogo (2005) give more refined critical values.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>In our main spec, the Kleibergen-Paap rk Wald F = 16.32, just above the F &amp;gt; 10 rule of thumb but only marginally above the Stock-Yogo 10% maximal-IV-size threshold of 16.38. Several robustness specs (Tables 6 and 7) drop the F below 5, which means the IV estimate&amp;rsquo;s confidence interval should not be taken literally.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A radio antenna pointing in roughly the right direction. If the signal is strong enough you hear the music clearly. If the signal is weak (low F) you hear mostly static. The static is the bias.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>5. LATE vs ATE.&lt;/strong>
Under heterogeneous treatment effects, 2SLS does &lt;strong>not&lt;/strong> identify the population average treatment effect (ATE). Imbens and Angrist (1994) show that 2SLS identifies the &lt;strong>Local Average Treatment Effect (LATE)&lt;/strong> — the effect for the subpopulation of &amp;ldquo;compliers&amp;rdquo;, i.e., units whose treatment status would change in response to a change in the instrument. Under constant effects, LATE = ATE.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>Our 0.944 coefficient is the effect of &lt;code>avexpr&lt;/code> on &lt;code>logpgp95&lt;/code> for the subset of countries whose 1995 institutional quality would have been &lt;em>different&lt;/em> had their settler mortality been different. It is &lt;em>not&lt;/em> a population-average claim like &amp;ldquo;if every country improved its institutions by one point, GDP would rise by 94%.&amp;rdquo;&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A drug trial where eligibility depends on a coin flip. The trial estimates the effect &lt;em>for people who comply with the coin flip&lt;/em>. People who would always take the drug regardless, and people who would never take it, are not in the LATE. The LATE is a real effect on real people — just not on everyone.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>6. Hansen J overidentification test.&lt;/strong>
When you have &lt;em>more&lt;/em> instruments than endogenous regressors, you can test the joint exogeneity of the instrument set. The Hansen J test compares the moment conditions across instruments: if they all agree on the same causal effect, the test does not reject. Critical caveat: Hansen J cannot test a &lt;em>single&lt;/em> instrument in a just-identified model, and it has low power against shared imputation bias.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>In Table 8 Panel C we pair each alternative instrument with &lt;code>logem4&lt;/code> and run efficient GMM. Hansen J p-values range from 0.21 to 0.80 across five instrument pairs — uniformly failing to reject. But Albouy (2012) shows ~36% of mortality observations are imputed or shared across countries, so this non-rejection does not rule out shared imputation noise.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Two witnesses giving the same alibi. Their agreement is &lt;em>consistent with&lt;/em> truth, but if they share a flawed memory of the same event, they will agree falsely. Hansen J cannot tell consistent witnesses from coordinated ones.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>7. First stage and reduced form.&lt;/strong>
The &lt;strong>first stage&lt;/strong> is the regression of the endogenous regressor &lt;code>X&lt;/code> on the instrument &lt;code>Z&lt;/code> (and controls). The &lt;strong>reduced form&lt;/strong> is the regression of the outcome &lt;code>Y&lt;/code> directly on the instrument &lt;code>Z&lt;/code> (and controls). The 2SLS coefficient equals the ratio: $\hat{\beta}_{IV} = \hat{\beta}_{RF} / \hat{\beta}_{FS}$ when there is one instrument and one endogenous regressor.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>First stage: $\hat{\beta}_{FS} = -0.607$ (logem4 → avexpr). Reduced form: $\hat{\beta}_{RF} = -0.573$ (logem4 → logpgp95, computed in §6 below). Ratio: $-0.573 / -0.607 = 0.944$ — exactly the 2SLS coefficient. The whole IV machinery boils down to this one division.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>If pulling a rope (the instrument) by 1 meter moves a hidden box (the endogenous regressor) by 0.6 meters, and that pulling also lifts a flag (the outcome) by 0.57 meters, then moving the box by 1 meter must lift the flag by 0.57/0.6 = 0.94 meters. IV is just this proportion calculation.&lt;/p>
&lt;/details>
&lt;/div>
&lt;hr>
&lt;h2 id="2-setup-and-dependencies">2. Setup and dependencies&lt;/h2>
&lt;p>The script depends on four community-contributed Stata packages from the SSC archive: &lt;code>ivreg2&lt;/code> (the IV workhorse), &lt;code>ranktest&lt;/code> (a dependency of &lt;code>ivreg2&lt;/code>), &lt;code>estout&lt;/code> (for table assembly via &lt;code>eststo&lt;/code> and &lt;code>esttab&lt;/code>), and &lt;code>coefplot&lt;/code> (for the comparison plot at the end). The &lt;code>capture ssc install&lt;/code> pattern is idempotent: it installs each package on the first run and does nothing on subsequent runs. We also define the dark-theme color palette as global macros — Stata&amp;rsquo;s &lt;code>color()&lt;/code> graph option takes RGB triplets, not hex codes, so we pre-convert the site palette.&lt;/p>
&lt;pre>&lt;code class="language-stata">clear all
set more off
set seed 42
capture log close
log using &amp;quot;analysis.log&amp;quot;, text replace
// SSC dependencies
capture ssc install ivreg2
capture ssc install ranktest
capture ssc install estout
capture ssc install coefplot
// Globals: outcome, treatment, instrument
global Y logpgp95
global X avexpr
global Z logem4
// Data-loading mode: 1 = GitHub raw URL (replicable), 0 = local folder
global USE_GITHUB 1
if $USE_GITHUB {
global DATA_URL &amp;quot;https://raw.githubusercontent.com/cmg777/starter-academic-v501/master/content/post/stata_iv&amp;quot;
}
else {
global DATA_URL &amp;quot;.&amp;quot;
}
// Dark-theme color palette (hex -&amp;gt; Stata &amp;quot;R G B&amp;quot; triplet)
global DARK_NAVY &amp;quot;15 23 41&amp;quot; // background
global STEEL_BLUE &amp;quot;106 155 204&amp;quot; // primary data points
global WARM_ORANGE &amp;quot;217 119 87&amp;quot; // fit lines
global TEAL &amp;quot;0 212 200&amp;quot; // labels and highlights
global LIGHT_TEXT &amp;quot;200 208 224&amp;quot; // axis labels
global WHITE_TEXT &amp;quot;232 236 242&amp;quot; // titles
&lt;/code>&lt;/pre>
&lt;p>The three globals &lt;code>Y&lt;/code>, &lt;code>X&lt;/code>, and &lt;code>Z&lt;/code> map directly onto the IV diagram above: &lt;code>Y&lt;/code> is the outcome (log GDP), &lt;code>X&lt;/code> is the endogenous regressor (institutional quality), and &lt;code>Z&lt;/code> is the instrument (log settler mortality). Using globals keeps every regression below readable and consistent — every spec is &lt;code>ivreg2 ${Y} ... (${X} = ${Z})&lt;/code>.&lt;/p>
&lt;p>The &lt;code>USE_GITHUB&lt;/code> toggle lets the same do-file run two ways: with &lt;code>1&lt;/code> (the default) Stata pulls each &lt;code>.dta&lt;/code> from this site&amp;rsquo;s GitHub raw URL — so any reader can &lt;code>do analysis.do&lt;/code> and replicate the full set of tables without cloning the repo or downloading the AJR archive. Flipping it to &lt;code>0&lt;/code> loads from the current folder instead, which is faster for offline iteration. The eight &lt;code>.dta&lt;/code> files (&lt;code>maketable1.dta&lt;/code> … &lt;code>maketable8.dta&lt;/code>) are mirrored at the post root so both modes work.&lt;/p>
&lt;hr>
&lt;h2 id="3-data-overview">3. Data overview&lt;/h2>
&lt;p>AJR provide eight datasets — one per table in the original paper. Table 1&amp;rsquo;s dataset (&lt;code>maketable1.dta&lt;/code>) covers the full ~163-country world; Tables 2–8 progressively narrow to the 64-country &lt;strong>base sample&lt;/strong> (&lt;code>baseco==1&lt;/code>) of ex-colonies with valid settler-mortality data. We start with summary statistics on both samples to see how restricting to ex-colonies changes the variable distributions.&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable1.dta&amp;quot;, clear
di &amp;quot;*** Whole world ***&amp;quot;
summarize logpgp95 loghjypl avexpr cons00a cons1 democ00a euro1900
di &amp;quot;*** AJR base sample (baseco==1) ***&amp;quot;
preserve
keep if baseco==1
summarize logpgp95 loghjypl avexpr cons00a cons1 democ00a euro1900 logem4
estpost summarize logpgp95 loghjypl avexpr cons00a cons1 democ00a euro1900 logem4
esttab using &amp;quot;tab1_summary.csv&amp;quot;, csv replace ///
cells(&amp;quot;count(fmt(0)) mean(fmt(3)) sd(fmt(3)) min(fmt(3)) max(fmt(3))&amp;quot;)
restore
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">*** Whole world ***
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
logpgp95 | 162 8.304196 1.070869 6.109248 10.28875
avexpr | 129 6.988548 1.831779 1.636364 10
euro1900 | 166 30.10241 41.86424 0 100
*** AJR base sample (baseco==1) ***
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
logpgp95 | 64 8.062237 1.043359 6.109248 10.21574
avexpr | 64 6.515625 1.468647 3.5 10
euro1900 | 63 16.18095 25.53334 0 99
logem4 | 64 4.657031 1.257984 2.145931 7.986165
&lt;/code>&lt;/pre>
&lt;p>The base sample has 64 former colonies — about 39% of the 162-country universe. Restricting to ex-colonies lowers the mean of &lt;code>avexpr&lt;/code> from 6.99 to 6.52 (institutions are weaker on average among ex-colonies than the world average) and lowers the mean of &lt;code>euro1900&lt;/code> from 30.1 to 16.2 (ex-colonies had fewer European settlers in 1900). The instrument &lt;code>logem4&lt;/code> ranges from 2.15 (very low mortality, ~9 deaths per 1,000) to 7.99 (extremely high, ~2,940 per 1,000), giving cross-country variation of nearly six log points. Log GDP per capita varies from 6.11 (~\$450, the poorest country) to 10.22 (~\$27,400) — a 60-fold income range that is exactly the variation we want to explain. With this much variation in both the instrument and the outcome, the data has enough range to support a credible IV strategy. The next step is to ask: how &lt;em>would&lt;/em> a naive OLS estimate look on this sample?&lt;/p>
&lt;hr>
&lt;h2 id="4-the-naive-ols-benchmark-table-2">4. The naive OLS benchmark (Table 2)&lt;/h2>
&lt;p>Before we instrument anything, we should know what OLS thinks. If OLS already gave us the right answer, IV would be unnecessary. The OLS regression of log GDP per capita on &lt;code>avexpr&lt;/code> (and a few controls) is the natural starting point. We follow AJR Table 2&amp;rsquo;s column structure: full sample, base sample, latitude, continent dummies. All standard errors are robust (&lt;code>vce(robust)&lt;/code>).&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable2.dta&amp;quot;, clear
eststo m2_c1: regress logpgp95 avexpr, robust
eststo m2_c2: regress logpgp95 avexpr if baseco==1, robust
eststo m2_c3: regress logpgp95 avexpr lat_abst, robust
eststo m2_c4: regress logpgp95 avexpr lat_abst africa asia other_cont, robust
esttab m2_c1 m2_c2 m2_c3 m2_c4 using &amp;quot;tab2_ols.csv&amp;quot;, csv replace ///
b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) stats(N r2)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (2) (3) (4)
Full Base +Latitude +Continents
N=111 N=64 N=111 N=111
avexpr 0.532*** 0.522*** 0.463*** 0.390***
(0.029) (0.050) (0.052) (0.051)
lat_abst 0.872* 0.333
(0.499) (0.442)
africa -0.916***
(0.154)
R-squared 0.611 0.540 0.623 0.715
&lt;/code>&lt;/pre>
&lt;p>The naive OLS coefficient is remarkably stable across specifications: 0.532 in the full 111-country sample (Col 1), 0.522 in the 64-country base sample (Col 2), and falls only to 0.390 once continent dummies are added (Col 4). At face value, a one-point increase in expropriation protection (on AJR&amp;rsquo;s 0–10 scale) is associated with a 39%–53% rise in income per capita, statistically significant at the 1% level. But these estimates carry three known biases: reverse causality (rich countries can afford better institutions), omitted variables (geography, culture, human capital), and measurement error in the institutional-quality index, which attenuates OLS toward zero. We need IV to find out how much of the 0.522 is bias and how much is the true causal effect.&lt;/p>
&lt;hr>
&lt;h2 id="5-the-first-stage-and-the-reduced-form-table-3-and-figures-12">5. The first stage and the reduced form (Table 3 and Figures 1–2)&lt;/h2>
&lt;p>An instrument must first be &lt;strong>relevant&lt;/strong> — it must move the endogenous regressor. We test relevance with the first-stage regression: &lt;code>avexpr&lt;/code> on &lt;code>logem4&lt;/code> and any controls. Table 3 of AJR shows that settler mortality predicts current institutions (Panel A) &lt;em>and&lt;/em> historical institutions in 1900 (Panel B). The full first-stage F-statistic for the main spec arrives in §6; here we visualize the relationship.&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable4.dta&amp;quot;, clear
keep if baseco==1
// Run the first stage to extract numeric F-statistic
ivreg2 logpgp95 (avexpr=logem4), robust
di _newline &amp;quot;*** First-stage Kleibergen-Paap rk Wald F: &amp;quot; %6.2f e(widstat)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">First-stage regression of avexpr on logem4:
logem4 | -.6067782 .1501972 -4.04 0.000
*** First-stage Kleibergen-Paap rk Wald F: 16.32
*** Stock-Yogo 10% maximal IV size critical value: 16.38 (IID)
*** Under robust SEs, see Olea &amp;amp; Pflueger (2013) effective F.
&lt;/code>&lt;/pre>
&lt;p>A one-log-point increase in settler mortality lowers modern expropriation protection by 0.607 points, with a t-statistic of 4.04. The first-stage Kleibergen-Paap rk Wald F-statistic is &lt;strong>16.32&lt;/strong>, just above the Staiger-Stock (1997) rule of thumb of F &amp;gt; 10 and almost exactly equal to the Stock-Yogo (2005) iid threshold of 16.38 for ≤10% maximal IV size distortion. Honest disclosure: 16.32 is &lt;em>borderline&lt;/em>, not comfortable. Under heteroskedasticity-robust standard errors (which we are using), the more rigorous benchmark is the Olea-Pflueger (2013) effective F (&lt;code>weakivtest&lt;/code> in SSC); we will fall back on the weak-IV-robust Anderson-Rubin Wald test in §6 to confirm significance even if one is uncomfortable with the conventional asymptotics.&lt;/p>
&lt;p>The next two figures make the same point graphically. Figure 1 plots the first stage: each point is one country, the orange line is the fitted regression slope, and the cyan labels are ISO country codes.&lt;/p>
&lt;pre>&lt;code class="language-stata">twoway ///
(scatter avexpr logem4, ///
mcolor(&amp;quot;${STEEL_BLUE}&amp;quot;) ///
mlabel(shortnam) mlabcolor(&amp;quot;${TEAL}&amp;quot;) mlabsize(vsmall)) ///
(lfit avexpr logem4, lcolor(&amp;quot;${WARM_ORANGE}&amp;quot;) lwidth(medthick)), ///
title(&amp;quot;Figure 1. First stage: settler mortality predicts institutions&amp;quot;, color(&amp;quot;${WHITE_TEXT}&amp;quot;)) ///
xtitle(&amp;quot;Log settler mortality (logem4)&amp;quot;, color(&amp;quot;${LIGHT_TEXT}&amp;quot;)) ///
ytitle(&amp;quot;Avg. protection from expropriation (avexpr)&amp;quot;, color(&amp;quot;${LIGHT_TEXT}&amp;quot;)) ///
graphregion(color(&amp;quot;${DARK_NAVY}&amp;quot;)) plotregion(color(&amp;quot;${DARK_NAVY}&amp;quot;)) ///
bgcolor(&amp;quot;${DARK_NAVY}&amp;quot;) legend(off)
graph export &amp;quot;stata_iv_first_stage.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_iv_first_stage.png" alt="First stage: settler mortality predicts institutions">
&lt;em>Figure 1. First-stage scatter of &lt;code>avexpr&lt;/code> (modern expropriation protection) on &lt;code>logem4&lt;/code> (log settler mortality), 64 ex-colonies. Slope = −0.607, F = 16.32, R² = 0.27.&lt;/em>&lt;/p>
&lt;p>The negative slope is unmistakable. Australia (&lt;code>AUS&lt;/code>), New Zealand (&lt;code>NZL&lt;/code>), and the United States (&lt;code>USA&lt;/code>) — the three lowest-mortality colonies — sit at &lt;code>avexpr&lt;/code> ≈ 9–10. Sierra Leone (&lt;code>SLE&lt;/code>), Niger (&lt;code>NER&lt;/code>), and Mali (&lt;code>MLI&lt;/code>) — among the highest-mortality colonies — sit near &lt;code>avexpr&lt;/code> ≈ 3.5–5. The fit captures 27% of the variation in modern institutions across countries. This is the empirical foundation of AJR&amp;rsquo;s argument: deadly disease environments produced extractive colonies, which produced weak modern institutions.&lt;/p>
&lt;p>Figure 2 plots the &lt;strong>reduced form&lt;/strong> — the regression of the &lt;em>outcome&lt;/em> on the &lt;em>instrument&lt;/em> directly, skipping &lt;code>avexpr&lt;/code>. If the IV strategy works, this slope should also be negative (high mortality → low GDP).&lt;/p>
&lt;pre>&lt;code class="language-stata">twoway ///
(scatter logpgp95 logem4, ///
mcolor(&amp;quot;${STEEL_BLUE}&amp;quot;) ///
mlabel(shortnam) mlabcolor(&amp;quot;${TEAL}&amp;quot;) mlabsize(vsmall)) ///
(lfit logpgp95 logem4, lcolor(&amp;quot;${WARM_ORANGE}&amp;quot;) lwidth(medthick)), ///
title(&amp;quot;Figure 2. Reduced form: settler mortality predicts log GDP&amp;quot;, color(&amp;quot;${WHITE_TEXT}&amp;quot;)) ///
xtitle(&amp;quot;Log settler mortality (logem4)&amp;quot;, color(&amp;quot;${LIGHT_TEXT}&amp;quot;)) ///
ytitle(&amp;quot;Log GDP per capita, PPP, 1995 (logpgp95)&amp;quot;, color(&amp;quot;${LIGHT_TEXT}&amp;quot;)) ///
graphregion(color(&amp;quot;${DARK_NAVY}&amp;quot;)) plotregion(color(&amp;quot;${DARK_NAVY}&amp;quot;)) ///
bgcolor(&amp;quot;${DARK_NAVY}&amp;quot;) legend(off)
graph export &amp;quot;stata_iv_reduced_form.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_iv_reduced_form.png" alt="Reduced form: settler mortality predicts log GDP">
&lt;em>Figure 2. Reduced-form scatter of &lt;code>logpgp95&lt;/code> (log GDP per capita, 1995, PPP) on &lt;code>logem4&lt;/code>, 64 ex-colonies. The slope (≈ −0.573) is the total effect of the instrument on the outcome.&lt;/em>&lt;/p>
&lt;p>The reduced-form gradient is steep: across the 5.8-log-point span of &lt;code>logem4&lt;/code>, the fitted line predicts a GDP gap of about 3.4 log points — roughly &lt;strong>30× poorer&lt;/strong> for the highest-mortality colonies relative to the lowest-mortality ones. This is the &lt;em>total&lt;/em> effect of the instrument on the outcome. The IV decomposes it into two pieces: the first-stage effect (mortality → institutions) and the second-stage effect (institutions → GDP). When we divide the reduced-form slope by the first-stage slope, the institutions-mediated channel pops out.&lt;/p>
&lt;hr>
&lt;h2 id="6-the-main-2sls-estimate-table-4">6. The main 2SLS estimate (Table 4)&lt;/h2>
&lt;p>This is the headline result. We instrument &lt;code>avexpr&lt;/code> with &lt;code>logem4&lt;/code>, all standard errors are heteroskedasticity-robust, and we add the Durbin-Wu-Hausman endogeneity test via &lt;code>ivreg2&lt;/code>&amp;rsquo;s &lt;code>endog()&lt;/code> option. Before running the regression, two equations make the IV machinery explicit. The structural model is:&lt;/p>
&lt;p>$$Y_i = \alpha + \beta X_i + U_i, \quad \text{where} \, \, \text{Cov}(X_i, U_i) \neq 0$$&lt;/p>
&lt;p>In words, this says the outcome $Y_i$ is generated by a linear function of the endogenous regressor $X_i$ plus an error $U_i$ that is correlated with $X_i$ — that correlation is precisely what makes OLS biased. $Y_i$ is &lt;code>logpgp95&lt;/code> for country $i$, $X_i$ is &lt;code>avexpr&lt;/code>, and $U_i$ collects every unobserved determinant of GDP that we cannot explicitly model (geography, culture, human capital, measurement noise). The IV strategy targets $\beta$ — the &lt;em>true&lt;/em> causal coefficient — by replacing $X_i$ with the part of it predicted by an external instrument. The 2SLS estimator can then be written as a single ratio:&lt;/p>
&lt;p>$$\hat{\beta}_{2SLS} = \frac{\widehat{\text{Cov}}(Y, Z)}{\widehat{\text{Cov}}(X, Z)} = \frac{\hat{\beta}_{RF}}{\hat{\beta}_{FS}}$$&lt;/p>
&lt;p>In words, the 2SLS coefficient equals the reduced-form slope divided by the first-stage slope when we have one endogenous regressor and one instrument. $Z_i$ is &lt;code>logem4&lt;/code>. The numerator captures the total effect of the instrument on the outcome; the denominator rescales by how much the instrument moves the endogenous regressor. The ratio gives the per-unit effect of &lt;code>avexpr&lt;/code> on &lt;code>logpgp95&lt;/code> along the part of variation that the instrument can identify.&lt;/p>
&lt;pre>&lt;code class="language-stata">ivreg2 logpgp95 (avexpr=logem4), robust first endog(avexpr)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">2SLS estimate, base sample (N=64):
avexpr | .9442794 .1760958 5.36 0.000 .5991379 1.289421
_cons | 1.909667 1.173955 1.63 0.104 -.3912422 4.210575
Underidentification (Kleibergen-Paap rk LM): 9.492 p = 0.0021
Weak ID (Cragg-Donald F): 22.95
Weak ID (Kleibergen-Paap rk Wald F): 16.32
Stock-Yogo 10% maximal IV size threshold: 16.38 (iid)
Anderson-Rubin Wald test (weak-IV-robust): F(1,62) = 61.66 p &amp;lt; 0.0001
Endogeneity test (Durbin-Wu-Hausman): chi2(1) = 9.085 p = 0.0026
&lt;/code>&lt;/pre>
&lt;p>The 2SLS coefficient on &lt;code>avexpr&lt;/code> is &lt;strong>0.944&lt;/strong> with a robust standard error of 0.176 (95% CI [0.60, 1.29]). It is &lt;strong>81% larger&lt;/strong> than the OLS estimate of 0.522 and statistically distinguishable from zero at the 1% level (z = 5.36). The Kleibergen-Paap rk Wald F = 16.32 sits just below the Cragg-Donald F = 22.95 (as expected under heteroskedasticity) and at the Stock-Yogo iid threshold; the weak-IV-robust Anderson-Rubin Wald test (F = 61.66, p &amp;lt; 0.0001) gives extra reassurance. The Durbin-Wu-Hausman endogeneity test rejects the null that OLS is consistent ($\chi^2 = 9.09$, $p = 0.003$): the IV-OLS gap is large enough to constitute statistical evidence that OLS is biased — IV is empirically warranted, not just theoretically motivated.&lt;/p>
&lt;p>In domain terms: moving Nigeria (&lt;code>avexpr&lt;/code> = 5.55) up to Chile&amp;rsquo;s level (&lt;code>avexpr&lt;/code> = 7.82) would, all else equal, raise its log GDP per capita by 0.944 × 2.27 ≈ 2.15 points — roughly an &lt;strong>8.5-fold increase&lt;/strong> in income. That is enormous. It is also a LATE: it is the effect on the subpopulation of countries whose institutions would &lt;em>change&lt;/em> in response to a hypothetical change in their settler-mortality history. It is not a population-average claim about every country.&lt;/p>
&lt;p>The IV &amp;gt; OLS gap (0.944 vs 0.522) is itself informative. Three biases push OLS in different directions: reverse causality and omitted variables typically push the OLS slope &lt;em>upward&lt;/em>, while measurement error in the institutional-quality index pushes it &lt;em>downward&lt;/em> (classical attenuation bias). The fact that IV &amp;gt; OLS by 81% suggests measurement error is the &lt;em>dominant&lt;/em> source of bias in the OLS estimate — institutional quality is a noisy proxy for the true latent property-rights regime, and de-noising it via IV reveals a steeper underlying causal slope.&lt;/p>
&lt;hr>
&lt;h2 id="7-robustness-1-colonial-legal-and-religious-controls-table-5">7. Robustness 1: colonial, legal, and religious controls (Table 5)&lt;/h2>
&lt;p>A skeptic&amp;rsquo;s first objection to AJR is that something about &lt;em>which&lt;/em> European power did the colonizing — or about legal traditions, religious composition, or culture — drives both modern institutions and modern income. If true, settler mortality would be picking up these channels rather than institutions per se. Table 5 adds British/French dummies, French legal origin (&lt;code>sjlofr&lt;/code>), and Catholic/Muslim/non-Christian-majority shares as exogenous controls.&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable5.dta&amp;quot;, clear
keep if baseco==1
eststo m5_c1: ivreg2 logpgp95 f_brit f_french (avexpr=logem4), robust
eststo m5_c5: ivreg2 logpgp95 sjlofr (avexpr=logem4), robust
eststo m5_c7: ivreg2 logpgp95 catho80 muslim80 no_cpm80 (avexpr=logem4), robust
esttab m5_c1 m5_c5 m5_c7 using &amp;quot;tab5_iv_controls.csv&amp;quot;, csv replace ///
b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
stats(N r2 firstF, fmt(0 3 2))
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (5) (7)
+brit/french +legal +religion
avexpr 1.078*** 1.080*** 0.917***
(0.240) (0.202) (0.156)
First-stage F (KP) 11.73 15.94 16.76
N 64 64 64
&lt;/code>&lt;/pre>
&lt;p>Adding colonial-identity dummies, legal-origin, or religion shares leaves the IV coefficient on &lt;code>avexpr&lt;/code> between &lt;strong>0.917 and 1.339&lt;/strong> across the nine columns — never below the 0.944 baseline and frequently larger. Standard errors widen (0.156 to 0.535), and first-stage F-statistics range from 2.90 (Col 4, with Neo-Europes excluded + latitude) to 16.76 (Col 7). AJR&amp;rsquo;s argument that institutions are doing the work — not legal origin, religion, or which European power did the colonizing — survives this battery: none of these control sets eliminate or even meaningfully shrink the institutional-quality coefficient. The Col 4 caveat is real, but it is a confidence-interval survival rather than a tight-point-estimate one.&lt;/p>
&lt;hr>
&lt;h2 id="8-robustness-2-geography-and-climate-table-6">8. Robustness 2: geography and climate (Table 6)&lt;/h2>
&lt;p>Geography is the most plausible threat to the exclusion restriction. Maybe high settler mortality reflects tropical disease environments that &lt;em>directly&lt;/em> depress modern productivity — through agriculture, labor productivity, or human-capital accumulation — independent of institutions. If true, settler mortality would have a direct arrow into &lt;code>logpgp95&lt;/code> and the exclusion restriction would fail.&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable6.dta&amp;quot;, clear
keep if baseco==1
eststo m6_c1: ivreg2 logpgp95 temp1-temp5 humid1-humid4 (avexpr=logem4), robust
eststo m6_c5: ivreg2 logpgp95 steplow deslow stepmid desmid drystep drywint goldm iron silv zinc oilres landlock (avexpr=logem4), robust
eststo m6_c7: ivreg2 logpgp95 avelf (avexpr=logem4), robust
esttab m6_c1 m6_c5 m6_c7 using &amp;quot;tab6_iv_geo.csv&amp;quot;, csv replace ///
b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) stats(N r2 firstF)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (5) (7)
+climate +resources +ethnic-frac
avexpr 0.837*** 1.259** 0.738***
(0.165) (0.543) (0.140)
First-stage F (KP) 17.80 2.83 14.99
N 64 64 64
&lt;/code>&lt;/pre>
&lt;p>Across nine geographic specifications — temperature dummies, humidity, latitude, percent in steppe/desert/dry climate, mineral resources, landlock status, ethnolinguistic fractionalization (&lt;code>avelf&lt;/code>) — the IV coefficient on &lt;code>avexpr&lt;/code> ranges from &lt;strong>0.713 to 1.358&lt;/strong>, bracketing the 0.944 baseline. The catch is that first-stage F drops below 10 in five of nine columns (lowest 1.74 in Col 6, 2.83 in Col 5), because the geography variables are themselves correlated with &lt;code>logem4&lt;/code>. The qualitative conclusion holds; the quantitative confidence intervals widen.&lt;/p>
&lt;hr>
&lt;h2 id="9-robustness-3-the-trickiest-case--health-channels-table-7">9. Robustness 3: the trickiest case — health channels (Table 7)&lt;/h2>
&lt;p>The tightest empirical challenge to AJR&amp;rsquo;s exclusion restriction is health. If the disease environment that killed European settlers in 1700 &lt;em>still&lt;/em> depresses productivity in 1995 (through malaria, infant mortality, or low life expectancy), then &lt;code>logem4&lt;/code> enters &lt;code>logpgp95&lt;/code> through a direct health channel, not just through institutions. Table 7 includes modern health variables as controls. Two readings are possible:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>AJR&amp;rsquo;s preferred reading:&lt;/strong> modern health is a &amp;ldquo;bad control&amp;rdquo; — itself an outcome of institutional quality, so adjusting for it shrinks the institutional coefficient toward zero artifactually.&lt;/li>
&lt;li>&lt;strong>A critic&amp;rsquo;s reading:&lt;/strong> modern health is genuinely exogenous, and its inclusion exposes a violation of the exclusion restriction.&lt;/li>
&lt;/ul>
&lt;p>The data alone cannot adjudicate.&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable7.dta&amp;quot;, clear
keep if baseco==1
eststo m7_c1: ivreg2 logpgp95 malfal94 (avexpr=logem4), robust
eststo m7_c3: ivreg2 logpgp95 leb95 (avexpr=logem4), robust
eststo m7_c5: ivreg2 logpgp95 imr95 (avexpr=logem4), robust
// Cols 7-9: 4 instruments, 2 endogenous regressors -&amp;gt; Hansen J meaningful
eststo m7_c7: ivreg2 logpgp95 (avexpr malfal94 = logem4 latabs lt100km meantemp), gmm2s robust
estadd scalar hansenJ = e(j)
estadd scalar hansenP = e(jp)
esttab m7_c1 m7_c3 m7_c5 m7_c7 using &amp;quot;tab7_iv_health.csv&amp;quot;, csv replace ///
b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
stats(N r2 firstF hansenJ hansenP)
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text"> (1) (3) (5) (7) overid
+malaria +life exp. +infant mort. (4 instr)
avexpr 0.687*** 0.629** 0.551** 0.611***
(0.265) (0.295) (0.260) (0.235)
First-stage F (KP) 3.79 4.02 4.86 1.17
Hansen J 1.56 (p=0.459)
N 62 60 60 60
&lt;/code>&lt;/pre>
&lt;p>When malaria prevalence (&lt;code>malfal94&lt;/code>), life expectancy (&lt;code>leb95&lt;/code>), or infant mortality (&lt;code>imr95&lt;/code>) are added as exogenous controls, the IV coefficient on &lt;code>avexpr&lt;/code> falls to &lt;strong>0.55–0.69&lt;/strong> — the only place in the entire script where the IV approaches the OLS benchmark of 0.522. Cols 7–9 use four instruments for two endogenous regressors via efficient GMM (&lt;code>gmm2s&lt;/code>), making the Hansen J test meaningful: J p-values of 0.46–0.76 fail to reject the joint exogeneity of the instrument set, providing modest support for AJR&amp;rsquo;s reading. But the first-stage F-statistics in these overidentified specs collapse to &lt;strong>1.17–4.86&lt;/strong> — well below any weak-IV threshold — so the Hansen J non-rejection has &lt;em>low power&lt;/em> against shared imputation bias and limited confidence. Health channels are the place where a fair-minded reader should retain doubt.&lt;/p>
&lt;hr>
&lt;h2 id="10-overidentification-and-alternative-instruments-table-8">10. Overidentification and alternative instruments (Table 8)&lt;/h2>
&lt;p>If &lt;code>logem4&lt;/code> were the only instrument we had, we could not test the exclusion restriction directly. AJR&amp;rsquo;s solution is to use &lt;em>alternative&lt;/em> historical-institution variables — 1900 constraints on the executive (&lt;code>cons00a&lt;/code>), 1900 democracy (&lt;code>democ00a&lt;/code>), 1st-year-of-independence constraints (&lt;code>cons1&lt;/code>), independence year (&lt;code>indtime&lt;/code>), and 1st-year-of-independence democracy (&lt;code>democ1&lt;/code>) — and ask: do these all agree on the same causal effect? If yes, the joint exogeneity assumption is more credible.&lt;/p>
&lt;p>We split this into three parts. &lt;strong>Panel C&lt;/strong> pairs each alternative instrument with &lt;code>logem4&lt;/code> and runs efficient GMM, producing a Hansen J test. &lt;strong>Panel D&lt;/strong> drops the exclusion restriction on &lt;code>logem4&lt;/code> itself by including it as an exogenous control while alternative instruments do the identification — the harshest sensitivity check.&lt;/p>
&lt;pre>&lt;code class="language-stata">use &amp;quot;${DATA_URL}/maketable8.dta&amp;quot;, clear
keep if baseco==1
// Panel C: alt instrument + logem4 -&amp;gt; Hansen J meaningful
eststo m8c_c1: ivreg2 logpgp95 (avexpr = euro1900 logem4), gmm2s robust
eststo m8c_c3: ivreg2 logpgp95 (avexpr = cons00a logem4), gmm2s robust
eststo m8c_c5: ivreg2 logpgp95 (avexpr = democ00a logem4), gmm2s robust
// Panel D: logem4 as exogenous control, alt instrument identifies
eststo m8d_c1: ivreg2 logpgp95 logem4 (avexpr = euro1900), robust
eststo m8d_c3: ivreg2 logpgp95 logem4 (avexpr = cons00a), robust
eststo m8d_c5: ivreg2 logpgp95 logem4 (avexpr = democ00a), robust
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">Panel C (overid): Hansen J p-values 0.21 to 0.80 across 5 alt instruments
-&amp;gt; uniformly fails to reject joint exogeneity
Panel D (logem4 as control):
euro1900 instrument: avexpr = 0.81-0.88 logem4 control = -0.05 to -0.07
cons00a instrument: avexpr = 0.42-0.45 logem4 control = -0.25 to -0.26
democ00a instrument: avexpr = 0.48-0.52 logem4 control = -0.21 to -0.22
cons1 instrument: avexpr = 0.49-0.49 logem4 control = -0.14 to -0.14
democ1 instrument: avexpr = 0.40-0.41 logem4 control = -0.19 to -0.19
In all 10 columns the logem4 control coefficient is statistically zero (p &amp;gt; 0.1).
&lt;/code>&lt;/pre>
&lt;p>Panel C delivers Hansen J p-values from &lt;strong>0.21 to 0.80&lt;/strong> across five alternative instrument pairs — uniformly failing to reject joint exogeneity. This is the test AJR pass cleanly. Panel D is more demanding: when &lt;code>logem4&lt;/code> enters as a control, the IV coefficient on &lt;code>avexpr&lt;/code> splits by instrument family. Cols 21–22 (using &lt;code>euro1900&lt;/code>) keep &lt;code>avexpr&lt;/code> at &lt;strong>0.81–0.88&lt;/strong> — likely because &lt;code>euro1900&lt;/code> is itself a continuous mortality-correlated proxy rather than a clean institutional alternative. Cols 23–30 (using historical-institution alternatives &lt;code>cons00a&lt;/code>, &lt;code>democ00a&lt;/code>, &lt;code>cons1&lt;/code>, &lt;code>indtime&lt;/code>, &lt;code>democ1&lt;/code>) fall to &lt;strong>0.40–0.52&lt;/strong>. The &lt;code>logem4&lt;/code> control is itself never statistically distinguishable from zero across any of the 10 columns. This pattern is consistent with AJR&amp;rsquo;s claim — settler mortality affects modern income only through institutions — but the 8-of-10 drop in coefficient magnitude when &lt;code>logem4&lt;/code> is moved to the right-hand side suggests some of the baseline IV&amp;rsquo;s strength came from &lt;code>logem4&lt;/code> proxying for unobserved correlates that the historical-institution alternatives do not capture.&lt;/p>
&lt;p>A critical caveat is owed: Albouy (2012) shows that roughly 36% of AJR&amp;rsquo;s mortality observations are imputed or shared across countries (e.g., one African country&amp;rsquo;s mortality figure used for several neighbors). Hansen J non-rejection assumes &lt;em>independent&lt;/em> moment conditions. If the alternative instruments share imputation noise with &lt;code>logem4&lt;/code>, they would agree spuriously — Hansen J cannot detect coordinated witnesses.&lt;/p>
&lt;hr>
&lt;h2 id="11-the-visual-summary-ols-vs-iv-across-specifications-figure-3">11. The visual summary: OLS vs IV across specifications (Figure 3)&lt;/h2>
&lt;p>Figure 3 presents a &lt;code>coefplot&lt;/code> of the &lt;code>avexpr&lt;/code> coefficient across six representative specifications: OLS baseline (orange), four IV variants with &lt;code>logem4&lt;/code> (steel blue), and IV with the &lt;code>euro1900&lt;/code> alternative instrument (teal). The visual confirms what the tables show numerically.&lt;/p>
&lt;pre>&lt;code class="language-stata">coefplot ///
(m4_ols_c1, label(&amp;quot;OLS&amp;quot;) mcolor(&amp;quot;${WARM_ORANGE}&amp;quot;)) ///
(m4_iv_c1, label(&amp;quot;IV: settler mortality&amp;quot;) mcolor(&amp;quot;${STEEL_BLUE}&amp;quot;)) ///
(m5_iv_c1, label(&amp;quot;IV + colonial controls&amp;quot;) mcolor(&amp;quot;${STEEL_BLUE}&amp;quot;)) ///
(m6_iv_c1, label(&amp;quot;IV + geography controls&amp;quot;) mcolor(&amp;quot;${STEEL_BLUE}&amp;quot;)) ///
(m7_iv_c1, label(&amp;quot;IV + malaria control&amp;quot;) mcolor(&amp;quot;${STEEL_BLUE}&amp;quot;)) ///
(m8a_c1, label(&amp;quot;IV: alt instrument euro1900&amp;quot;) mcolor(&amp;quot;${TEAL}&amp;quot;)), ///
keep(avexpr) xline(0, lcolor(&amp;quot;${LIGHT_TEXT}&amp;quot;) lpattern(dash)) ///
title(&amp;quot;Effect of institutions on log GDP: OLS vs IV&amp;quot;, color(&amp;quot;${WHITE_TEXT}&amp;quot;)) ///
graphregion(color(&amp;quot;${DARK_NAVY}&amp;quot;)) plotregion(color(&amp;quot;${DARK_NAVY}&amp;quot;)) ///
bgcolor(&amp;quot;${DARK_NAVY}&amp;quot;)
graph export &amp;quot;stata_iv_ols_vs_iv.png&amp;quot;, replace width(3000)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_iv_ols_vs_iv.png" alt="Effect of institutions on log GDP across specifications">
&lt;em>Figure 3. Coefficient on &lt;code>avexpr&lt;/code> across six representative specifications, 95% CIs. OLS in orange, four IV variants with &lt;code>logem4&lt;/code> in steel blue, IV with the alternative instrument &lt;code>euro1900&lt;/code> in teal.&lt;/em>&lt;/p>
&lt;p>The orange OLS estimate sits at 0.522 with a tight confidence interval. Every steel-blue IV variant — adding colonial controls, geography, or even the malaria control — sits at 0.69–0.94 with overlapping confidence intervals. The teal &lt;code>euro1900&lt;/code> alternative instrument lands near 0.87. Color semantics are deliberate: orange = naive estimator, blue family = IV with &lt;code>logem4&lt;/code>, teal = alternative instrument. The visual hierarchy mirrors the statistical hierarchy. No single specification stands above the rest as a &amp;ldquo;preferred estimate&amp;rdquo;; the message is that the institutional coefficient lives in the 0.7–1.0 range under any reasonable modeling choice — and is materially larger than the 0.5 OLS slope.&lt;/p>
&lt;hr>
&lt;h2 id="12-discussion">12. Discussion&lt;/h2>
&lt;p>&lt;strong>Do better institutions cause higher GDP per capita?&lt;/strong> The data say yes — and the magnitude is substantial. The 2SLS estimate of 0.944 implies that the gap between the world&amp;rsquo;s worst and best institutional environments accounts for a large share of the 60-fold income gap between the world&amp;rsquo;s poorest and richest ex-colonies. Specifically, the gap from &lt;code>avexpr&lt;/code> = 3.5 (worst) to &lt;code>avexpr&lt;/code> = 10 (best) is 6.5 institutional points; multiplied by 0.944, that is 6.14 log points of GDP, or a 465-fold income gap predicted by institutions alone — an upper-bound &lt;em>out of sample&lt;/em>, but a striking number.&lt;/p>
&lt;p>The IV-OLS gap (0.944 vs 0.522) tells its own story. IV is &lt;strong>81% larger&lt;/strong> than OLS. Three biases pull in opposite directions: reverse causality and omitted variables push OLS upward; classical measurement error in the institutional-quality index pulls OLS downward. The fact that IV &amp;gt; OLS implies measurement error dominates — institutional quality is a noisy proxy for the latent property-rights regime, and noise attenuates OLS. De-noising it via IV reveals a &lt;em>steeper&lt;/em> causal slope, not a shallower one.&lt;/p>
&lt;p>Two caveats are non-negotiable. First, the 0.944 is a &lt;strong>LATE&lt;/strong> for compliers, not a population ATE. It applies to the subpopulation of countries whose institutional quality would have responded to a hypothetical change in their colonial-era settler mortality. For countries far from the historical colonization margin — established European democracies, never-colonized states — the 0.944 is silent. Second, Albouy (2012) flagged that a substantial share of AJR&amp;rsquo;s mortality data are imputed or shared across countries. Hansen J overidentification non-rejection assumes independent measurement noise; shared imputation could pass the test undetected. The exclusion restriction is &lt;strong>untestable in principle&lt;/strong>, only &lt;em>partially&lt;/em> falsifiable in practice, and AJR&amp;rsquo;s assumption that 1700-era mortality affects 1995 GDP only through institutions remains a &lt;em>substantive&lt;/em> claim that empirical work can support but not prove.&lt;/p>
&lt;p>For policymakers and practitioners, the practical implication is sharper than the academic debate. If institutional quality has a causal effect on GDP roughly twice as large as naive cross-country regressions suggest, then institutional reform is &lt;strong>roughly twice as valuable&lt;/strong> as previously thought — and reforms that are merely correlated with growth in OLS samples may be substantially more powerful causal levers. Conversely, naive policy advice based on OLS slopes systematically &lt;em>understates&lt;/em> the returns to building courts, regulators, and parliaments.&lt;/p>
&lt;hr>
&lt;h2 id="13-summary-limitations-and-next-steps">13. Summary, limitations, and next steps&lt;/h2>
&lt;p>&lt;strong>Method insight.&lt;/strong> 2SLS recovers a causal effect that is 81% larger than OLS (0.944 vs 0.522) — consistent with classical attenuation from measurement error in the institutional-quality index dominating reverse-causality and omitted-variable biases. The Durbin-Wu-Hausman test ($\chi^2 = 9.09$, $p = 0.003$) confirms OLS is biased; the weak-IV-robust Anderson-Rubin Wald test ($F = 61.66$) confirms institutions matter even if one is uncomfortable with conventional 2SLS asymptotics on a borderline first-stage F.&lt;/p>
&lt;p>&lt;strong>Data insight.&lt;/strong> 64 ex-colonies span a 60-fold income range and a six-log-point mortality range. That much variation is enough to identify the IV cleanly when the instrument is strong, but not enough to identify it cleanly when controls absorb most of the first-stage signal. Robustness specs with first-stage F &amp;lt; 5 (Tab 6 Cols 5-6, Tab 7 Cols 7-9) live in weak-IV territory — read their confidence intervals, not their point estimates.&lt;/p>
&lt;p>&lt;strong>Limitation.&lt;/strong> The 0.944 is a LATE, not an ATE. It applies to the colonization-margin compliers, not the whole population of countries. It also depends on AJR&amp;rsquo;s exclusion restriction — that 1700-era settler mortality affects 1995 GDP only through institutions — which is untestable in principle and only partially probed by Hansen J in practice. Albouy&amp;rsquo;s (2012) imputation critique limits what J-test non-rejection can buy: roughly 36% of mortality observations are shared across countries, so the joint exogeneity test has low power against shared imputation noise.&lt;/p>
&lt;p>&lt;strong>Next step.&lt;/strong> Install the SSC &lt;code>weakivtest&lt;/code> package and rerun the main spec to obtain the Olea-Pflueger (2013) effective F-statistic — the right benchmark under heteroskedasticity-robust inference. If the effective F materially exceeds the Stock-Yogo iid threshold of 16.38, the conventional 2SLS asymptotics are safer to lean on. If it does not, the Anderson-Rubin Wald test becomes the primary inference tool.&lt;/p>
&lt;hr>
&lt;h2 id="14-exercises">14. Exercises&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Reduced-form ratio check.&lt;/strong> Compute the reduced-form coefficient by regressing &lt;code>logpgp95&lt;/code> directly on &lt;code>logem4&lt;/code> in the base sample. Verify that it equals approximately $-0.573$, and that dividing it by the first-stage coefficient $-0.607$ recovers the 2SLS estimate of 0.944. What does this exercise teach you about what 2SLS is doing under the hood?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Just-identified vs overidentified.&lt;/strong> Replicate Table 8 Panel C in just-identified form: run &lt;code>ivreg2 logpgp95 (avexpr = euro1900), gmm2s robust&lt;/code> (one instrument only). Note that Hansen J is now zero — the model is exactly identified. What does this tell you about the J-test&amp;rsquo;s logic? Why must we have &lt;em>more&lt;/em> instruments than endogenous regressors to compute it?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Stress-test the exclusion restriction.&lt;/strong> Pick a candidate omitted variable that you think could violate the exclusion restriction (e.g., percentage of population at high altitude, or distance from the equator). Add it as an exogenous control to the main spec and report what happens to the 2SLS coefficient on &lt;code>avexpr&lt;/code>. Is your candidate a &amp;ldquo;bad control&amp;rdquo; (downstream of institutions) or a genuine threat to exclusion (upstream of mortality)?&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="15-references">15. References&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="https://www.aeaweb.org/articles?id=10.1257/aer.91.5.1369" target="_blank" rel="noopener">Acemoglu, D., Johnson, S., and Robinson, J. A. (2001). &amp;ldquo;The Colonial Origins of Comparative Development: An Empirical Investigation.&amp;rdquo; &lt;em>American Economic Review&lt;/em>, 91(5), 1369–1401.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.aeaweb.org/articles?id=10.1257/aer.102.6.3059" target="_blank" rel="noopener">Albouy, D. Y. (2012). &amp;ldquo;The Colonial Origins of Comparative Development: An Investigation of the Settler Mortality Data.&amp;rdquo; &lt;em>American Economic Review&lt;/em>, 102(6), 3059–3076.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.jstor.org/stable/2951620" target="_blank" rel="noopener">Imbens, G. W. and Angrist, J. D. (1994). &amp;ldquo;Identification and Estimation of Local Average Treatment Effects.&amp;rdquo; &lt;em>Econometrica&lt;/em>, 62(2), 467–475.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.jstor.org/stable/2171753" target="_blank" rel="noopener">Staiger, D. and Stock, J. H. (1997). &amp;ldquo;Instrumental Variables Regression with Weak Instruments.&amp;rdquo; &lt;em>Econometrica&lt;/em>, 65(3), 557–586.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.nber.org/papers/t0284" target="_blank" rel="noopener">Stock, J. H. and Yogo, M. (2005). &amp;ldquo;Testing for Weak Instruments in Linear IV Regression.&amp;rdquo; In &lt;em>Identification and Inference for Econometric Models&lt;/em>, Cambridge University Press.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.tandfonline.com/doi/abs/10.1080/00401706.2013.806694" target="_blank" rel="noopener">Olea, J. L. M. and Pflueger, C. (2013). &amp;ldquo;A Robust Test for Weak Instruments.&amp;rdquo; &lt;em>Journal of Business and Economic Statistics&lt;/em>, 31(3), 358–369.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://journals.sagepub.com/doi/10.1177/1536867X0800700402" target="_blank" rel="noopener">Baum, C. F., Schaffer, M. E., and Stillman, S. (2007). &amp;ldquo;Enhanced routines for instrumental variables/generalized method of moments estimation and testing.&amp;rdquo; &lt;em>Stata Journal&lt;/em>, 7(4), 465–506.&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://fmwww.bc.edu/RePEc/bocode/i/ivreg2.html" target="_blank" rel="noopener">&lt;code>ivreg2&lt;/code> — Stata SSC archive.&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://repec.sowi.unibe.ch/stata/coefplot/" target="_blank" rel="noopener">&lt;code>coefplot&lt;/code> (Jann) — Stata SSC archive.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://economics.mit.edu/people/faculty/daron-acemoglu/data-archive" target="_blank" rel="noopener">AJR (2001) replication package — &lt;code>maketable1.dta&lt;/code> through &lt;code>maketable8.dta&lt;/code> are mirrored at the post root and loaded by &lt;code>analysis.do&lt;/code> from this site&amp;rsquo;s GitHub raw URL for one-click replicability.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://youtu.be/ROLeLaR-17U" target="_blank" rel="noopener">Duke Mod·U &amp;ldquo;Causal Inference Bootcamp&amp;rdquo; — &lt;em>Introduction to Regression Analysis&lt;/em>. YouTube video.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://youtu.be/vCkrWeJG5cs" target="_blank" rel="noopener">Duke Mod·U &amp;ldquo;Causal Inference Bootcamp&amp;rdquo; — &lt;em>Basic Elements of a Regression Table&lt;/em>. YouTube video.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://youtu.be/fDCgagw2CAI" target="_blank" rel="noopener">Duke Mod·U &amp;ldquo;Causal Inference Bootcamp&amp;rdquo; — &lt;em>The Relationship Between Economic Development and Property Rights&lt;/em>. YouTube video.&lt;/a>&lt;/li>
&lt;/ol></description></item><item><title>Converging to Convergence: Understanding the Main Ideas of the Convergence Literature</title><link>https://carlos-mendez.org/post/stata_convergence2/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>https://carlos-mendez.org/post/stata_convergence2/</guid><description>&lt;h2 id="1-overview">1. Overview&lt;/h2>
&lt;p>For decades, one of the most important questions in economics has been: are poor countries catching up to rich ones? The answer has changed dramatically over time. In the 1960s, richer countries actually grew &lt;em>faster&lt;/em> than poorer ones &amp;mdash; a pattern called &lt;strong>divergence&lt;/strong>. By the 2000s, this had reversed: poor countries were growing significantly faster, a phenomenon known as &lt;strong>unconditional convergence&lt;/strong> (also called absolute convergence). What caused this shift?&lt;/p>
&lt;p>This tutorial walks through the key ideas of the convergence literature by reproducing the main findings of Kremer, Willis, and You (2021), &amp;ldquo;Converging to Convergence.&amp;rdquo; The paper provides an elegant explanation: the world has &amp;ldquo;converged to convergence&amp;rdquo; because growth correlates &amp;mdash; the policies, institutions, and human capital variables that predict economic growth &amp;mdash; have themselves converged across countries. As poor countries improved their institutions and policies, the gap between unconditional convergence (a simple comparison of growth rates across income levels) and conditional convergence (controlling for institutions) closed. The central tool for understanding this is the &lt;strong>omitted variable bias (OVB) formula&lt;/strong>, which decomposes exactly &lt;em>how much&lt;/em> each growth correlate contributes to the convergence gap.&lt;/p>
&lt;p>We use the authors' replication dataset, which combines Penn World Table 10.0 GDP data with over 50 institutional, policy, and cultural variables for approximately 160 countries from 1960 to 2017. The analysis is entirely &lt;strong>descriptive&lt;/strong> &amp;mdash; we document cross-country correlations and trends, but do not make causal claims.&lt;/p>
&lt;h3 id="learning-objectives">Learning objectives&lt;/h3>
&lt;ul>
&lt;li>Understand beta-convergence and sigma-convergence and how to test for each&lt;/li>
&lt;li>Track the trend in convergence over time using year-interacted regressions&lt;/li>
&lt;li>Decompose convergence into contributions from income quartiles and geographic regions&lt;/li>
&lt;li>Apply the omitted variable bias (OVB) formula to explain why unconditional convergence emerged&lt;/li>
&lt;li>Distinguish between correlate-income slopes (delta), growth-correlate slopes (lambda), and their product&lt;/li>
&lt;li>Evaluate whether the 1990s growth regression literature holds up as an out-of-sample test&lt;/li>
&lt;/ul>
&lt;h3 id="analytical-roadmap">Analytical roadmap&lt;/h3>
&lt;p>The diagram below shows the logical progression of the tutorial. We first establish the facts, then explain them.&lt;/p>
&lt;pre>&lt;code class="language-mermaid">graph LR
A[&amp;quot;&amp;lt;b&amp;gt;Establish the&amp;lt;br/&amp;gt;Facts&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;Sections 3--6&amp;lt;/i&amp;gt;&amp;quot;]
B[&amp;quot;&amp;lt;b&amp;gt;Correlate&amp;lt;br/&amp;gt;Convergence&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;Section 7&amp;lt;/i&amp;gt;&amp;quot;]
C[&amp;quot;&amp;lt;b&amp;gt;OVB&amp;lt;br/&amp;gt;Framework&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;Sections 8--10&amp;lt;/i&amp;gt;&amp;quot;]
D[&amp;quot;&amp;lt;b&amp;gt;The&amp;lt;br/&amp;gt;Punchline&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;Section 11&amp;lt;/i&amp;gt;&amp;quot;]
A --&amp;gt; B
B --&amp;gt; C
C --&amp;gt; D
style A fill:#6a9bcc,stroke:#141413,color:#fff
style B fill:#d97757,stroke:#141413,color:#fff
style C fill:#00d4c8,stroke:#141413,color:#141413
style D fill:#141413,stroke:#d97757,color:#fff
&lt;/code>&lt;/pre>
&lt;p>We start by documenting the emergence of convergence (scatter plots, rolling coefficients, sigma-convergence, quartile decompositions). Then we show that growth correlates have themselves converged. Finally, the OVB framework links these two facts, revealing that the gap between unconditional and conditional convergence closed because growth regression coefficients for policy variables collapsed.&lt;/p>
&lt;h3 id="key-concepts-at-a-glance">Key concepts at a glance&lt;/h3>
&lt;p>The post leans on a small vocabulary repeatedly. The rest of the tutorial assumes you can move between these terms quickly. Each concept below has three parts. The &lt;strong>definition&lt;/strong> is always visible. The &lt;strong>example&lt;/strong> and &lt;strong>analogy&lt;/strong> sit behind clickable cards: open them when you need them, leave them collapsed for a quick scan. If a later section mentions &amp;ldquo;OVB decomposition&amp;rdquo; or &amp;ldquo;lambda flattening&amp;rdquo; and the term feels slippery, this is the section to re-read.&lt;/p>
&lt;p>&lt;strong>1. Beta convergence: unconditional vs conditional&lt;/strong> $\beta$ vs $\beta^&lt;em>$.
The unconditional $\beta$ is the slope of growth on log initial income with no controls. The conditional $\beta^&lt;/em>$ is the same slope after controlling for growth correlates. Both negative means poorer countries are catching up — even those with similar institutions.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>For the &lt;code>polity2&lt;/code> sample in 2005, the unconditional $\beta = -0.767$ and the conditional $\beta^* = -0.807$. The two are within 0.04 of each other. Twenty years earlier (1985), the gap was 0.44 — institutions explained most of the apparent divergence.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>&amp;ldquo;Catching up overall&amp;rdquo; vs &amp;ldquo;catching up given the same institutions&amp;rdquo;. Imagine two race tracks: one mixes all runners, the other separates them by training regimen. If both show poor runners gaining, the catching-up is real.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>2. Sigma convergence&lt;/strong> $\sigma_t$.
The cross-country standard deviation of log GDP per capita at year $t$. Tracks the &lt;em>width&lt;/em> of the world income distribution. A narrowing distribution is sigma convergence.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>$\sigma$ rose from 0.947 in 1960 to 1.217 in 2000 (peak), then eased to 1.173 by 2017. Income dispersion is no longer widening but has not yet narrowed substantially. Beta convergence has just begun the work that sigma convergence will eventually reflect.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>A flock of birds. Sigma asks whether the flock is tightening. Beta tells you which birds are flying faster. They are related but not the same: the laggard birds can accelerate without the flock yet looking tighter.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>3. OVB decomposition&lt;/strong> $\beta - \beta^* = \delta \cdot \lambda$.
The omitted-variable-bias identity. The gap between unconditional and conditional convergence equals the product of two slopes: $\delta$ (correlate-on-income) and $\lambda$ (correlate-on-growth). When the gap closes, at least one of $\delta$ or $\lambda$ must have shrunk.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>For the &lt;code>polity2&lt;/code> example, the gap closed from 0.440 (1985) to 0.040 (2005). The product $\delta \cdot \lambda$ went from $0.440$ to $0.040$. Inspecting the components: $\lambda$ collapsed from 0.891 to 0.183 — the growth regression coefficient flattened.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Double-entry bookkeeping. The total bias on the convergence books equals the sum of two ledger entries. If the total drops, one of the ledger entries must have dropped — and the OVB identity tells you which one.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>4. Growth correlates.&lt;/strong>
The policy and institutional variables economists used to put on the right-hand side of growth regressions in the 1990s: inflation, investment, schooling, openness, political rights, rule of law, and so on. Each is meant to capture a &amp;ldquo;fundamental&amp;rdquo; of long-run growth.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>This post tracks &lt;code>polity2&lt;/code>, &lt;code>FH_political_rights&lt;/code>, &lt;code>investment&lt;/code>, &lt;code>inflation&lt;/code>, and &lt;code>barrolee2060&lt;/code> (schooling) as the headline correlates. Each has a story in the post: &lt;code>investment&lt;/code> shows the strongest cross-country correlation with income; political rights show the most pronounced correlate-income flattening.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Ingredients in a recipe. Some recipes call for many ingredients (high-inflation, low-savings, weak-rights), others for few. Growth correlates are the ingredients we suspect explain why some economies cook up more output than others.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>5. Correlate–income slope&lt;/strong> $\delta$.
The regression of a correlate on log income. How much richer countries have &lt;em>more&lt;/em> of the correlate. A large positive $\delta$ for &lt;code>polity2&lt;/code> means richer countries are more democratic.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>For &lt;code>polity2&lt;/code>, $\delta$ has stayed around 0.5–0.6 over decades. Richer countries have always tended to be more democratic. The correlate-income slope is &lt;em>not&lt;/em> what flattened in the 1990s–2000s; it is the other half of the OVB product.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>How well-stocked the kitchen is. A wealthy kitchen has more ingredients on hand. The correlate-income slope $\delta$ measures the kitchen-stocking gradient: as a country gets richer, how much better-stocked does its kitchen become?&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>6. Growth-regression slope&lt;/strong> $\lambda$.
The coefficient on a correlate when growth is regressed on the correlate (controlling for log income). How much each correlate contributes to growth, holding initial income fixed. A large $\lambda$ means the correlate matters; a small $\lambda$ means it does not.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>For &lt;code>polity2&lt;/code> in 1985, $\lambda = 0.891$. By 2005, $\lambda = 0.183$. The growth payoff to good political institutions has flattened dramatically over two decades.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>How much each ingredient matters in the recipe. A pinch of saffron used to be transformative. Now everyone uses it; the marginal effect is much smaller. Lambda is &amp;ldquo;marginal effect of the ingredient&amp;rdquo;; not &amp;ldquo;amount of ingredient on hand&amp;rdquo;.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>7. Lambda flattening.&lt;/strong>
The empirical observation that growth-regression coefficients $\lambda$ on short-run correlates have collapsed since the 1990s. The collapse is the &lt;em>real&lt;/em> story: it is what made unconditional convergence emerge.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>Across the post&amp;rsquo;s correlate set, $\lambda$ for several short-run policy variables fell from 0.5–1.0 (1985) to 0.1–0.3 (2005). The longer-run correlates (like schooling) are stickier. The lambda flattening shrinks the OVB product and brings $\beta$ and $\beta^*$ into alignment.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Ingredients losing their punch as kitchens equalize. When every kitchen has good knives and a working oven, the kitchens with the &lt;em>best&lt;/em> knives no longer dominate. Lambda flattening is that universal-baseline effect.&lt;/p>
&lt;/details>
&lt;/div>
&lt;p>&lt;strong>8. Quartile and regional decomposition.&lt;/strong>
A descriptive break-down of beta convergence by initial-income quartile or by region. Asks: which subgroup is doing the catching-up? A few quartiles or regions usually do most of the work.&lt;/p>
&lt;div class="concept-pair">
&lt;details class="concept-card concept-example">
&lt;summary>Example&lt;/summary>
&lt;p>This post&amp;rsquo;s regional decomposition (Sub-Saharan Africa, East Asia, Latin America, OECD, etc.) attributes most of the post-2000 catch-up to East Asia and parts of South Asia. Within-quartile, the bottom two quartiles drive the recent convergence; the top two have stayed flat.&lt;/p>
&lt;/details>
&lt;details class="concept-card concept-analogy">
&lt;summary>Analogy&lt;/summary>
&lt;p>Breaking the average down by income tier. The class average improved; was it because everyone improved, or because the bottom of the class caught up? Quartile decomposition answers exactly that question.&lt;/p>
&lt;/details>
&lt;/div>
&lt;hr>
&lt;h2 id="2-setup-and-data-loading">2. Setup and data loading&lt;/h2>
&lt;p>We begin by loading the Kremer et al. (2021) replication dataset, which has already been cleaned to exclude very small countries (population below 200,000) and resource-dependent economies (natural resource rents above 75% of GDP). We also merge regional classifications from the World Development Indicators.&lt;/p>
&lt;pre>&lt;code class="language-stata">clear all
set more off
set seed 42
set scheme s2color
* Load the main dataset
use &amp;quot;https://raw.githubusercontent.com/cmg777/starter-academic-v501/master/content/post/stata_convergence2/main_data.dta&amp;quot;, clear
* Display panel structure
codebook country_id, compact
tab year if loggdp != ., missing
summarize loggdp loggdp_growth_10
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">Panel structure:
country_id: 174 unique countries, range 2--218
Years covered: 1960 to 2017
Countries with GDP data: 160
Key income variables:
Variable | Obs Mean Std. dev. Min Max
-----------+---------------------------------------------------------
loggdp | 8,328 8.712741 1.186573 5.368557 12.61823
loggdp_g~10| 6,888 1.962031 2.78512 -12.33628 22.12787
&lt;/code>&lt;/pre>
&lt;p>The dataset is an unbalanced panel of 160 countries observed over 58 years (1960&amp;ndash;2017), with 8,328 country-year observations containing GDP data. The panel expands in two jumps &amp;mdash; from 109 countries in 1960 to 137 in 1970 (decolonization) and to 160 in 1990 (post-Soviet states). Average log GDP per capita is 8.71, with a standard deviation of 1.19 log points reflecting enormous cross-country income inequality. The 10-year forward-looking growth rate &amp;mdash; the main outcome variable &amp;mdash; averages 1.96% per year with a range from -12.3% (economic collapses) to 22.1% (growth miracles).&lt;/p>
&lt;p>We then define variable groups following the paper&amp;rsquo;s classification of growth correlates into four categories.&lt;/p>
&lt;pre>&lt;code class="language-stata">* Solow fundamentals (steady-state determinants)
local solow investment population_growth barrolee2060
* Short-run correlates (policies/institutions that can change quickly)
local short_run polity2 FH_political_rights FH_civil_liberties ///
pri_inv gov_spending inflation WDI_credit credit /* +19 more */
* Long-run correlates (geography and historical institutions)
local long_run population_1900 legor_uk legor_fr logem4 meantemp /* +7 more */
* Culture (Hofstede cultural dimensions)
local culture VSM_power_dist VSM_individualism VSM_masculinity /* +3 more */
&lt;/code>&lt;/pre>
&lt;p>The classification matters because the paper&amp;rsquo;s central finding is that &lt;strong>short-run correlates&lt;/strong> behave very differently from &lt;strong>Solow fundamentals&lt;/strong> in growth regressions. We will return to this distinction in Sections 9 and 10.&lt;/p>
&lt;hr>
&lt;h2 id="3-has-the-world-been-converging-scatter-plots-by-decade">3. Has the world been converging? Scatter plots by decade&lt;/h2>
&lt;p>The simplest test for convergence is visual: plot 10-year economic growth against initial income level and check the slope. &lt;strong>Beta-convergence&lt;/strong> &amp;mdash; named after the slope coefficient $\beta$ in the regression of growth on income &amp;mdash; means that poorer countries grow faster. A negative slope indicates convergence; a positive slope indicates divergence.&lt;/p>
&lt;p>We run this regression for each decade separately, from the 1960s through 2007.&lt;/p>
&lt;pre>&lt;code class="language-stata">foreach yr in 1960 1970 1980 1990 2000 2007 {
quietly reg loggdp_growth_10 loggdp if year == `yr', robust
* Store coefficients for each decade
}
* Combine 6 scatter panels into one figure
graph combine G1 G2 G3 G4 G5 G6, rows(2) cols(3) ///
graphregion(color(white)) ///
title(&amp;quot;Income Convergence by Decade&amp;quot;, size(medium))
graph export &amp;quot;stata_convergence2_scatter_by_decade.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_scatter_by_decade.png" alt="Six-panel scatter plot showing 10-year growth versus log GDP per capita for each decade from the 1960s through 2007. The fitted slope shifts from positive (divergence) to steeply negative (convergence).">&lt;/p>
&lt;pre>&lt;code class="language-text">Beta by decade:
decade | beta se pval n_obs
--------+----------------------------------------
1960 | 0.532 0.191 0.006 109
1970 | -0.075 0.292 0.799 137
1980 | 0.106 0.246 0.667 137
1990 | -0.127 0.220 0.564 160
2000 | -0.651 0.168 0.000 160
2007 | -0.764 0.146 0.000 160
&lt;/code>&lt;/pre>
&lt;p>The scatter plots reveal a dramatic historical reversal. In the 1960s, $\beta = +0.53$ (p = 0.006), meaning richer countries grew significantly faster &amp;mdash; a world of divergence. Through the 1970s&amp;ndash;1990s, the coefficient hovered near zero, statistically indistinguishable from zero in every decade. By the 2000s, a strongly negative $\beta = -0.65$ (p &amp;lt; 0.001) emerged, deepening to -0.76 by 2007. This shift from divergence to convergence &amp;mdash; spanning roughly 1.3 percentage points of GDP growth per log point of income &amp;mdash; represents a fundamental transformation in the global growth landscape.&lt;/p>
&lt;p>But is this trend systematic, or just an artifact of picking the right decades? The next section tests whether convergence has been &lt;em>trending&lt;/em> continuously.&lt;/p>
&lt;hr>
&lt;h2 id="4-the-trend-in-beta-convergence">4. The trend in beta-convergence&lt;/h2>
&lt;p>Rather than comparing snapshots, we track the convergence coefficient &lt;strong>continuously&lt;/strong> over time. This is the paper&amp;rsquo;s key innovation: studying the &lt;em>trend&lt;/em> in convergence, not just testing whether convergence exists at a single point in time.&lt;/p>
&lt;p>The specification interacts log GDP per capita with year dummies, giving a separate $\beta_t$ for each year:&lt;/p>
&lt;p>$$\text{Growth}_{i,t \to t+10} = \beta_t \cdot \log(\text{GDPpc}_{i,t}) + \mu_t + \varepsilon_{i,t}$$&lt;/p>
&lt;p>In words, this equation says that 10-year forward-looking growth is a linear function of initial income, with a slope $\beta_t$ that varies by year and year fixed effects $\mu_t$ absorbing common shocks. A negative $\beta_t$ means convergence in year $t$; a positive $\beta_t$ means divergence.&lt;/p>
&lt;pre>&lt;code class="language-stata">* Estimate year-by-year beta coefficients using year-interacted regression
areg loggdp_growth_10 c.loggdp#i.year, absorb(year) robust cluster(country_id)
* Extract coefficients and plot with 95% CI
twoway (rarea ci_upper ci_lower year, fcolor(&amp;quot;106 155 204%30&amp;quot;) lwidth(none)) ///
(line beta year, lcolor(&amp;quot;106 155 204&amp;quot;) lwidth(medthick)) ///
(function y = 0, range(1960 2009) lcolor(&amp;quot;217 119 87&amp;quot;) lpattern(dash)), ///
xtitle(&amp;quot;Year&amp;quot;) ytitle(&amp;quot;Beta-convergence coefficient&amp;quot;) ///
title(&amp;quot;Trend in Beta-Convergence, 1960-2007&amp;quot;, size(medium))
graph export &amp;quot;stata_convergence2_beta_trend.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_beta_trend.png" alt="Rolling beta-convergence coefficient from 1960 to 2008 with 95% confidence interval. The coefficient trends downward from about +0.5 in the 1960s to about -0.8 by 2008, crossing zero around the late 1990s.">&lt;/p>
&lt;p>We also estimate a linear trend specification (Table 1) to test whether the downward movement is statistically significant.&lt;/p>
&lt;pre>&lt;code class="language-text">Table 1: Converging to Convergence
-------------------------------------------------
(1) (2) (3)
Pooled Trend By Decade
-------------------------------------------------
loggdp -0.270** 0.449**
(0.118) (0.224)
loggdp_X~r -0.025***
(0.006)
loggdp~60s 0.532***
(0.191)
loggdp~00s -0.651***
(0.168)
loggdp~07s -0.764***
(0.146)
-------------------------------------------------
N 863 863 863
Year FE Y Y Y
-------------------------------------------------
&lt;/code>&lt;/pre>
&lt;p>The trend coefficient of &lt;strong>-0.025 per year&lt;/strong> (p &amp;lt; 0.01) confirms that convergence has been a systematic trend, not just a snapshot. The convergence coefficient has decreased by 0.025 per year since 1960 &amp;mdash; or equivalently, has shifted by about 1.2 percentage points per half-century. The rolling year-by-year beta (Figure 2) shows this was not smooth: $\beta$ fluctuated around zero through the 1970s&amp;ndash;1980s, then dropped sharply through the 1990s and 2000s, becoming consistently and significantly negative after 1999.&lt;/p>
&lt;p>This raises a natural follow-up question: if countries are growing at rates that should reduce income gaps (beta-convergence), has income dispersion actually &lt;em>narrowed&lt;/em>?&lt;/p>
&lt;hr>
&lt;h2 id="5-sigma-convergence-is-income-dispersion-narrowing">5. Sigma-convergence: is income dispersion narrowing?&lt;/h2>
&lt;p>&lt;strong>Beta-convergence&lt;/strong> (poorer countries growing faster) and &lt;strong>sigma-convergence&lt;/strong> (declining cross-country income dispersion) are related but distinct concepts. Beta-convergence is &lt;em>necessary&lt;/em> but not &lt;em>sufficient&lt;/em> for sigma-convergence &amp;mdash; like a river flowing downhill, catch-up growth must be strong enough to overcome random shocks that push countries apart. We measure sigma as the standard deviation of log GDP per capita across countries in each year.&lt;/p>
&lt;pre>&lt;code class="language-stata">preserve
collapse (sd) sigma = loggdp, by(year)
twoway (line sigma year, lcolor(&amp;quot;106 155 204&amp;quot;) lwidth(medthick)), ///
xtitle(&amp;quot;Year&amp;quot;) ytitle(&amp;quot;SD of log GDP per capita&amp;quot;) ///
title(&amp;quot;Sigma-Convergence: Cross-Country Income Dispersion&amp;quot;, size(medium))
graph export &amp;quot;stata_convergence2_sigma.png&amp;quot;, replace width(2400)
restore
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_sigma.png" alt="Standard deviation of log GDP per capita across countries from 1960 to 2017. Sigma rises steadily from about 0.95 in 1960 to a peak of 1.22 around 2000, then declines.">&lt;/p>
&lt;pre>&lt;code class="language-text">Sigma (SD of log GDP per capita):
Year | Sigma
-------+---------
1960 | 0.947
1970 | 1.086
1980 | 1.139
1990 | 1.146
2000 | 1.217 (peak)
2010 | 1.173
2017 | 1.173
&lt;/code>&lt;/pre>
&lt;p>The standard deviation of log GDP per capita rose steadily from 0.95 in 1960 to a peak of 1.22 in 2000, reflecting four decades of widening global inequality. After 2000, sigma began declining, reaching 1.13 by 2015 before ticking back up slightly to 1.17 in 2017. This pattern is consistent with beta-convergence leading sigma-convergence by roughly a decade: beta turned significantly negative around 1999, and sigma began declining shortly after 2000. The lag occurs because sigma-convergence requires catch-up growth fast enough to offset the random shocks that push countries apart &amp;mdash; a more demanding condition than simple beta-convergence.&lt;/p>
&lt;p>Now that we have established the headline fact &amp;mdash; convergence emerged around 2000 &amp;mdash; we need to understand &lt;em>who&lt;/em> is driving it. Is it catch-up growth at the bottom, stagnation at the top, or both?&lt;/p>
&lt;hr>
&lt;h2 id="6-who-drives-convergence">6. Who drives convergence?&lt;/h2>
&lt;h3 id="61-income-quartile-decomposition">6.1 Income quartile decomposition&lt;/h3>
&lt;p>We decompose the convergence trend by sorting countries into income quartiles and tracking each group&amp;rsquo;s average growth rate over time. This reveals whether convergence reflects catch-up growth by the poorest countries, a growth slowdown among the richest, or both.&lt;/p>
&lt;pre>&lt;code class="language-stata">* Compute mean 10-year growth by income quartile and year
xtile quartile = loggdp, nq(4)
collapse (mean) mean_growth = loggdp_growth_10, by(quartile year)
* Plot 4 lines, one per quartile
twoway (line mean_growth year if quartile == 1, lcolor(&amp;quot;255 141 61&amp;quot;)) ///
(line mean_growth year if quartile == 2, lcolor(&amp;quot;246 199 0&amp;quot;)) ///
(line mean_growth year if quartile == 3, lcolor(&amp;quot;146 195 51&amp;quot;)) ///
(line mean_growth year if quartile == 4, lcolor(&amp;quot;106 155 204&amp;quot;)), ///
legend(label(1 &amp;quot;Q1 (Poorest)&amp;quot;) label(2 &amp;quot;Q2&amp;quot;) label(3 &amp;quot;Q3&amp;quot;) label(4 &amp;quot;Q4 (Richest)&amp;quot;))
graph export &amp;quot;stata_convergence2_growth_by_quartile.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_growth_by_quartile.png" alt="Mean 10-year growth by income quartile over time. The richest quartile shifts from fastest-growing in the 1960s to slowest-growing by 2007, while the poorest quartile accelerates.">&lt;/p>
&lt;pre>&lt;code class="language-text">Mean 10-year growth by quartile:
Q1(Poorest) Q2 Q3 Q4(Richest)
1960 2.46 2.20 2.93 3.49
1985 0.49 0.99 1.46 1.76
2000 3.31 3.60 3.29 1.26
2007 3.02 2.18 1.60 0.31
&lt;/code>&lt;/pre>
&lt;p>Convergence since 2000 is driven by both catch-up growth at the bottom AND a growth slowdown at the top. In the 1960s, the richest quartile (Q4) grew fastest at 3.49% per year, while the poorest (Q1) grew at only 2.46%. By 2007, this ordering had completely reversed: Q1 grew at 3.02% while Q4 grew at just 0.31%. The richest quartile experienced the most dramatic decline, going from the fastest-growing group in the 1960s to the slowest by the 2000s. Think of it like a marathon where the leaders have slowed down while the runners at the back have sped up &amp;mdash; the pack is compressing from both directions.&lt;/p>
&lt;h3 id="62-regional-robustness">6.2 Regional robustness&lt;/h3>
&lt;p>A natural concern is that convergence might be driven by a single region &amp;mdash; perhaps it disappears if we exclude China and the rest of Asia. We check by estimating the rolling beta trend while excluding each major region one at a time.&lt;/p>
&lt;pre>&lt;code class="language-stata">* For each region, estimate beta trend excluding that region
foreach reg in 1 2 3 4 {
areg loggdp_growth_10 c.loggdp#i.year if region_group != `reg', ///
absorb(year) robust cluster(country_id)
* Extract and store coefficients
}
graph export &amp;quot;stata_convergence2_beta_excluding_regions.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_beta_excluding_regions.png" alt="Rolling beta trend with each of four major regions excluded one at a time. Convergence is robust to excluding any single region.">&lt;/p>
&lt;p>Convergence holds when excluding any single region. Excluding Sub-Saharan Africa makes convergence even stronger ($\beta$ reaches -1.25 by 2000), consistent with Africa&amp;rsquo;s economic difficulties during the 1970s&amp;ndash;1990s dragging the global average toward zero. Excluding Europe/North America yields a somewhat weaker but still clearly negative trend. The finding is genuinely global.&lt;/p>
&lt;p>We have now established the core empirical facts: convergence emerged around 2000, it reflects forces on both ends of the income distribution, and it is not driven by any single region. The next step is to ask &lt;em>why&lt;/em>. The paper&amp;rsquo;s key insight is that the answer lies in the behavior of growth correlates.&lt;/p>
&lt;hr>
&lt;h2 id="7-have-growth-correlates-converged">7. Have growth correlates converged?&lt;/h2>
&lt;p>The 1990s growth literature identified dozens of variables that predict economic growth: investment, education, democracy, governance, financial development, inflation, and many others. A key insight of Kremer et al. (2021) is that these variables are not static &amp;mdash; they have been converging across countries just like income itself.&lt;/p>
&lt;p>We test this by regressing the change in each correlate (from 1985 to 2015) on its initial level in 1985. A negative slope means &lt;strong>correlate convergence&lt;/strong> &amp;mdash; countries that started with worse values experienced the largest improvements.&lt;/p>
&lt;pre>&lt;code class="language-stata">* For each correlate: change = beta * initial_level + epsilon
* Example for Polity 2 (democracy score)
gen change = 100 * ((polity2_2015 - polity2_1985) / 30)
reg change polity2_1985, robust
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_correlate_convergence.png" alt="Six-panel scatter showing convergence in six representative growth correlates: population growth, investment, education, democracy, government spending, and financial credit. All six show negative slopes indicating convergence.">&lt;/p>
&lt;pre>&lt;code class="language-text">Correlate beta-convergence (change 1985-2015 regressed on level 1985):
Variable | beta se n_obs pval
-----------------------+------------------------------------
investment | -2.978 0.395 118 0.000
population_growth | -1.530 0.277 172 0.000
polity2 | -2.029 0.168 131 0.000
FH_political_rights | -1.394 0.206 139 0.000
gov_spending | -1.611 0.305 114 0.000
inflation | -3.070 0.103 128 0.000
barrolee2060 | -0.158 0.105 136 0.136
&lt;/code>&lt;/pre>
&lt;p>Growth correlates have themselves been converging since 1985. The strongest convergence is in inflation ($\beta = -3.07$), investment ($\beta = -2.98$), and democracy as measured by Polity 2 ($\beta = -2.03$) &amp;mdash; all significant at the 0.1% level. This means that the cross-country distribution of policies and institutions has been compressing: countries with initially worse institutions experienced the largest improvements. The notable exception is Barro-Lee education ($\beta = -0.16$, p = 0.14), where convergence is slower and not statistically significant.&lt;/p>
&lt;p>This finding is crucial because it connects two previously separate literatures. The convergence literature asks whether poor countries are catching up in &lt;em>income&lt;/em>. The institutions literature documents whether countries are catching up in &lt;em>policies&lt;/em>. The answer to both is yes &amp;mdash; and the next sections show these are not coincidences but are linked by the omitted variable bias formula.&lt;/p>
&lt;hr>
&lt;h2 id="8-the-ovb-framework-why-does-convergence-emerge">8. The OVB framework: why does convergence emerge?&lt;/h2>
&lt;p>This section introduces the central analytical framework of the paper. The &lt;strong>omitted variable bias (OVB) formula&lt;/strong> provides an exact decomposition of the gap between unconditional convergence (a simple comparison of growth and income) and conditional convergence (controlling for institutions). Understanding this decomposition is the key to answering &lt;em>why&lt;/em> unconditional convergence emerged.&lt;/p>
&lt;h3 id="81-three-regressions">8.1 Three regressions&lt;/h3>
&lt;p>Consider any growth correlate &amp;mdash; say, democracy (Polity 2 score). Three regressions define the framework:&lt;/p>
&lt;p>&lt;strong>Regression 1 &amp;mdash; Unconditional convergence ($\beta$):&lt;/strong> Regress growth on income alone.&lt;/p>
&lt;p>$$\text{Growth}_i = \alpha + \beta \cdot \log(\text{GDPpc}_i) + \varepsilon_i$$&lt;/p>
&lt;p>If $\beta &amp;lt; 0$, poorer countries grow faster (convergence). If $\beta &amp;gt; 0$, richer countries grow faster (divergence).&lt;/p>
&lt;p>&lt;strong>Regression 2 &amp;mdash; Conditional convergence ($\beta^{\ast}$):&lt;/strong> Regress growth on income &lt;em>and&lt;/em> the correlate.&lt;/p>
&lt;p>$$\text{Growth}_i = \alpha + \beta^{\ast} \cdot \log(\text{GDPpc}_i) + \lambda \cdot \text{Inst}_i + \varepsilon_i$$&lt;/p>
&lt;p>$\beta^{\ast}$ is the convergence coefficient &lt;em>controlling for&lt;/em> institutions. The coefficient $\lambda$ captures how much the correlate predicts growth, holding income constant. In the 1990s, $\beta^{\ast}$ was typically negative (conditional convergence) even when $\beta$ was not (no unconditional convergence).&lt;/p>
&lt;p>&lt;strong>Regression 3 &amp;mdash; Correlate-income slope ($\delta$):&lt;/strong> Regress the correlate on income.&lt;/p>
&lt;p>$$\text{Inst}_i = \nu + \delta \cdot \log(\text{GDPpc}_i) + u_i$$&lt;/p>
&lt;p>$\delta$ captures how strongly the correlate correlates with income. If $\delta &amp;gt; 0$, richer countries have better institutions &amp;mdash; the &amp;ldquo;modernization hypothesis.&amp;rdquo;&lt;/p>
&lt;h3 id="82-the-key-equation">8.2 The key equation&lt;/h3>
&lt;p>The OVB formula links these three regressions with an exact algebraic identity:&lt;/p>
&lt;p>$$\beta - \beta^{\ast} = \delta \times \lambda$$&lt;/p>
&lt;p>In words, this says that the gap between unconditional and conditional convergence equals the product of two things: (1) how much richer countries have better institutions ($\delta$), and (2) how much those institutions predict growth ($\lambda$). This is not an approximation &amp;mdash; it is an algebraic identity that holds exactly in any linear regression.&lt;/p>
&lt;p>&lt;strong>Why this matters.&lt;/strong> The decomposition tells us there are exactly three ways unconditional convergence can change over time:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Conditional convergence itself changes&lt;/strong> ($\beta^{\ast}$ shifts) &amp;mdash; e.g., technology diffusion accelerates&lt;/li>
&lt;li>&lt;strong>Correlate-income slopes change&lt;/strong> ($\delta$ shifts) &amp;mdash; e.g., rich and poor countries become equally democratic&lt;/li>
&lt;li>&lt;strong>Growth regression coefficients change&lt;/strong> ($\lambda$ shifts) &amp;mdash; e.g., democracy stops predicting growth&lt;/li>
&lt;/ol>
&lt;p>The paper&amp;rsquo;s central finding: it is mainly &lt;strong>mechanism 3&lt;/strong> &amp;mdash; $\lambda$ flattened &amp;mdash; that explains the emergence of unconditional convergence.&lt;/p>
&lt;h3 id="83-worked-example-democracy-polity-2">8.3 Worked example: democracy (Polity 2)&lt;/h3>
&lt;p>Before generalizing, we build intuition with one correlate. Polity 2 measures democracy on a scale from -10 (autocracy) to +10 (full democracy), normalized by its 1985 standard deviation so that coefficients are in comparable units.&lt;/p>
&lt;pre>&lt;code class="language-stata">* Normalize polity2 by its 1985 SD
gen polity2_norm = polity2 / `sd_polity2'
* --- Period: 1985 ---
* Regression 1 (Unconditional):
reg loggdp_growth_10 loggdp if year == 1985 &amp;amp; polity2_norm != ., robust
* Regression 2 (Conditional):
reg loggdp_growth_10 loggdp polity2_norm if year == 1985, robust
* Regression 3 (Income-Institution slope):
reg polity2_norm loggdp if year == 1985, robust
* Repeat for 2005
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-text">---- Period: 1985 ----
Regression 1 (Unconditional): beta = 0.328 (SE = 0.199, N = 124)
Regression 2 (Conditional): beta* = -0.111, lambda = 0.891
Regression 3 (Income-Inst): delta = 0.494
OVB DECOMPOSITION:
beta - beta* = 0.440 (actual gap)
delta x lambda = 0.440 (predicted by OVB formula)
delta = 0.494 (richer countries more democratic?)
lambda = 0.891 (democracy predicts growth?)
---- Period: 2005 ----
Regression 1 (Unconditional): beta = -0.767 (SE = 0.149, N = 147)
Regression 2 (Conditional): beta* = -0.807, lambda = 0.183
Regression 3 (Income-Inst): delta = 0.216
OVB DECOMPOSITION:
beta - beta* = 0.040 (actual gap)
delta x lambda = 0.040 (predicted by OVB formula)
delta = 0.216 (richer countries more democratic?)
lambda = 0.183 (democracy predicts growth?)
COMPARISON ACROSS TIME:
delta (1985) = 0.494 --&amp;gt; delta (2005) = 0.216 [STABLE]
lambda (1985) = 0.891 --&amp;gt; lambda (2005) = 0.183 [SHRANK]
gap (1985) = 0.440 --&amp;gt; gap (2005) = 0.040 [CLOSED]
&lt;/code>&lt;/pre>
&lt;p>This single example encapsulates the paper&amp;rsquo;s entire argument. In 1985, unconditional $\beta$ was +0.33 (divergence), but controlling for democracy revealed conditional convergence at $\beta^{\ast} = -0.11$. The gap of 0.44 is exactly predicted by $\delta \times \lambda = 0.494 \times 0.891 = 0.44$ &amp;mdash; the OVB formula holds exactly because it is an algebraic identity. By 2005, $\lambda$ collapsed from 0.89 to 0.18 &amp;mdash; democracy went from being a powerful growth predictor (one SD higher Polity 2 associated with 0.89% faster annual growth) to a near-zero predictor. The resulting gap shrank from 0.44 to 0.04 &amp;mdash; a &lt;strong>91% reduction&lt;/strong>. The correlate-income slope $\delta$ also fell (from 0.49 to 0.22), but the primary driver was the collapse in $\lambda$.&lt;/p>
&lt;p>Think of it like a recipe that calls for two ingredients. The gap ($\delta \times \lambda$) was large in 1985 because both ingredients were present: richer countries had much better democracy ($\delta$ large) &lt;em>and&lt;/em> democracy strongly predicted growth ($\lambda$ large). By 2005, the second ingredient ($\lambda$) had nearly vanished &amp;mdash; it no longer mattered for growth predictions whether a country was democratic or not &amp;mdash; so the recipe produced almost nothing.&lt;/p>
&lt;p>Now we generalize: does this pattern hold across &lt;em>all&lt;/em> growth correlates, not just democracy?&lt;/p>
&lt;hr>
&lt;h2 id="9-are-correlate-income-slopes-stable-delta">9. Are correlate-income slopes stable? (Delta)&lt;/h2>
&lt;p>The OVB formula has two components: $\delta$ (the correlate-income slope) and $\lambda$ (the growth-correlate slope). We examine each in turn. If $\delta$ &amp;mdash; the relationship between income and institutions &amp;mdash; has changed dramatically, that could explain the closing gap. But the paper finds that $\delta$ has been remarkably stable.&lt;/p>
&lt;p>For each correlate, we compute $\delta$ in 1985 and in 2015, then scatter one against the other. Points on the 45-degree line mean $\delta$ has not changed; points below it mean the relationship weakened.&lt;/p>
&lt;pre>&lt;code class="language-stata">* For each correlate: regress Inst on loggdp in 1985 and 2015
* All correlates normalized by their 1985 SD
* Panel A: Solow fundamentals + short-run correlates
* Panel B: Long-run correlates + culture
graph combine delta_A delta_B, rows(1) cols(2) ///
graphregion(color(white)) ///
title(&amp;quot;Stability of Correlate-Income Slopes&amp;quot;, size(medium))
graph export &amp;quot;stata_convergence2_delta_stability.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_delta_stability.png" alt="Two-panel scatter of correlate-income slopes (delta) in 2015 versus 1985. Points cluster tightly along the 45-degree line for all variable groups.">&lt;/p>
&lt;pre>&lt;code class="language-text">Delta fitted line slopes (delta_2015 vs delta_1985):
Solow fundamentals: slope = 0.878
Short-Run correlates: slope = 0.886
Long-Run correlates: slope = 1.024
Culture: slope = 0.884
&lt;/code>&lt;/pre>
&lt;p>The correlate-income relationships are remarkably stable. Fitted lines cluster tightly around the 45-degree line: Solow fundamentals 0.88, short-run correlates 0.89, long-run correlates 1.02, culture 0.88. This means the cross-country association between income and institutions has barely changed over 30 years. Richer countries still have better democracy, more investment, lower population growth, and stronger financial sectors in essentially the same proportions as in 1985. The &amp;ldquo;modernization hypothesis&amp;rdquo; &amp;mdash; that economic development goes hand-in-hand with institutional improvement &amp;mdash; passes its out-of-sample test.&lt;/p>
&lt;p>Crucially, this stability means that the $\delta$ component is &lt;strong>not&lt;/strong> responsible for the closing gap between unconditional and conditional convergence. The answer must lie in the other component: $\lambda$.&lt;/p>
&lt;hr>
&lt;h2 id="10-growth-regressions-then-vs-now-the-lambda-flattening">10. Growth regressions then vs. now: the lambda flattening&lt;/h2>
&lt;p>In the 1990s, a massive literature ran growth regressions of the form: Growth = $\alpha + \beta^{\ast} \times$ Income $+ \lambda \times$ Correlate $+ \varepsilon$. These regressions identified which policies and institutions predict growth and formed the empirical backbone of the &amp;ldquo;Washington Consensus&amp;rdquo; &amp;mdash; the set of policy recommendations that international institutions gave to developing countries. The key question: &lt;strong>do these regressions hold up with 25 years of new data?&lt;/strong>&lt;/p>
&lt;p>For each correlate, we estimate $\lambda$ (the growth-correlate slope) in the base year (~1985) and in 2005, using a fixed sample of countries with data in both periods.&lt;/p>
&lt;pre>&lt;code class="language-stata">* For each correlate, run the growth regression in base year and 2005
* Growth = alpha + beta* x loggdp + lambda x correlate + epsilon
* Fixed country sample per correlate
* Scatter lambda_2005 vs lambda_1985
reg lambda_2005 lambda_1985 if flag_solow == 1
* -&amp;gt; slope = 0.861, R-sq = 0.947
reg lambda_2005 lambda_1985 if flag_solow == 0 &amp;amp; flag_long_run == 0
* -&amp;gt; slope = 0.189, R-sq = 0.063
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_lambda_flattening.png" alt="Two-panel scatter of growth regression coefficients (lambda) in 2005 versus 1985. Solow fundamentals cluster near the 45-degree line; short-run correlates are scattered near zero.">&lt;/p>
&lt;pre>&lt;code class="language-text">Lambda fitted line slopes (lambda_2005 vs lambda_1985):
Solow fundamentals: slope = 0.861, R-sq = 0.947
Short-run correlates: slope = 0.189, R-sq = 0.063
Long-Run correlates: slope = 0.296
Culture: slope = 0.685
&lt;/code>&lt;/pre>
&lt;p>This is the most striking empirical result of the paper. &lt;strong>Solow fundamentals&lt;/strong> (investment, population growth, education) show high persistence: a fitted slope of 0.86 with R-squared of 0.95, meaning these deep structural variables predict growth almost as well in 2005 as in 1985. In dramatic contrast, &lt;strong>short-run correlates&lt;/strong> (democracy, governance, fiscal policy, financial development) show near-zero persistence: a slope of 0.19 with R-squared of only 0.06. There is essentially no correlation between which policy variables predicted growth in 1985 and which predict growth in 2005.&lt;/p>
&lt;p>The Washington Consensus growth regressions &amp;mdash; which identified specific policies and institutions as growth drivers &amp;mdash; have &lt;strong>failed their out-of-sample test&lt;/strong>. Variables like Polity 2 ($\lambda$ fell from 0.89 to 0.34), FH Political Rights (1.11 to 0.19), and FH Civil Liberties (0.96 to 0.17) went from strong growth predictors to near-zero predictors. Long-run correlates and culture occupy an intermediate position (slopes 0.30 and 0.69 respectively).&lt;/p>
&lt;p>Why did this happen? There are at least three possible explanations: (a) as correlates converged (Section 7), the reduced cross-country variation made coefficient estimation noisier; (b) the original regressions may have been overfitted to a specific historical sample; (c) the relationship between institutions and growth may be non-linear &amp;mdash; institutions matter most when differences are large, and less when all countries have reasonably good policies. The analysis cannot distinguish between these, but the empirical fact is clear: $\lambda$ collapsed.&lt;/p>
&lt;p>Since $\delta$ is stable (Section 9) and $\lambda$ collapsed (this section), their product $\delta \times \lambda$ must have shrunk toward zero. The next section confirms this.&lt;/p>
&lt;hr>
&lt;h2 id="11-the-punchline-absolute-convergence-converges-to-conditional">11. The punchline: absolute convergence converges to conditional&lt;/h2>
&lt;h3 id="111-the-ovb-gap-is-closing">11.1 The OVB gap is closing&lt;/h3>
&lt;p>The product $\delta \times \lambda$ quantifies how much each correlate biases the unconditional convergence coefficient. We scatter $\delta \times \lambda$ in 2005 against its value in 1985 to see whether this &amp;ldquo;explanatory gap&amp;rdquo; has closed.&lt;/p>
&lt;pre>&lt;code class="language-stata">* Scatter delta*lambda in 2005 vs 1985
reg dl_2005 dl_1985 if flag_solow == 0 &amp;amp; flag_long_run == 0
* -&amp;gt; slope = 0.090 (short-run correlates: gap essentially vanished)
reg dl_2005 dl_1985 if flag_solow == 1
* -&amp;gt; slope = 0.740 (Solow fundamentals: gap partially retained)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_ovb_gap.png" alt="Two-panel scatter of delta times lambda products in 2005 versus 1985. Short-run correlate products have collapsed to near zero.">&lt;/p>
&lt;pre>&lt;code class="language-text">OVB gap fitted line slopes (dl_2005 vs dl_1985):
Panel A:
Solow fundamentals: slope = 0.740
Short-Run correlates: slope = 0.090
Panel B:
Long-Run correlates: slope = 0.480
Culture: slope = 0.739
&lt;/code>&lt;/pre>
&lt;p>The OVB gap for short-run correlates has shrunk to nearly zero (fitted slope 0.09). In 1985, omitting these policy and institutional variables made unconditional convergence look substantially worse than conditional convergence. By 2005, the two are nearly identical. Solow fundamentals retained more of their explanatory power (slope 0.74), reflecting the stability of both their $\delta$ and $\lambda$ components. This confirms the paper&amp;rsquo;s central thesis: unconditional convergence emerged not because the income-correlate relationship changed ($\delta$ is stable) but because policy variables stopped predicting growth ($\lambda$ flattened).&lt;/p>
&lt;h3 id="112-the-closing-gap-over-time">11.2 The closing gap over time&lt;/h3>
&lt;p>The definitive test uses multivariate regressions. We fix a sample of 73 countries with complete data on 10 correlates (Polity 2, FH political rights, FH civil liberties, private investment, government spending, inflation, WDI credit, credit by financial sector, Barro-Lee education, and education gender gap). For each year from 1985 to 2007, we estimate both unconditional $\beta$ (income only) and conditional $\beta^{\ast}$ (income plus all 10 correlates).&lt;/p>
&lt;pre>&lt;code class="language-stata">* Fix sample: 73 countries with complete data on all 10 correlates in 1985
local var_all polity2 FH_political_rights FH_civil_liberties pri_inv ///
gov_spending inflation WDI_credit credit barrolee2060 edugap
forval yr = 1985/2007 {
* Unconditional: reg growth loggdp, robust cluster(country_id)
* Conditional: reg growth loggdp `var_all', robust cluster(country_id)
}
* Plot the closing gap
twoway (line beta_unconditional year, lcolor(&amp;quot;20 20 19&amp;quot;) lwidth(medthick)) ///
(line beta_conditional year, lcolor(&amp;quot;106 155 204&amp;quot;) lwidth(medthick)) ///
(line zero year, lcolor(&amp;quot;217 119 87&amp;quot;) lpattern(dot)), ///
legend(label(1 &amp;quot;Absolute Convergence&amp;quot;) label(2 &amp;quot;Conditional Convergence&amp;quot;))
graph export &amp;quot;stata_convergence2_absolute_vs_conditional.png&amp;quot;, replace width(2400)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_absolute_vs_conditional.png" alt="Time series of unconditional beta and conditional beta-star from 1985 to 2007. The two lines converge as unconditional beta falls from +0.42 to -0.65 while conditional beta-star fluctuates around -0.5 to -1.3.">&lt;/p>
&lt;pre>&lt;code class="language-text">Year | beta_unconditional beta_conditional gap
------+-------------------------------------------
1985 | 0.420 -1.072 1.492
1990 | 0.377 -0.560 0.937
1995 | 0.081 -0.155 0.236
2000 | -0.387 -0.540 0.153
2005 | -0.556 -0.969 0.413
2007 | -0.646 -1.274 0.629
&lt;/code>&lt;/pre>
&lt;p>This is the paper&amp;rsquo;s title finding. In 1985, unconditional $\beta$ was +0.42 (divergence) while conditional $\beta^{\ast}$ was -1.07 (strong convergence when controlling for institutions) &amp;mdash; a gap of 1.49. By 2000, unconditional $\beta$ had fallen to -0.39 while conditional $\beta^{\ast}$ was -0.54, narrowing the gap to just 0.15. The gap narrowed dramatically from 1.49 (1985) to 0.15 (2000), then widened somewhat as conditional $\beta^{\ast}$ deepened faster, but both lines are firmly negative by 2000.&lt;/p>
&lt;p>The Solow model&amp;rsquo;s prediction of conditional convergence held all along &amp;mdash; what changed is that the real world caught up. As the OVB from excluding correlates shrank toward zero, unconditional convergence &amp;ldquo;converged to&amp;rdquo; conditional convergence.&lt;/p>
&lt;h3 id="113-multivariate-evidence-table-5">11.3 Multivariate evidence (Table 5)&lt;/h3>
&lt;p>The multivariate regressions crystallize the structural change by showing how adding correlates affects the convergence coefficient in each period.&lt;/p>
&lt;pre>&lt;code class="language-text"> abs_1985 solow_1985 short_1985 full_1985 abs_2005 solow_2005 short_2005 full_2005
loggdp 0.420 -0.447 -0.435 -0.816 -0.556 -1.176 -0.557 -1.040
(0.252) (0.661) (0.457) (0.619) (0.203) (0.309) (0.327) (0.393)
R2 0.028 0.155 0.152 0.228 0.101 0.247 0.258 0.355
N 73 73 73 73 73 73 73 73
&lt;/code>&lt;/pre>
&lt;p>In 1985, absolute convergence alone gives $\beta = +0.42$ (divergence, R-squared = 0.03 &amp;mdash; essentially no linear relationship). Adding Solow fundamentals flips the sign to $\beta^{\ast} = -0.45$, and the full model gives $\beta^{\ast} = -0.82$. In 2005, the picture changes fundamentally: absolute convergence is already strong at $\beta = -0.56$ (R-squared = 0.10). Adding short-run correlates alone barely changes the coefficient (from -0.56 to -0.56), confirming that policy variables no longer have explanatory power beyond what income already captures. Correlates still improve overall fit (R-squared rises from 0.10 to 0.35), but they no longer alter the convergence coefficient.&lt;/p>
&lt;hr>
&lt;h2 id="12-robustness-does-the-averaging-period-matter">12. Robustness: does the averaging period matter?&lt;/h2>
&lt;p>The main results use 10-year forward-looking growth rates. One concern is that 10-year averaging may smooth out noise in a way that creates artificial trends. We check by re-estimating the rolling beta-convergence trend using 1-year, 2-year, 5-year, and 10-year growth averages.&lt;/p>
&lt;pre>&lt;code class="language-stata">* For each averaging period t = 1, 2, 5, 10:
gen loggdp_growth_t = 100 * ((F[t].logrgdpna - logrgdpna) / t)
areg loggdp_growth_t c.loggdp#i.year, absorb(year) robust cluster(country_id)
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="stata_convergence2_robustness_averaging.png" alt="Four-panel comparison of beta trends using 1-, 2-, 5-, and 10-year growth averages. All four panels show the same downward trend; shorter averages are noisier.">&lt;/p>
&lt;pre>&lt;code class="language-text">Results:
1-year average: high noise, downward trend visible but obscured by fluctuations
2-year average: moderate noise, downward trend clearer
5-year average: smooth, clear downward trend from ~0 to ~-0.5 by late 2000s
10-year average: smoothest, clearest trend from +0.5 to -0.76 by 2007
&lt;/code>&lt;/pre>
&lt;p>The convergence trend is robust across all averaging periods. As expected, shorter periods produce noisier estimates &amp;mdash; the 1-year panel is dominated by year-to-year fluctuations &amp;mdash; while longer averages yield smoother trends. All four specifications agree that the crossover from divergence to convergence occurs around 1990&amp;ndash;2000, confirming that the finding is not an artifact of the 10-year growth rate choice.&lt;/p>
&lt;hr>
&lt;h2 id="13-discussion">13. Discussion&lt;/h2>
&lt;p>Let us return to the question posed in the Overview: &lt;strong>why did unconditional convergence emerge since 2000?&lt;/strong>&lt;/p>
&lt;p>The OVB framework provides a clear and quantitative answer. The gap between unconditional convergence ($\beta$) and conditional convergence ($\beta^{\ast}$) is exactly equal to the product $\delta \times \lambda$. This gap closed because $\lambda$ &amp;mdash; the coefficient on growth correlates in growth regressions &amp;mdash; collapsed for short-run policy and institutional variables (slope = 0.19, R-squared = 0.06). Meanwhile, $\delta$ &amp;mdash; the relationship between income and institutions &amp;mdash; remained remarkably stable (slopes around 0.88 on the 45-degree line). In concrete terms: richer countries still have better institutions in the same proportions as 30 years ago, but those institutional advantages no longer translate into faster growth. As a result, unconditional convergence caught up to conditional convergence.&lt;/p>
&lt;p>This has important implications for how we think about economic development. The 1990s &amp;ldquo;Washington Consensus&amp;rdquo; was built on the empirical finding that good policies and institutions predict faster growth. Our out-of-sample test shows that many of these relationships did not persist into the 2000s &amp;mdash; at least not for short-run policy variables. Solow fundamentals (investment, population growth, education) remained robust growth predictors, consistent with the Solow model&amp;rsquo;s enduring relevance. But governance indices, fiscal indicators, and financial variables that were &amp;ldquo;significant&amp;rdquo; in 1990s regressions no longer predict growth. This raises questions about the stability of policy advice based on cross-country growth regressions.&lt;/p>
&lt;p>&lt;strong>Caveats.&lt;/strong> Several important limitations apply. First, the analysis is entirely descriptive &amp;mdash; cross-country regressions do not establish causal relationships. The flattening of $\lambda$ could reflect genuine changes in causal relationships, convergence in unobserved variables, or reduced cross-country variation making coefficient estimation noisier. Second, the panel is unbalanced (109 countries in 1960 vs. 160 by 1990), and sample composition changes could mechanically affect estimates. Third, some correlates have small samples (fewer than 60 observations), limiting statistical precision. Finally, the 10-year growth variable is forward-looking, so the last usable observation is 2007/2008, missing the Global Financial Crisis, the post-GFC recovery, and COVID-19. Whether convergence persisted through these shocks is an open question.&lt;/p>
&lt;hr>
&lt;h2 id="14-summary-and-key-takeaways">14. Summary and key takeaways&lt;/h2>
&lt;p>This tutorial reproduced the key findings of Kremer, Willis, and You (2021), documenting the emergence of unconditional convergence and explaining it through the OVB decomposition framework. The analysis used 160 countries over 58 years with 50+ growth correlates.&lt;/p>
&lt;h3 id="the-story-in-four-facts">The story in four facts&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Unconditional convergence emerged around 2000.&lt;/strong> The $\beta$-convergence coefficient shifted from +0.53 in the 1960s (divergence, p = 0.006) to -0.76 by 2007 (convergence, p &amp;lt; 0.001), with a systematic trend of -0.025 per year.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Growth correlates converged.&lt;/strong> Inflation ($\beta = -3.07$), investment ($\beta = -2.98$), and democracy ($\beta = -2.03$) all showed strong convergence. Countries with initially worse institutions experienced the largest improvements.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Growth regression coefficients collapsed for policy variables.&lt;/strong> Solow fundamentals maintained high stability ($\lambda$ slope = 0.86, R-squared = 0.95), but short-run correlates showed near-zero persistence ($\lambda$ slope = 0.19, R-squared = 0.06). The 1990s growth regressions failed their out-of-sample test.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The gap between absolute and conditional convergence closed.&lt;/strong> The Polity 2 worked example shows the gap fell from 0.44 to 0.04 (a 91% reduction). In the multivariate analysis, the gap narrowed from 1.49 (1985) to 0.15 (2000).&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="limitations">Limitations&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Descriptive, not causal:&lt;/strong> The OVB framework decomposes observed correlations, not causal relationships&lt;/li>
&lt;li>&lt;strong>Pre-2008 endpoint:&lt;/strong> The analysis does not cover the Global Financial Crisis or COVID-19&lt;/li>
&lt;li>&lt;strong>Small samples for some correlates:&lt;/strong> Culture and tariff variables have fewer than 60 observations&lt;/li>
&lt;li>&lt;strong>Normalization sensitivity:&lt;/strong> All correlate coefficients are normalized by their 1985 standard deviation&lt;/li>
&lt;/ul>
&lt;h3 id="next-steps">Next steps&lt;/h3>
&lt;ul>
&lt;li>Extend the analysis through the 2010s using updated PWT data to test whether convergence survived the post-GFC period&lt;/li>
&lt;li>Explore non-linear specifications to test whether $\lambda$ flattened because of reduced correlate variation&lt;/li>
&lt;li>Apply the OVB decomposition to regional subsamples (e.g., does the mechanism differ for Sub-Saharan Africa vs. East Asia?)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="15-exercises">15. Exercises&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Your own worked example.&lt;/strong> Choose a different correlate from the dataset (e.g., investment or FH political rights) and replicate the OVB worked example from Section 8.3. Compute $\beta$, $\beta^{\ast}$, $\delta$, $\lambda$, and verify the identity $\beta - \beta^{\ast} = \delta \times \lambda$ for both 1985 and 2005. Did the gap close for your chosen variable? Was the primary driver the change in $\delta$ or $\lambda$?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Balanced panel sensitivity.&lt;/strong> Re-estimate the rolling beta-convergence trend (Section 4) using only countries that have GDP data from 1960 onward (a balanced panel of approximately 109 countries). Does the convergence trend look different when you exclude countries that enter the sample later? What does this tell you about the role of sample composition changes?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Alternative classification.&lt;/strong> The paper classifies variables as &amp;ldquo;Solow fundamentals&amp;rdquo; or &amp;ldquo;short-run correlates.&amp;rdquo; Move education (barrolee2060) from the Solow group to the short-run group and re-estimate the lambda stability scatters (Section 10). Does the Solow fitted line slope change substantially? What does this tell you about the robustness of the paper&amp;rsquo;s classification scheme?&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="references">References&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="https://www.nber.org/papers/w29484" target="_blank" rel="noopener">Kremer, M., Willis, J., &amp;amp; You, Y. (2021). Converging to Convergence. &lt;em>NBER Working Paper 29484&lt;/em>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://doi.org/10.2307/2937943" target="_blank" rel="noopener">Barro, R. (1991). Economic Growth in a Cross Section of Countries. &lt;em>Quarterly Journal of Economics&lt;/em>, 106(2), 407&amp;ndash;443&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://doi.org/10.1086/261816" target="_blank" rel="noopener">Barro, R. &amp;amp; Sala-i-Martin, X. (1992). Convergence. &lt;em>Journal of Political Economy&lt;/em>, 100(2), 223&amp;ndash;251&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://doi.org/10.1016/j.jdeveco.2021.102687" target="_blank" rel="noopener">Patel, D., Sandefur, J., &amp;amp; Subramanian, A. (2021). The New Era of Unconditional Convergence. &lt;em>Journal of Development Economics&lt;/em>, 152, 102687&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://doi.org/10.1016/S1574-0684%2805%2901008-7" target="_blank" rel="noopener">Durlauf, S., Johnson, P., &amp;amp; Temple, J. (2005). Growth Econometrics. &lt;em>Handbook of Economic Growth&lt;/em>, Volume 1A&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rug.nl/ggdc/productivity/pwt/" target="_blank" rel="noopener">Penn World Table 10.0 &amp;mdash; Groningen Growth and Development Centre&lt;/a>&lt;/li>
&lt;/ol>
&lt;h3 id="acknowledgements">Acknowledgements&lt;/h3>
&lt;p>AI tools (Claude Code) were used to make the contents of this post more accessible to students. Nevertheless, the content in this post may still have errors. Caution is needed when applying the contents of this post to true research projects.&lt;/p></description></item></channel></rss>