Loading replication
Fetching primary parquet sources and recomputing the published exhibits.
Fetching primary parquet sources and recomputing the published exhibits.
Hidalgo & Hausmann argue that the knowledge embedded in a country’s export basket predicts its income level and future growth. The headline figure: a monotone scatter of their complexity measure (later named the Economic Complexity Index) against log GDP per capita. Our re-estimate using 2022 BACI-derived ECI and World Bank GDP per capita recovers the same strong positive association.
Hidalgo & Hausmann (2009, PNAS) measure economic complexity via the method of reflections on the binary country-product RCA matrix Mcp(= 1 if country c has RCA > 1 in product p). Iterating kc,N = (1/kc,0) Σp Mcp kp,N−1 and kp,N = (1/kp,0) Σc Mcp kc,N−1, where kc,0 = diversity (row sum) and kp,0 = ubiquity (column sum), produces a sequence of increasingly refined complexity rankings kc. The paper does not use the term “Economic Complexity Index” or the acronym ECI (both were introduced later, in Hausmann et al. 2011, The Atlas of Economic Complexity), and it defines complexity purely through this iterative averaging, not through eigenvectors. Their Figure 3 shows that the absolute Pearson correlation between the complexity measure and log GDP per capita rises with the number of reflections (Fig. 3E), and they argue complexity predicts future income growth beyond current income. We do not quote a single headline correlation from the 2009 paper, because it reports the correlation as a curve over reflections (Fig. 3E) rather than one stated value.
We recompute the complexity measure annually on the TradeWeave CEPII BACI 202601 (retrieved 2026-06-01)release using the method of reflections of Hidalgo & Hausmann (2009), and label the resulting index ECI in the modern convention. We cross the 2022 country-level ECI against the World Bank WDI series NY.GDP.PCAP.CD (GDP per capita, current US$). The scatter covers 201 country-year rows (BACI includes some sub-jurisdictions, Hong Kong, Macao, Curaçao, that WDI also reports), and yields a Pearson correlation of r = 0.76, with a fitted OLS line of ln(GDPpc) = 9.02 + 1.09 · ECI. The slope says a one-σ rise in ECI is associated with a 109% higher GDP per capita, at the 2022 cross-section.
Hidalgo & Hausmann (2009) define complexity by iterating the method of reflections, not by any eigen-decomposition. Mealy, Farmer & Teytelboym (2019, Science Advances) later proved that the converged reflections index is equivalent to the second eigenvector of the row-normalised country-similarity matrix M̃cc′ = Σp McpMc′p / (kc,0 kc′,0 kp,0); the spectral ECI naming is from Hausmann et al. (2011). We use that equivalence as an independent check on our reflections code: we power-iterate the top 10 eigenvalues of the 2022 M̃ (built from the 226 countries × 6279 HS6 binary RCA matrix) and read off the complexity direction. The dominant eigenvalue λ1 belongs to the trivial uniform vector; the second eigenvalue λ2 carries the complexity ordering. The top-two spectral gap is |λ2| / |λ1| = 0.271.
Hidalgo & Hausmann’s headline claim is not descriptive but predictive: countries with higher ECI than their current income “deserves” should grow faster over the following decade, as income catches up to knowledge. We re-run this test with a fresh out-of-sample window: 2010 ECI plus 2010 log GDPpc projecting onto annualised 2010-2020 income growth. If the conditional ECI coefficient is positive and economically meaningful, the complexity-predicts-growth mechanism that the 2009 paper proposed should still be operating two decades later. On 200 countries with valid ECI and WDI GDPpc at both endpoints, the OLS coefficient on ECI2010 is +0.0079 with the log-GDPpc convergence control at -0.0119 and R² = 0.11. A one-σ rise in ECI is associated with a 0.79-pp higher annualised decadal growth rate, conditional on starting income.
The cross-section of Figure 1 is a snapshot. The HH (2009) framework also implies something about ranks over time: a country’s ECI rank should drift in line with its productive-knowledge accumulation, not its income. By cross-tabulating the ECI rank in 2000 against the ECI rank in 2022 (filtering to countries with at least USD 5 billion in 2022 exports to drop the noisy small-territory tail), we recover the “climbers” (sectoral upgraders that pulled themselves up the complexity ladder) and the “fallers” (typically commodity-exporters whose basket structure regressed as the resource intensification of the 2000s hardened their specialisation pattern). The biggest single climb on the BACI panel is BRN (rank 217 → 115, +102 positions); the biggest fall is AZE (rank 63 → 161, -98 positions).
source: Hidalgo and Hausmann (2009), PNAS, Figure 3E and pp. 10572-10574.
qualitative replication, no published table matched
Same: method-of-reflections construction of the complexity index from the binary Mcp matrix; cross-sectional association between complexity and log GDP per capita; the strong positive complexity-income link. Differs: 2022 cross-section vs the paper’s late-1990s baseline; BACI HS6 (201economies) vs the paper’s SITC-4 sample; WDI current-US$ GDPpc vs PPP GDP per capita in the original.
Our 2022 correlation of 0.76sits in the upper-correlation band that Hidalgo-Hausmann (2009) trace as the method of reflections converges (their Fig. 3E), even though the two estimates are not strictly comparable. Three things separate them: (i) the vintage (a late-1990s baseline vs a 2022 cross-section), (ii) BACI’s wider country coverage, which adds small economies with noisier RCA matrices and thus more measurement error in the index, and (iii) a different GDP measure (we use current-US$ WDI rather than the PPP GDP per capita in the original), which introduces a level-shift but leaves the correlation largely intact. The cross-section also picks up countries that have moved along the complexity ladder over the intervening decades: China’s complexity was near the bottom of the upper-middle group in the 1990s and is near the South Korean level in 2022, which densifies the middle of the scatter.
The qualitative claim, that complexity is a strong cross-sectional predictor of income, survives at comparable strength in 2022. This is the kind of long-run stability the paper anticipated.
@article{hidalgo_hausmann_2009,
author = {Hidalgo, C{\'e}sar A. and Hausmann, Ricardo},
title = {The Building Blocks of Economic Complexity},
journal = {Proceedings of the National Academy of Sciences},
volume = {106},
number = {26},
pages = {10570--10575},
year = {2009},
doi = {10.1073/pnas.0900943106}
}More on this method at /complexity and in the methods notes. Return to the replication gallery.
WITH eci22 AS (
SELECT c.iso3, AVG(e.eci) AS eci
FROM eci_rankings e JOIN countries c ON c.code = e.country_code
WHERE e.year = 2022 AND e.eci IS NOT NULL AND c.iso3 IS NOT NULL
GROUP BY c.iso3
),
gdp22 AS (
SELECT iso3, value AS gdppc FROM wdi_data
WHERE indicator = 'NY.GDP.PCAP.CD' AND year = 2022 AND value > 0
)
SELECT COUNT(*), corr(eci, LN(gdppc)),
regr_slope(LN(gdppc), eci), regr_intercept(LN(gdppc), eci)
FROM eci22 JOIN gdp22 USING(iso3);-- M̃ is dense; not materialised in DuckDB. The sparse edge list M_cp is read in-app: SELECT country_code, product_code FROM rca_matrix WHERE year = 2022 AND rca >= 1; -- Power iteration with deflation on the symmetric M̃ yields the top 10 eigenvalues. -- λ_1 is the trivial uniform direction; λ_2 is the complexity eigenvector -- (equivalent to the converged method of reflections; Mealy, Farmer & Teytelboym 2019).
WITH eci10 AS (
SELECT c.iso3, AVG(e.eci) AS eci FROM eci_rankings e
JOIN countries c ON c.code = e.country_code
WHERE e.year = 2010 AND e.eci IS NOT NULL GROUP BY c.iso3
),
gpc10 AS (SELECT iso3, value AS gdppc FROM wdi_data
WHERE indicator='NY.GDP.PCAP.CD' AND year=2010 AND value>0),
gpc20 AS (SELECT iso3, value AS gdppc FROM wdi_data
WHERE indicator='NY.GDP.PCAP.CD' AND year=2020 AND value>0)
SELECT e.iso3, e.eci, g10.gdppc,
(LN(g20.gdppc) - LN(g10.gdppc)) / 10 AS ann_growth
FROM eci10 e JOIN gpc10 g10 USING(iso3) JOIN gpc20 g20 USING(iso3);
-- OLS of ann_growth on ECI_2010 and LN(gdppc_2010) done in-app.WITH bigcountries AS (
SELECT c.iso3 FROM country_year_product cyp
JOIN countries c ON c.code = cyp.country_code
WHERE cyp.year = 2022 AND cyp.export_value > 0
GROUP BY c.iso3 HAVING SUM(cyp.export_value) >= 5000000
),
e2000 AS (SELECT c.iso3, e.eci_rank FROM eci_rankings e
JOIN countries c ON c.code = e.country_code WHERE e.year=2000),
e2022 AS (SELECT c.iso3, e.eci_rank FROM eci_rankings e
JOIN countries c ON c.code = e.country_code WHERE e.year=2022)
SELECT a.iso3, a.eci_rank AS r2000, b.eci_rank AS r2022,
a.eci_rank - b.eci_rank AS climb
FROM e2000 a JOIN e2022 b USING(iso3) JOIN bigcountries USING(iso3)
ORDER BY climb DESC;