When variables interact — GDP growth affects unemployment which affects consumption — we need multivariate models. The Vector Autoregression (VAR) is the workhorse.
import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as np# Edinburgh paletteUOE_RED ='#7A2318'UOE_GOLD ='#B8860B'UOE_BLUE ='#2a78d6'UOE_GREY ='#52514e'COLOURS = [UOE_RED, UOE_BLUE, UOE_GOLD, '#2ca02c', '#9467bd', '#e377c2']mpl.rcParams.update({'figure.figsize': (10, 5),'axes.prop_cycle': mpl.cycler(color=COLOURS),'axes.spines.top': False, 'axes.spines.right': False,'axes.labelsize': 12, 'axes.titlesize': 14,'font.size': 11, 'legend.fontsize': 10,'lines.linewidth': 2,})print("Plotting style set ✓")
Plotting style set ✓
6.1 The VAR(p) Model
For a vector \(\mathbf{y}_t = (y_{1t}, y_{2t}, \dots, y_{nt})'\):
from statsmodels.tsa.api import VARimport pandas as pddf = pd.DataFrame(Y, columns=['GDP_growth', 'Inflation'])model = VAR(df)# Select lag orderprint("Lag order selection:")print(model.select_order(maxlags=8).summary())
Variable \(x\) Granger-causes \(y\) if past values of \(x\) help predict \(y\) beyond \(y\)’s own past.
from statsmodels.tsa.stattools import grangercausalitytestsprint("Does Inflation Granger-cause GDP growth?")gc1 = grangercausalitytests(df[['GDP_growth', 'Inflation']], maxlag=4, verbose=True)
Does Inflation Granger-cause GDP growth?
Granger Causality
number of lags (no zero) 1
ssr based F test: F=12.7761 , p=0.0004 , df_denom=296, df_num=1
ssr based chi2 test: chi2=12.9056 , p=0.0003 , df=1
likelihood ratio test: chi2=12.6348 , p=0.0004 , df=1
parameter F test: F=12.7761 , p=0.0004 , df_denom=296, df_num=1
Granger Causality
number of lags (no zero) 2
ssr based F test: F=5.9354 , p=0.0030 , df_denom=293, df_num=2
ssr based chi2 test: chi2=12.0733 , p=0.0024 , df=2
likelihood ratio test: chi2=11.8352 , p=0.0027 , df=2
parameter F test: F=5.9354 , p=0.0030 , df_denom=293, df_num=2
Granger Causality
number of lags (no zero) 3
ssr based F test: F=4.1228 , p=0.0069 , df_denom=290, df_num=3
ssr based chi2 test: chi2=12.6669 , p=0.0054 , df=3
likelihood ratio test: chi2=12.4042 , p=0.0061 , df=3
parameter F test: F=4.1228 , p=0.0069 , df_denom=290, df_num=3
Granger Causality
number of lags (no zero) 4
ssr based F test: F=3.1235 , p=0.0154 , df_denom=287, df_num=4
ssr based chi2 test: chi2=12.8858 , p=0.0118 , df=4
likelihood ratio test: chi2=12.6132 , p=0.0133 , df=4
parameter F test: F=3.1235 , p=0.0154 , df_denom=287, df_num=4
/usr/local/lib/python3.11/dist-packages/statsmodels/tsa/stattools.py:1556: FutureWarning: verbose is deprecated since functions should not print results
warnings.warn(