Cambio estructural y raíces unitarias: fecha desconocida
Contents
import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
pd.options.plotting.backend = "plotly"
5.3. Cambio estructural y raíces unitarias: fecha desconocida#
¿Cómo saber cuándo se produjo un cambio estructural?#
Un supuesto importante en la prueba de \textcite{Perron1989} es que el analista conoce la fecha en que se produjo el (único) cambio estructural. No obstante, esto no siempre es factible.
\textcite{Zivot1992} proponen una prueba de raíz unitaria similar a la de Perron, pero que asume que el momento del cambio estructural es desconocido.
Las pruebas de cambio estructural de Zivot y Andrews#
¿Hay raíces unitarias en presencia de un cambio estructural en \(t=\tau\)?
Para implementar la prueba de Zivot y Andrews se siguen estos pasos:
Paso 1: Se estima la regresión correspondiente al modelo
donde los términos \(D_t^L\) y \(D_t^T\) dependen de la proporción de datos \(\lambda\) anteriores al cambio estructural:
Paso 2: Se calcula el estadístico \(t\) de la hipótesis \(a_1=1\):
Observemos que el valor estimado \(\hat{\alpha}\) dependerá de \(\lambda\); por ello, escribimos \(t_{\alpha_1}(\lambda)\)
Paso 3: Se define el punte de quiebre \(\hat{\lambda}\) como aquel valor \(\lambda\) que hace más plausible la hipótesis alternativa
Se compara el valor mínimo \(t_{\alpha_1}(\hat\lambda)\) con el valor crítico de Zivot y Andrews. Si el estadístico estimado es menor que el valor crítico, se rechaza la hipótesis nula.
Valores críticos de Zivot y Andrews
Modelo |
1% |
5% |
10% |
---|---|---|---|
A |
-5.34 |
-4.80 |
-4.58 |
B |
-4.93 |
-4.42 |
-4.11 |
C |
-5.57 |
-5.08 |
-4.82 |
Fuente: \textcite{Zivot1992}
\textcite{Zivot1992} también analizan los datos de Nelson y Plosser. Al estimar el modelo A encuentran
\input{labs/zivot-andrews-nelson-plosser.tex}
Recordemos los valores críticos del modelo A Valores críticos de Zivot y Andrews
Modelo |
1% |
5% |
10% |
---|---|---|---|
A |
-5.34 |
-4.80 |
-4.58 |
A continuación vemos cómo replicar los resultados del modelo A de Zivot y Andrews, escribiendo un programa de Python.
NP = pd.read_stata('https://github.com/randall-romero/econometria/raw/master/data/NelsonPlosserData.dta', index_col='year')
NP.index = NP.index.year
def ZivotAndrewsA(serie, k=8):
dta = NP[[serie]].dropna()
dta.rename(columns={serie:'y'}, inplace=True)
dta['t'] = np.arange(dta.shape[0])
dta['Ly'] = dta['y'].shift(1)
dta['Dy'] = dta['y'].diff(1)
for j in range(1, k+1):
dta[f'D{j}y'] = dta['Dy'].shift(j)
lags = '+'.join(dta.columns[-k:])
alpha1values = pd.Series(0.0, index=dta.index[12:-12])
for tau in alpha1values.index:
dta['DL'] = (dta.index>tau).astype(int)
modelo = ols('y ~ Ly + t + DL + ' + lags, dta).fit()
alpha1values[tau] = ((modelo.params - 1)/modelo.bse)['Ly']
tauhat, tval = alpha1values.idxmin(), alpha1values.min()
dta['DL'] = (dta.index>tauhat).astype(int)
modelo = ols('y ~ Ly + t + DL + ' + lags, dta).fit()
return {r'$\hat{T}_B$':tauhat, r'$\alpha_1$': np.round(modelo.params['Ly'],3), r'$t$': np.round(tval,2)}
seriesA = ['lrgnp', 'lgnp', 'lpcrgnp', 'lip', 'lemp', 'lprgnp', 'lcpi', 'lwg', 'lm']
lags = [8,8,7,8,7,5,2,7,6]
variables = {'lrgnp':'Real GNP',
'lgnp':'Nominal GNP',
'lpcrgnp':'Real per capita GNP',
'lip':'Industrial production',
'lemp':'Employment',
'lun':'Unemployment rate',
'lprgnp':'GNP deflator',
'lcpi':'Consumer prices',
'lwg':'Wages',
'lrwg':'Real wages',
'lm':'Money stock',
'lvel':'Velocity',
'bnd':'Bond yield',
'lsp500':'Common stock prices'}
temp = pd.DataFrame([ZivotAndrewsA(ser, k) for ser, k in zip(seriesA, lags)], index=seriesA)
temp.rename(index=variables)
$\hat{T}_B$ | $\alpha_1$ | $t$ | |
---|---|---|---|
Real GNP | 1929 | 0.267 | -5.58 |
Nominal GNP | 1929 | 0.532 | -5.82 |
Real per capita GNP | 1929 | 0.494 | -4.61 |
Industrial production | 1929 | 0.290 | -5.95 |
Employment | 1929 | 0.651 | -4.95 |
GNP deflator | 1929 | 0.786 | -4.12 |
Consumer prices | 1873 | 0.941 | -2.76 |
Wages | 1929 | 0.660 | -5.30 |
Money stock | 1929 | 0.823 | -4.34 |