Regional Inequality and the Kuznets Curve

Panel fixed effects in Python finds an N-shape, not an inverted-U

0.142within-R² · cubic two-way FE
$2,287first turning point · inequality peaks
0.071ethnic Gini · strongest driver

Carlos Mendez

Nagoya University (GSID)

June 11, 2026

The Tension

Act I

Does growth cut inequality, or just move it around? Kuznets predicted an inverted-U

In 1955 Simon Kuznets argued that inequality rises as countries industrialize, then falls as growth diffuses — an inverted-U in income.

With satellite-lights data on 180 countries, does the inverted-U still hold — or is there a third act?

Pooled across 180 countries, the cloud bends twice — an N, not a single hump

Regional Gini vs log GDP per capita, 880 country-period points. Linear (gray) misses the curvature; the quadratic inverted-U (teal) misses the high-income upturn; the cubic N-shape (orange) tracks the cloud.

Where we’re going

  • The panel: 180 countries × 5 periods, a Gini built from nighttime lights
  • Why a cubic polynomial — and why pooled OLS can’t be trusted
  • Two-way fixed effects: comparing each country to itself
  • Turning points, then the determinants beyond income

The Investigation

Act II

The lab: 180 countries × 5 periods, 880 rows, a lights-based regional Gini

  • Outcome — a population-weighted regional Gini per country-period, \(0\) (equal regions) to \(1\) (all income in one region), built from satellite nighttime lights
  • Regressor — log GDP per capita, spanning \(\$190\) to \(\$117{,}000\)
  • Structure — an unbalanced panel, 168 countries in period 1 growing to 180 by period 5

Periods are 5-year averages from 1990–1994 through 2010–2013; mean Gini \(= 0.064\), SD \(= 0.033\).

To bend twice, the model needs a cubic in log income

\[\text{Gini}_i = \beta_0 + \beta_1 \ln Y_i + \beta_2 (\ln Y_i)^2 + \beta_3 (\ln Y_i)^3 + \varepsilon_i\]

\(\beta_2\) lets the curve bend once (an inverted-U if negative); \(\beta_3\) lets it bend a second time (an N if positive). A linear term alone forces monotonicity.

Pooled OLS sees the N-shape, but only barely — every term is near-insignificant

Specification \(\beta_1\) \(\beta_2\) \(\beta_3\) \(R^2\)
Linear \(-0.011\) \(0.164\)
Quadratic \(0.015\) \(-0.002\) \(0.170\)
Cubic \(0.241\) \(-0.028\) \(0.001\) \(0.176\)

Cubic terms are only marginally significant (\(p \approx 0.07\)\(0.09\)), and \(R^2\) barely moves across the ladder.

Each country walks its own path — the pooled curve is a mirage

Twenty country trajectories over time (faint) with six highlighted: Liberia, Kenya, Rep. Congo, Algeria, Bahamas, Qatar. Within-country paths look nothing like the pooled cubic.

Fixed effects compare a country to itself: wipe the lens twice

\[\text{Gini}_{it} = \beta_1 \ln Y_{it} + \beta_2 (\ln Y_{it})^2 + \beta_3 (\ln Y_{it})^3 + \alpha_i + \gamma_t + \varepsilon_{it}\]

\(\alpha_i\) — country effects

  • absorb 180 country intercepts
  • remove geography, institutions, history

\(\gamma_t\) — period effects

  • absorb 5 period shocks
  • remove global recessions, commodity swings

What’s left is the within estimator: how each country’s inequality moves as it develops, net of fixed traits and global shocks.

Two-way FE in PyFixest is a one-line formula

import pyfixest as pf

# 'gini ~ <polynomial> | id + year' — the pipe absorbs country + year FE
fe_cubic = pf.feols("gini ~ log_GDPpc + log_GDPpc2 + log_GDPpc3 | id + year",
                    data=df3, vcov={"CRV1": "id"})   # country-clustered SEs

With both FE imposed, all three cubic terms turn highly significant

0.293 · −0.032 · 0.001

\(\hat\beta_1,\ \hat\beta_2,\ \hat\beta_3\) — cubic two-way FE, every term \(p < 0.001\); within-\(R^2 = 0.142\)

The honest fit is the within-R², and it climbs from 0.009 to 0.142 from linear to cubic

Two-way FE model \(\hat\beta_1\) \(p\) within-\(R^2\)
Linear \(-0.003\) \(0.265\) \(0.009\)
Cubic \(0.293\) \(<0.001\) \(0.142\)

A researcher who fit only the linear FE model would conclude development has no effect — a false negative born of forcing a straight line through an N.

Fixed effects don’t just sharpen the N — they tighten it

Cubic polynomial coefficients, pooled OLS vs two-way FE, with 95% CIs. FE estimates are larger in magnitude and visibly more precise.

The Resolution

Act III

The fitted curve bends twice — peaking at $2,287, troughing at $77,205

Fitted N-shaped curve from the cubic two-way FE model. Orange regions rise, the blue middle falls; turning points annotated on a dual log/USD axis.

Three development phases, one association — not a causal effect

  • Below $2,287 — early development concentrates activity; inequality rises
  • $2,287 to $77,205 — most of the world; lagging regions catch up, inequality falls
  • Above $77,205 — knowledge-economy agglomeration re-concentrates; inequality rises again

Fixed effects strip time-invariant confounders, but the relationship is descriptive: read it as conditional association, not a policy lever.

Beyond income, ethnic inequality is the strongest driver — by far

0.071

ethnic-Gini coefficient (\(p < 0.001\)) · 3.9× the next-largest positive effect · vs a mean regional Gini of 0.064

Ranked side by side: ethnicity towers, land and schooling pull the other way

Determinant coefficients ranked by magnitude. Orange = raises inequality, blue = lowers it; faded bars are insignificant (\(p \geq 0.10\)). Ethnic Gini dwarfs the rest.

The N survives every control set — its sign pattern never breaks

Linear, quadratic, and cubic coefficients across all six specifications with 95% CIs. The (+, −, +) sign pattern holds throughout; magnitudes attenuate under ethnicity.

Does machine-assembled FE make this causal? No

Objection. You absorbed 180 country effects and 5 period effects — surely that identifies the development effect on inequality?

Response. No. Two-way FE removes only time-invariant country confounders and global shocks. Time-varying confounders — and reverse causality from inequality to growth — remain. The estimand is a within-country association, conditional on the polynomial and the FE; not an ATE.

Force a straight line through an N and you’ll conclude growth does nothing — fit the cubic, fix the effects.