{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# The effects of Brexit\n", "\n", "The aim of this notebook is to estimate the causal impact of Brexit upon the UK's GDP. This will be done using the {term}`synthetic control` approach. As such, it is similar to the policy brief \"What can we know about the cost of Brexit so far?\" {cite:p}`brexit2022policybrief` from the Center for European Reform. That approach did not use Bayesian estimation methods however.\n", "\n", "I did not use the GDP data from the above report however as it had been scaled in some way that was hard for me to understand how it related to the absolute GDP figures. Instead, GDP data was obtained courtesy of Prof. Dooruj Rambaccussing. Raw data is in units of trillions of USD." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import arviz as az\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "from pymc_extras.prior import Prior\n", "\n", "import causalpy as cp" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "%config InlineBackend.figure_format = 'retina'\n", "seed = 42" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Load data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | Australia | \n", "Austria | \n", "Belgium | \n", "Canada | \n", "Denmark | \n", "Finland | \n", "France | \n", "Germany | \n", "Iceland | \n", "Luxemburg | \n", "Netherlands | \n", "New_Zealand | \n", "Norway | \n", "Sweden | \n", "Switzerland | \n", "UK | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Time | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| 2009-01-01 | \n", "3.84048 | \n", "0.802836 | \n", "0.94117 | \n", "16.93824 | \n", "4.50096 | \n", "0.51052 | \n", "5.05450 | \n", "6.63471 | \n", "5.18157 | \n", "0.114836 | \n", "1.634391 | \n", "0.47336 | \n", "7.78753 | \n", "10.32220 | \n", "1.476532 | \n", "4.61881 | \n", "
| 2009-04-01 | \n", "3.86954 | \n", "0.796545 | \n", "0.94162 | \n", "16.75340 | \n", "4.41372 | \n", "0.50829 | \n", "5.05375 | \n", "6.64530 | \n", "5.16171 | \n", "0.116259 | \n", "1.634432 | \n", "0.47916 | \n", "7.71903 | \n", "10.32867 | \n", "1.485509 | \n", "4.60431 | \n", "
| 2009-07-01 | \n", "3.88115 | \n", "0.799937 | \n", "0.95352 | \n", "16.82878 | \n", "4.42898 | \n", "0.51299 | \n", "5.06237 | \n", "6.68237 | \n", "5.24132 | \n", "0.118747 | \n", "1.640982 | \n", "0.48188 | \n", "7.72400 | \n", "10.32328 | \n", "1.502506 | \n", "4.60722 | \n", "
| 2009-10-01 | \n", "3.91028 | \n", "0.803823 | \n", "0.96117 | \n", "17.02503 | \n", "4.43300 | \n", "0.50903 | \n", "5.09832 | \n", "6.73155 | \n", "5.22482 | \n", "0.119302 | \n", "1.650866 | \n", "0.48805 | \n", "7.72812 | \n", "10.37107 | \n", "1.515139 | \n", "4.62152 | \n", "
| 2010-01-01 | \n", "3.92716 | \n", "0.800510 | \n", "0.96615 | \n", "17.23041 | \n", "4.47128 | \n", "0.51413 | \n", "5.11625 | \n", "6.78621 | \n", "4.91128 | \n", "0.121414 | \n", "1.647748 | \n", "0.49349 | \n", "7.87891 | \n", "10.64833 | \n", "1.525864 | \n", "4.65380 | \n", "
<xarray.Dataset> Size: 1MB\n",
"Dimensions: (chain: 4, draw: 1000, treated_units: 1, coeffs: 15,\n",
" obs_ind: 30)\n",
"Coordinates:\n",
" * chain (chain) int64 32B 0 1 2 3\n",
" * draw (draw) int64 8kB 0 1 2 3 4 5 6 ... 994 995 996 997 998 999\n",
" * treated_units (treated_units) <U2 8B 'UK'\n",
" * coeffs (coeffs) <U11 660B 'Australia' 'Austria' ... 'Switzerland'\n",
" * obs_ind (obs_ind) int64 240B 0 1 2 3 4 5 6 7 ... 23 24 25 26 27 28 29\n",
"Data variables:\n",
" beta (chain, draw, treated_units, coeffs) float64 480kB 0.2496 ...\n",
" y_hat_sigma (chain, draw, treated_units) float64 32kB 0.02687 ... 0.03445\n",
" mu (chain, draw, obs_ind, treated_units) float64 960kB 4.608 ...\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:28.926299+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0\n",
" sampling_time: 69.69903612136841\n",
" tuning_steps: 1000<xarray.Dataset> Size: 968kB\n",
"Dimensions: (chain: 4, draw: 1000, obs_ind: 30, treated_units: 1)\n",
"Coordinates:\n",
" * chain (chain) int64 32B 0 1 2 3\n",
" * draw (draw) int64 8kB 0 1 2 3 4 5 6 ... 994 995 996 997 998 999\n",
" * obs_ind (obs_ind) int64 240B 0 1 2 3 4 5 6 7 ... 23 24 25 26 27 28 29\n",
" * treated_units (treated_units) <U2 8B 'UK'\n",
"Data variables:\n",
" y_hat (chain, draw, obs_ind, treated_units) float64 960kB 4.62 ....\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:29.143734+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0<xarray.Dataset> Size: 496kB\n",
"Dimensions: (chain: 4, draw: 1000)\n",
"Coordinates:\n",
" * chain (chain) int64 32B 0 1 2 3\n",
" * draw (draw) int64 8kB 0 1 2 3 4 5 ... 995 996 997 998 999\n",
"Data variables: (12/17)\n",
" acceptance_rate (chain, draw) float64 32kB 0.9909 0.9988 ... 0.9941\n",
" step_size_bar (chain, draw) float64 32kB 0.001979 ... 0.001812\n",
" step_size (chain, draw) float64 32kB 0.00164 ... 0.002034\n",
" energy_error (chain, draw) float64 32kB 0.02131 ... -0.08462\n",
" n_steps (chain, draw) float64 32kB 1.023e+03 ... 1.023e+03\n",
" process_time_diff (chain, draw) float64 32kB 0.03708 ... 0.03781\n",
" ... ...\n",
" perf_counter_diff (chain, draw) float64 32kB 0.03715 ... 0.03786\n",
" diverging (chain, draw) bool 4kB False False ... False False\n",
" largest_eigval (chain, draw) float64 32kB nan nan nan ... nan nan\n",
" energy (chain, draw) float64 32kB -28.81 -25.42 ... -31.29\n",
" reached_max_treedepth (chain, draw) bool 4kB True True True ... True False\n",
" lp (chain, draw) float64 32kB 32.78 39.79 ... 35.35\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:28.932843+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0\n",
" sampling_time: 69.69903612136841\n",
" tuning_steps: 1000<xarray.Dataset> Size: 189kB\n",
"Dimensions: (chain: 1, draw: 500, treated_units: 1, coeffs: 15,\n",
" obs_ind: 30)\n",
"Coordinates:\n",
" * chain (chain) int64 8B 0\n",
" * draw (draw) int64 4kB 0 1 2 3 4 5 6 ... 494 495 496 497 498 499\n",
" * treated_units (treated_units) <U2 8B 'UK'\n",
" * coeffs (coeffs) <U11 660B 'Australia' 'Austria' ... 'Switzerland'\n",
" * obs_ind (obs_ind) int64 240B 0 1 2 3 4 5 6 7 ... 23 24 25 26 27 28 29\n",
"Data variables:\n",
" y_hat_sigma (chain, draw, treated_units) float64 4kB 0.4183 ... 0.9914\n",
" beta (chain, draw, treated_units, coeffs) float64 60kB 0.01287 ...\n",
" mu (chain, draw, obs_ind, treated_units) float64 120kB 5.228 ...\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:29.063859+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0<xarray.Dataset> Size: 124kB\n",
"Dimensions: (chain: 1, draw: 500, obs_ind: 30, treated_units: 1)\n",
"Coordinates:\n",
" * chain (chain) int64 8B 0\n",
" * draw (draw) int64 4kB 0 1 2 3 4 5 6 ... 494 495 496 497 498 499\n",
" * obs_ind (obs_ind) int64 240B 0 1 2 3 4 5 6 7 ... 23 24 25 26 27 28 29\n",
" * treated_units (treated_units) <U2 8B 'UK'\n",
"Data variables:\n",
" y_hat (chain, draw, obs_ind, treated_units) float64 120kB 5.753 ...\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:29.065707+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0<xarray.Dataset> Size: 488B\n",
"Dimensions: (obs_ind: 30, treated_units: 1)\n",
"Coordinates:\n",
" * obs_ind (obs_ind) int64 240B 0 1 2 3 4 5 6 7 ... 23 24 25 26 27 28 29\n",
" * treated_units (treated_units) <U2 8B 'UK'\n",
"Data variables:\n",
" y_hat (obs_ind, treated_units) float64 240B 4.619 4.604 ... 5.327\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:28.935117+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0<xarray.Dataset> Size: 4kB\n",
"Dimensions: (obs_ind: 30, coeffs: 15)\n",
"Coordinates:\n",
" * obs_ind (obs_ind) int64 240B 0 1 2 3 4 5 6 7 8 ... 22 23 24 25 26 27 28 29\n",
" * coeffs (coeffs) <U11 660B 'Australia' 'Austria' ... 'Sweden' 'Switzerland'\n",
"Data variables:\n",
" X (obs_ind, coeffs) float64 4kB 3.84 0.8028 0.9412 ... 12.37 1.719\n",
"Attributes:\n",
" created_at: 2025-11-14T11:13:28.936057+00:00\n",
" arviz_version: 0.21.0\n",
" inference_library: pymc\n",
" inference_library_version: 5.23.0| \n", " | mean | \n", "sd | \n", "hdi_3% | \n", "hdi_97% | \n", "mcse_mean | \n", "mcse_sd | \n", "ess_bulk | \n", "ess_tail | \n", "r_hat | \n", "
|---|---|---|---|---|---|---|---|---|---|
| beta[UK, Australia] | \n", "0.121 | \n", "0.074 | \n", "0.001 | \n", "0.243 | \n", "0.003 | \n", "0.001 | \n", "607.0 | \n", "656.0 | \n", "1.00 | \n", "
| beta[UK, Austria] | \n", "0.046 | \n", "0.042 | \n", "0.000 | \n", "0.123 | \n", "0.001 | \n", "0.001 | \n", "808.0 | \n", "703.0 | \n", "1.01 | \n", "
| beta[UK, Belgium] | \n", "0.052 | \n", "0.048 | \n", "0.000 | \n", "0.140 | \n", "0.001 | \n", "0.001 | \n", "784.0 | \n", "618.0 | \n", "1.00 | \n", "
| beta[UK, Canada] | \n", "0.038 | \n", "0.023 | \n", "0.000 | \n", "0.077 | \n", "0.001 | \n", "0.000 | \n", "472.0 | \n", "476.0 | \n", "1.01 | \n", "
| beta[UK, Denmark] | \n", "0.085 | \n", "0.065 | \n", "0.000 | \n", "0.200 | \n", "0.002 | \n", "0.001 | \n", "581.0 | \n", "573.0 | \n", "1.00 | \n", "
| beta[UK, Finland] | \n", "0.041 | \n", "0.039 | \n", "0.000 | \n", "0.113 | \n", "0.001 | \n", "0.001 | \n", "873.0 | \n", "935.0 | \n", "1.00 | \n", "
| beta[UK, France] | \n", "0.031 | \n", "0.028 | \n", "0.000 | \n", "0.084 | \n", "0.001 | \n", "0.001 | \n", "749.0 | \n", "728.0 | \n", "1.00 | \n", "
| beta[UK, Germany] | \n", "0.026 | \n", "0.025 | \n", "0.000 | \n", "0.072 | \n", "0.001 | \n", "0.001 | \n", "680.0 | \n", "897.0 | \n", "1.00 | \n", "
| beta[UK, Iceland] | \n", "0.154 | \n", "0.041 | \n", "0.075 | \n", "0.230 | \n", "0.001 | \n", "0.001 | \n", "844.0 | \n", "943.0 | \n", "1.00 | \n", "
| beta[UK, Luxemburg] | \n", "0.049 | \n", "0.045 | \n", "0.000 | \n", "0.134 | \n", "0.001 | \n", "0.001 | \n", "738.0 | \n", "553.0 | \n", "1.00 | \n", "
| beta[UK, Netherlands] | \n", "0.048 | \n", "0.043 | \n", "0.000 | \n", "0.126 | \n", "0.001 | \n", "0.001 | \n", "996.0 | \n", "995.0 | \n", "1.00 | \n", "
| beta[UK, New_Zealand] | \n", "0.062 | \n", "0.055 | \n", "0.000 | \n", "0.164 | \n", "0.002 | \n", "0.001 | \n", "627.0 | \n", "605.0 | \n", "1.00 | \n", "
| beta[UK, Norway] | \n", "0.082 | \n", "0.045 | \n", "0.000 | \n", "0.156 | \n", "0.002 | \n", "0.001 | \n", "621.0 | \n", "568.0 | \n", "1.01 | \n", "
| beta[UK, Sweden] | \n", "0.100 | \n", "0.031 | \n", "0.043 | \n", "0.160 | \n", "0.001 | \n", "0.001 | \n", "837.0 | \n", "719.0 | \n", "1.01 | \n", "
| beta[UK, Switzerland] | \n", "0.065 | \n", "0.057 | \n", "0.000 | \n", "0.172 | \n", "0.001 | \n", "0.001 | \n", "3963.0 | \n", "2199.0 | \n", "1.00 | \n", "
| y_hat_sigma[UK] | \n", "0.031 | \n", "0.005 | \n", "0.023 | \n", "0.040 | \n", "0.000 | \n", "0.000 | \n", "1036.0 | \n", "1488.0 | \n", "1.00 | \n", "
| \n", " | mean | \n", "median | \n", "hdi_lower | \n", "hdi_upper | \n", "p_gt_0 | \n", "relative_mean | \n", "relative_hdi_lower | \n", "relative_hdi_upper | \n", "
|---|---|---|---|---|---|---|---|---|
| average | \n", "-0.178323 | \n", "-0.179121 | \n", "-0.227586 | \n", "-0.127143 | \n", "0.0 | \n", "-3.164222 | \n", "-4.005843 | \n", "-2.278178 | \n", "
| cumulative | \n", "-4.101438 | \n", "-4.119792 | \n", "-5.234484 | \n", "-2.924293 | \n", "0.0 | \n", "-3.164222 | \n", "-4.005843 | \n", "-2.278178 | \n", "
| \n", " | mean | \n", "median | \n", "hdi_lower | \n", "hdi_upper | \n", "p_gt_0 | \n", "relative_mean | \n", "relative_hdi_lower | \n", "relative_hdi_upper | \n", "
|---|---|---|---|---|---|---|---|---|
| average | \n", "-0.021407 | \n", "-0.021822 | \n", "-0.064357 | \n", "0.021860 | \n", "0.1635 | \n", "-0.393064 | \n", "-1.17724 | \n", "0.406281 | \n", "
| cumulative | \n", "-0.085627 | \n", "-0.087289 | \n", "-0.257429 | \n", "0.087441 | \n", "0.1635 | \n", "-0.393064 | \n", "-1.17724 | \n", "0.406281 | \n", "