La prueba de Chow
Contents
import numpy as np
import pandas as pd
pd.options.plotting.backend = "plotly"
from statsmodels.formula.api import ols
import pandas_datareader as pdr
import plotly.express as px
5.1. La prueba de Chow#
Determinando si hay un cambio estructural#
Recordemos que podemos expresar una regresión lineal como
Cuando apilamos todas \(T\) las observaciones
La regresión \(Y=X\beta+\epsilon\) asume que el vector de coeficientes \(\beta\) es el mismo para toda la muestra.
Supongamos que pensamos que durante el período conocido hubo un cambio estructural en la economía, por lo que el vector de parámetros fue \(\beta_0\) antes del cambio pero \(\beta_{1}\) después. Entonces:
Por lo que el estimador de mínimos cuadrados ordinarios
Esto nos dice que los parámetros \(\beta_{1}\) y \(\beta_2\) pueden estimarse por MCO separadamente.
Planteamos la hipótesis nula de que no hay cambio estructural: \(\beta_{1}=\beta_2\). Entonces
Esto corresponde a la regresión con todas las observaciones.
La hipótesis \(\beta_{1}=\beta_2\) puede comprobarse con un test de Wald.
La prueba de Chow#
Sea \(S\) la suma de los cuadrados de los residuos de la regresión restringida, y \(S_i\) la suma de los cuadrados de los residuos de la regresión de la muestra \(i\).
\TEST{Prueba de cambio estructural de Chow}{¿Son los coeficientes \(\beta_1\) y \(\beta_2\) distintos?}{\(\beta_{1} = \beta_2\)}{\(\frac{\frac{S - S_1 - S_2}{k}}{\frac{S_1+S_2}{T-2k}} \sim F(k, T-2k)\)}{Si el estadístico es grande (mayor que el valor crítico), los modelos son distintos, por lo que sí hay cambio estructural.}
#FIXME: ARREGLAR ESTO
oil = pdr.get_data_fred('WTISPLC', start=1946)
fig = oil.plot()
fig.update_layout(
title="Spot Crude Oil Price: West Texas Intermediate (WTI)",
xaxis_title=" ",
yaxis_title="dólares por barril",
showlegend=False
)
vrect_options = dict(
annotation_position="top left",
fillcolor="green",
opacity=0.25,
annotation_textangle=-90,
line_width=0
)
fig.add_vrect(x0="1973-10-01", x1="1974-03-30",
annotation_text="embargo 1973", **vrect_options)
fig.add_vrect(x0="1979-01-01", x1="1980-06-30",
annotation_text="crisis petrolera 1979", **vrect_options)
fig.add_vrect(x0="2008-01-01", x1="2010-01-01",
annotation_text="Crisis Financiera", **vrect_options)
Fuente de datos: https://fred.stlouisfed.org/series/WTISPLC
\textcite{Greene:2012} estima el modelo el consumo per capita de combustible \(G\)
(todas las variables en logaritmo, excepto \(t\)) y comprueba si hay un cambio estructural en 1974.
greene_file = 'http://www.stern.nyu.edu/~wgreene/Text/Edition7/TableF2-2.csv'
gasdata = pd.read_csv(greene_file, parse_dates=True, index_col=0)
gasdata.eval('G = GASEXP/GASP', inplace=True)
gasdata.eval('GPC = 1e6*G/POP', inplace=True)
gasdata['t'] = np.exp(gasdata.index.year - 1952)
series = {
'GASEXP' : 'Total U.S. gasoline expenditure',
'GASP' : 'precio combustible',
'INCOME' : 'ingreso per capita',
'PNC' : 'precio carro nuevo',
'PUC' : 'precio carro nuevo',
'POP' : 'U.S. total population in thousands',
'GPC' : 'Consumo per capita',
'Intercept' : 'intercepto',
't' : 'tendencia'
}
params = pd.DataFrame()
signif = pd.DataFrame()
stats = pd.DataFrame(index=['S', '$R^2$', 'T', 'k'])
samples = {'1953-2004': slice('1953','2004'),
'1953-1973': slice('1953','1973'),
'1974-2004': slice('1974','2004')}
for periodo, ss in samples.items():
mm = ols('GPC ~ INCOME + GASP + PNC + PUC + t', np.log(gasdata)[ss]).fit()
params[periodo] = mm.params
signif[periodo] = ['✓' if p < 0.05 else '' for p in mm.pvalues]
stats[periodo] = [mm.ssr, mm.rsquared, mm.nobs, mm.params.shape[0]]
params.rename(index=series)
signif.index = params.index
pd.concat([params.round(4), signif], keys=['coef ', 'p<0.05']).unstack(0)
1953-2004 | 1953-1973 | 1974-2004 | ||||
---|---|---|---|---|---|---|
coef | p<0.05 | coef | p<0.05 | coef | p<0.05 | |
Intercept | -12.8632 | ✓ | -8.3492 | ✓ | -1.5128 | |
INCOME | 1.625 | ✓ | 0.8482 | ✓ | 0.3739 | ✓ |
GASP | -0.0539 | -0.0323 | -0.124 | ✓ | ||
PNC | -0.0834 | 0.6988 | ✓ | -0.0011 | ||
PUC | -0.0847 | -0.2905 | ✓ | -0.0217 | ||
t | -0.0139 | ✓ | 0.0101 | ✓ | 0.0045 |
stats
1953-2004 | 1953-1973 | 1974-2004 | |
---|---|---|---|
S | 0.101997 | 0.002022 | 0.007128 |
$R^2$ | 0.964932 | 0.997473 | 0.952890 |
T | 52.000000 | 21.000000 | 31.000000 |
k | 6.000000 | 6.000000 | 6.000000 |
gasdata['PERIODO'] = ''
gasdata.loc['1953':'1973', 'PERIODO'] = '1953-1973'
gasdata.loc['1974':'2004', 'PERIODO'] = '1974-2004'
fig = px.scatter(gasdata, x="GPC", y="GASP", color="PERIODO", trendline="ols")
fig.update_layout(
title="Cambio estructural, test de Chow",
xaxis_title="Consumo per capita",
yaxis_title="ndice de precio"
)
La prueba de Chow confirma que hay un cambio estructural en 1974: los parámetros de 1953-1973 son significativamente distintos a los de 1974-2004.
Limitaciones de la prueba de Chow#
La prueba de Chow tiene algunas limitaciones importantes
Asume que el analista sabe la fecha en que ocurre el cambio estructural
Asume que la varianza de los errores es la misma antes y después del cambio estructural.