Carbon Taxes and CO2 Emissions

A synthetic-control analysis of Sweden’s 1991 reform, in Python

−11.3%synthetic Sweden, CO2 per yr
tax vs price response
6donor countries

Carlos Mendez

Nagoya University (GSID)

June 11, 2026

The Tension

Act I

Sweden’s emissions rose 0.55 t/capita after the carbon tax — or did they?

In 1991 Sweden put one of the world’s first prices on carbon. A naive before/after says emissions went up 0.55 t per capita.

The economy also grew, the fleet changed, oil prices swung. Compared to what would have happened anyway?

The spoiler: Sweden flattens after 1990 while its synthetic twin keeps climbing

Sweden (actual) vs Synthetic Sweden, a weighted blend of donor countries. Lines overlap before 1990; they split after.

Where we’re going

  • Three estimators, escalating discipline: naive → DiD → synthetic control
  • Building Synthetic Sweden from a donor pool, then reading the gap
  • Three placebo tests: in-time, in-space, leave-one-out
  • Was it just a recession? A second synthetic control on GDP
  • Why consumers responded: tax vs price elasticities (OLS / IV)

The Investigation

Act II

The lab: 15 OECD economies, 46 years, 30 of them before the reform

  • Outcome — per-capita transport CO2 in metric tons, 1960–2005
  • Treated unit — Sweden; the carbon tax switches on in 1991
  • Donor pool — 14 other advanced economies, untreated
  • Window — 30 pre-treatment years to fit, 16 post-treatment to measure

The long pre-period is a structural advantage. It lets us check the counterfactual before the policy — where the gap should be zero.

The estimand is the ATT: how much lower were Swedish emissions than a no-reform Sweden?

\[\tau_t = Y^{\text{obs}}_{\text{Sweden},t} - \hat Y^{N}_{\text{Sweden},t}, \qquad \hat Y^{N}_{\text{Sweden},t}=\sum_{j=2}^{J+1} w_j\, Y_{jt}\]

We never observe \(\hat Y^{N}\) — Sweden without the tax. Synthetic control estimates it as a weighted blend of donors.

\(Y^{\text{obs}}\) is what happened; \(\hat Y^{N}\) is the counterfactual; the gap \(\tau_t\) is the treatment effect on the treated.

Synthetic control chooses the donor weights by data, under two hard constraints

\[w^* = \arg\min_{w}\ (X_1 - X_0 w)^\top V (X_1 - X_0 w) \quad \text{s.t.} \quad w_j \geq 0,\ \sum_j w_j = 1\]

\(X_1\) are Sweden’s pre-treatment predictors; \(X_0\) the donors’. The optimiser also picks \(V\) to minimise pre-period CO2 prediction error.

Non-negative weights that sum to one \(\Rightarrow\) the synthetic is a convex blend — no extrapolation, no parallel-trends assumption.

pysyncon picks the same six donors as Andersson’s R code

controls = [c for c in countries if c != "Sweden"]
dataprep = Dataprep(
    foo=panel, dependent="CO2_transport_capita",
    predictors=["GDP_per_capita", "vehicles_capita",
                "gas_cons_capita", "urban_pop"],
    treatment_identifier="Sweden", controls_identifier=controls,
    time_optimize_ssr=range(1960, 1990),
)
synth = Synth()
synth.fit(dataprep=dataprep, optim_method="Nelder-Mead")
print(synth.weights().sort_values(ascending=False).head(6))
# Denmark .29 · Belgium .27 · New Zealand .15 · Greece .11 · US .10 · Switzerland .08

Six donors carry 100% of the weight — Denmark and Belgium dominate

Donor weights for Synthetic Sweden. Six countries share all the weight; the other nine get essentially zero.

Pre-1990 the gap is near zero; post-1990 it widens monotonically to −0.36 t

Year-by-year gap, Sweden minus Synthetic Sweden. Flat before the reform; a widening wedge after.

The headline: −11.3% per year for 16 years

−11.3%

average annual gap, Synthetic Sweden, 1990–2005 (2005 gap −0.36 t/capita, −15%)

Falsification 1 — backdate the reform to 1980 and no fake gap appears

In-time placebo: fit as if the tax arrived in 1980. Sweden and its synthetic stay locked together.

Falsification 2 — Sweden’s gap beats 14 of 15 placebo countries, p = 0.067

In-space placebos: re-run the SCM pretending each donor was treated. Sweden (bold) sits outside the grey bundle.

Falsification 3 — drop any single donor and the effect stays in 8.8%–13%

Leave-one-out: Synthetic Sweden recomputed dropping each high-weight donor in turn. All firmly negative.

Was it just a recession? Synthetic GDP overlaps actual GDP within $233 by 2005

Sweden’s actual GDP vs a separately-built Synthetic Sweden (GDP). The paths overlap throughout the post-period.

Pass-through is complete: consumers paid 1.15 of every tax krona at the pump

\[\Delta p^*_t = \beta_0 + \beta_1\, \Delta \Theta_t + \beta_2\, \Delta T_t + \varepsilon_t, \qquad \hat\beta_2 = 1.15\ (\text{SE } 0.15)\]

The 95% CI is roughly \([0.85, 1.45]\) — it contains 1. We cannot reject full pass-through.

If oil firms had absorbed the tax, the price signal never reaches drivers. They didn’t — so the behavioural channel is real.

Consumers respond ~3× more strongly to a tax krona than to a price krona

Price semi-elasticity

  • \(\hat\beta_{\text{price}} = -0.060\)
  • +1 SEK/litre real price \(\Rightarrow\) −6% gasoline use
  • stable across OLS1–OLS4
  • IV (oil price): −0.064

Tax semi-elasticity

  • \(\hat\beta_{\text{tax}} = -0.186\)
  • +1 SEK/litre real tax \(\Rightarrow\) −18.6% gasoline use
  • stable across OLS1–OLS4
  • IV: pinned at −0.186

Salience + permanence: a tax is announced, debated, and persistent; a price drift is just a number on a billboard.

IV barely moves OLS — and that itself is informative

Price and tax semi-elasticities under OLS4 and three IV specifications. The tax coefficient is locked at −0.186.

The carbon tax alone explains ~75% of the 2005 reform wedge

Three counterfactual CO2 paths. The orange-to-blue gap is the carbon-tax-only contribution; orange-to-teal adds the VAT.

The Resolution

Act III

One sentence: the tax cut CO2 ~11% a year, at no measurable cost to growth

Quantity Value Reading
Synthetic gap, avg −11.3% CO2 cut ~a tenth, every year, 16 years
Permutation \(p\) 0.067 1 of 15 placebos is this extreme
Leave-one-out 8.8%–13% survives dropping any single donor
Tax vs price tax bites 3× harder per SEK
Synthetic GDP gap < $233/cap no detectable growth penalty

The strongest objection — and the answer

Objection. Sweden is one country, one observation. With 15 donors the smallest possible \(p\) is \(1/15 \approx 0.067\) — you hit the floor, not a clean rejection. And the analysis stops in 2005.

Response. All true, and stated plainly. But three independent falsifications point the same way, the GDP placebo rules out the recession story, and the demand-side mechanism is identified separately. The design under-claims by construction; the convergence of evidence is the argument, not any single \(p\).

A salient, persistent, fully passed-through carbon tax cut emissions — without cutting growth.