Series de tiempo - Detección de raíz unitaria

Librerías utilizadas

library(readxl)
library(urca)
library(astsa)
library(tidyverse)
library(dplyr)
library(kableExtra)

Lectura de los datos de series de tiempo

df_series <- read_excel("break.xls")
kable(head(df_series, 10))
EPSILON Y1 Y2
0.3202 0.320200 0.3202
-0.4327 -0.272600 -0.1125
-0.2150 -0.351300 -0.3275
-0.0699 -0.245550 -0.3974
0.0582 -0.064580 -0.3392
-0.4621 -0.494390 -0.8013
-0.5400 -0.787190 -1.3413
0.1623 -0.231300 -1.1790
0.3619 0.246252 -0.8171
0.3505 0.473626 -0.4666

Visualizaciones de las series

par(mfrow=c(1,2))
plot(df_series$Y1,type="l",las=1,xaxs="i",xlab="Y1",ylab="Epsilon",tck=0.02,col="steelblue4", main= "Variable Y1")
plot(df_series$Y2,type="l",las=1,xaxs="i",xlab="Y2",ylab="Epsilon",tck=0.02,col="steelblue4", main= "Variable Y2")

La tendencia que observamos sugiere que la serie no es estacionaria

Análisis de las funciones de autocorrelación parcial

Para este análisis solo se procederá a interpretar la serie \(Y_2\)

acf2(df_series$Y1[1:50])

##      [,1]  [,2] [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
## ACF  0.48  0.12 0.12  0.07 -0.15 -0.23 -0.24 -0.26 -0.15 -0.01
## PACF 0.48 -0.15 0.17 -0.06 -0.21 -0.07 -0.16 -0.09  0.07  0.04
acf2(df_series$Y1[51:100])

##      [,1] [,2]  [,3]  [,4]  [,5]  [,6] [,7] [,8] [,9] [,10]
## ACF  0.46 0.27  0.04 -0.02 -0.07 -0.09 0.01 0.07 0.18  0.05
## PACF 0.46 0.07 -0.14 -0.01 -0.04 -0.05 0.11 0.05 0.13 -0.13
acf2(df_series$Y1)

##      [,1]  [,2] [,3] [,4]  [,5]  [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## ACF  0.94  0.88 0.84 0.81  0.77  0.72 0.69 0.66 0.65  0.62  0.57  0.53  0.51
## PACF 0.94 -0.09 0.17 0.06 -0.06 -0.04 0.02 0.07 0.11 -0.13 -0.14  0.01  0.09
##      [,14] [,15] [,16] [,17] [,18] [,19] [,20]
## ACF   0.48  0.46  0.44  0.43  0.40  0.36  0.31
## PACF -0.04  0.06  0.06  0.01 -0.14 -0.20 -0.07

con la finalidad de detectar patrones de no estacionariedad y a sugerir posibles modelos a aplicar si la serie fuera estacionaria. Por ende, evidencia de que la dependencia de la serie con sus valores pasados cambia con el tiempo o persiste por muchos rezagos, lo cual sugiere no estacionariedad. Es por ello que aplicaremos los siguientes pasos para la detección de raíz unitaria. Tal y como lo muestra el siguiente diagrama de flujo detección de raíz unitaria

Sospecha de tendencia y ADF

adf<-ur.df(df_series$Y2,type="trend", lag=5, selectlags="BIC")
adf@testreg
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.69516 -0.20413 -0.02684  0.17131  2.02116 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.1271512  0.0781675   1.627    0.107
## z.lag.1     -0.0298408  0.0346134  -0.862    0.391
## tt          -0.0005929  0.0022327  -0.266    0.791
## z.diff.lag   0.1327053  0.1072923   1.237    0.219
## 
## Residual standard error: 0.337 on 90 degrees of freedom
## Multiple R-squared:  0.05467,    Adjusted R-squared:  0.02316 
## F-statistic: 1.735 on 3 and 90 DF,  p-value: 0.1655
adf1<-ur.df(df_series$Y2, type="trend", lags=0)
adf1@testreg
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.68265 -0.20883 -0.04288  0.18502  2.06272 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.0723442  0.0700994   1.032    0.305
## z.lag.1     -0.0223984  0.0340139  -0.659    0.512
## tt          -0.0001014  0.0021205  -0.048    0.962
## 
## Residual standard error: 0.3408 on 96 degrees of freedom
## Multiple R-squared:  0.01566,    Adjusted R-squared:  -0.004849 
## F-statistic: 0.7635 on 2 and 96 DF,  p-value: 0.4688
residuos<-adf1@res
acf2(residuos)

##      [,1]  [,2]  [,3] [,4]  [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## ACF  0.14 -0.15 -0.07 0.07 -0.02 0.04 0.04 0.01 0.17  0.11  0.05 -0.13 -0.05
## PACF 0.14 -0.17 -0.02 0.06 -0.06 0.07 0.02 0.00 0.20  0.04  0.09 -0.11 -0.02
##      [,14] [,15] [,16] [,17] [,18] [,19] [,20]
## ACF  -0.03 -0.07 -0.05  0.15  0.17  0.05 -0.04
## PACF -0.04 -0.13 -0.04  0.12  0.09  0.07 -0.03

Especícamente:

  1. la expresión adf<-ur.df(df_series$Y2,type="trend", lag=5, selectlags="BIC") utiliza la función ur.df() para realizar el test de Dickey - Fuller aumentado (ADF) a nuestra serie \(Y_2\) donde en ella se implementa un termino de tendencia determinística “trend” puesto a las sospechas detectadas anteriormente de que la serie posee una tendencia lineal. Al igual que la especificación de 5 rezagos con el argumento lag=5 cuya finalidad es ayudar a “aumentar” el test para asegurar que los residuos de la regresión no estén autocorrelacionados. La autocorrelación en los residuos podría invalidar los resultados del test.Por ultimo el argumento selectlags="BIC" que básicamente nos ayudará a obtener ese número óptimo de rezagos a incluir en la regresión.

  2. La expresión adf@testreg nos mostrará el resultado de la regresión estimada \[ΔY_t=a_0+a_2t+γY_{t-1} + \sum_{i=1}^{p} \beta_i \Delta Y_{t-i} +ϵ_t\] para luego utilizar el estadístico \(\tau_{\tau}\) para probar la hipótesis nula de \(\gamma=0\)

Dado que el valor p (0.512) es mayor que los niveles de significancia típicos (como 0.05 o 0.01), no rechazamos la hipótesis nula de que la serie df_series$Y2 tiene una raíz unitaria. Esto sugiere que la serie no es estacionaria alrededor de una tendencia.

En el cuadro de resumen de regresión se evidencia que el valor p de tt es mayor que el alpha del 5%. en este orden de ideas no se rechaza la hipotesis nula, indicando que no se requieren rezagos de diferecias

Resumen de la aplicación del dickey - fuller aumentado

summary(adf1)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression trend 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.68265 -0.20883 -0.04288  0.18502  2.06272 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.0723442  0.0700994   1.032    0.305
## z.lag.1     -0.0223984  0.0340139  -0.659    0.512
## tt          -0.0001014  0.0021205  -0.048    0.962
## 
## Residual standard error: 0.3408 on 96 degrees of freedom
## Multiple R-squared:  0.01566,    Adjusted R-squared:  -0.004849 
## F-statistic: 0.7635 on 2 and 96 DF,  p-value: 0.4688
## 
## 
## Value of test-statistic is: -0.6585 0.5983 0.7635 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau3 -4.04 -3.45 -3.15
## phi2  6.50  4.88  4.16
## phi3  8.73  6.49  5.47

siguiendo el diagrama de flujo y que \(\gamma = 0\) se procede a estimar \(\tau_3\). Donde el valor del estadistico de prueba -0.658, valor crítico tau3 -4.04 al 1pct. No se rechaza la hipotesis de raiz unitaria.

prueba para phi3

#Restriccion a2=gamma=0
adf_rest<-ur.df(df_series$Y1,type="drift",lags=0)
adf_rest@testreg
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.66085 -0.25652  0.01112  0.23370  1.07029 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  0.06608    0.04638   1.425   0.1574  
## z.lag.1     -0.05659    0.03317  -1.706   0.0912 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3277 on 97 degrees of freedom
## Multiple R-squared:  0.02914,    Adjusted R-squared:  0.01913 
## F-statistic: 2.911 on 1 and 97 DF,  p-value: 0.09115
SSR_r<-adf_rest@testreg$sigma^2*adf_rest@testreg$df[2]
#SSR no restringido
SSR_u<-adf1@testreg$sigma^2*adf1@testreg$df[2]
  1. El argumento type="drift" de la expresión adf_rest<-ur.df(df_series$Y1,type="drift",lags=0) especifíca el modelo con una constante pero sin tendencia determinística bajo a la hipótesis nula de \(\phi_3\) y de las restricciones de (si \(a_2 = \gamma = 0\)) simplificando la ecuación a \(ΔY_t=a_0+ \sum_{i=1}^{p} \beta_i \Delta Y_{t-i} +ϵ_t\) No obstante, el argumento lags=0 se simplifa a \(ΔY_t=a_0 + ϵ_t\)

  2. La expresión SSR_r<-adf_rest@testreg$sigma^2*adf_rest@testreg$df[2] calcula la Suma de Cuadrados de los Residuos (SSR) del modelo restringido donde:

  • adf_rest@testreg$sigma^2 calcula la varianza estimada de los residuos \(\widehat{\sigma}^2\)
  • adf_rest@testreg$df[2] Nos arroja los grados de libertad

Ahora que tienes la SSR restringida (SSR_r) y la SSR no restringida (SSR_u), puedes calcular el estadístico \(\phi_3\) utilizando la siguiente fórmula (derivada de una prueba F para la significancia conjunta de los coeficientes restringidos): \[\phi_3 = \frac{(SSR_r - SSR_u) / q}{SSR_u / (T - k)}\] Donde: - \(SSR_\tau\) es la suma de cuadrados de los residuos del modelo restringido \(a_2 = \gamma = 0\) - \(SSR_u\) es la suma de cuadrados de los residuos del modelo no restringido (con constante, tendencia y \(Y_{t-1}\) - \(q\) es el número de restricciones impuestas (en este caso \(q = 2\) ya que estamos restringiendo \(a_2 = \gamma = 0\) - \(T\) es el número de observaciones en la serie de tiempo - \(k\) es el número de parámetros estimados en el modelo no restringido. En el caso de adf1 (con constante, tendencia y \(Y_{t-1}\)), \(k = 3\)

#Calculo de fi3
r<-2
df_u<-adf1@testreg$df[2]
fi3<-((SSR_r-SSR_u)/2)/(SSR_u/df_u)
#Valor critico de fi3
respuesta<-fi3>adf@cval[3,]
respuesta
##  1pct  5pct 10pct 
## FALSE FALSE FALSE

El resultado FALSE FALSE FALSE significa que tu valor calculado de \(\phi_3\) es menor que los valores críticos al 1%, 5% y 10% para la prueba \(\phi_3\) es decir que no se rechaza \(a_2 = \gamma = 0\), no hay tendencia

##Prueba de Raíz Unitaria ADF con Deriva (Intercepto) para la Serie Y2

adf2_y2<-ur.df(df_series$Y2,type="drift",lags=0)
adf2_y2@testreg
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.68689 -0.20786 -0.04176  0.18452  2.06141 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.07024    0.05433   1.293    0.199
## z.lag.1     -0.02374    0.01913  -1.241    0.218
## 
## Residual standard error: 0.339 on 97 degrees of freedom
## Multiple R-squared:  0.01563,    Adjusted R-squared:  0.005486 
## F-statistic: 1.541 on 1 and 97 DF,  p-value: 0.2175
summary(adf2_y2)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression drift 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.68689 -0.20786 -0.04176  0.18452  2.06141 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.07024    0.05433   1.293    0.199
## z.lag.1     -0.02374    0.01913  -1.241    0.218
## 
## Residual standard error: 0.339 on 97 degrees of freedom
## Multiple R-squared:  0.01563,    Adjusted R-squared:  0.005486 
## F-statistic: 1.541 on 1 and 97 DF,  p-value: 0.2175
## 
## 
## Value of test-statistic is: -1.2412 0.9056 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.51 -2.89 -2.58
## phi1  6.70  4.71  3.86

La expresión adf2<-ur.df(df_series$Y2,type="drift",lags=0) estima un modelo ADF con solo un término de deriva y sin rezagos de la primera diferencia por los argumentos type="drift" y lags=0

Prueba para \(\gamma = 0\) (usando \(\tau_\mu = -1.2412\)): Comparamos el valor absoluto de nuestro estadístico con los valores críticos para \(\tau_2\) (que corresponden a \(\tau_\mu\)).

\(|-1.2412| < 2.58\) (valor crítico al 10%) \(\implies\) No rechazamos la hipótesis nula de que \(\gamma = 0\) al nivel del 10%. \(|-1.2412| < 2.89\) (valor crítico al 5%) \(\implies\) No rechazamos la hipótesis nula de que \(\gamma = 0\) al nivel del 5%. \(|-1.2412| < 3.51\) (valor crítico al 1%) \(\implies\) No rechazamos la hipótesis nula de que \(\gamma = 0\) al nivel del 1%.

Conclusión del Paso 3 para df_series$Y2 : No rechazamos la hipótesis nula de que la serie Y2 tiene una raíz unitaria (es no estacionaria) en el modelo con deriva.

Prueba de Raíz Unitaria ADF sin Constante ni Tendencia para la Serie Y2

paso 4 del flujo

#Prueba a0=gamma=0
adf2_rest_Y2<-ur.df(df_series$Y2, type="none", lags=0)
adf2_rest_Y2@testreg
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.66975 -0.16854 -0.01133  0.20828  2.10776 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.00448    0.01204  -0.372    0.711
## 
## Residual standard error: 0.3402 on 98 degrees of freedom
## Multiple R-squared:  0.001411,   Adjusted R-squared:  -0.008778 
## F-statistic: 0.1385 on 1 and 98 DF,  p-value: 0.7106
SSR_adf2_r_2<-adf2_rest_Y2@testreg$sigma^2*adf2_rest_Y2@testreg$df[2]
r2<-2
df_adf2_u_2<-adf2_y2@testreg$df[2]
SSR_adf2_u_2<-adf2_y2@testreg$sigma^2*adf2_y2@testreg$df[2]

f1_2<-((SSR_adf2_r_2-SSR_adf2_u_2)/r2)/(SSR_adf2_u_2/df_adf2_u_2)
respuesta_intersecto2<-f1_2>adf2_y2@cval[2,]
respuesta_intersecto2
##  1pct  5pct 10pct 
## FALSE FALSE FALSE

De la expresión adf2_rest_Y2<-ur.df(df_series$Y2, type="none", lags=0) el argumento type="none" estima el modelo restringido donde tanto la constante como la tendencia (que no había en el modelo del Paso 3) son excluidas. La regresión estimada bajo esta restricción es: \[ΔY = \epsilon_t\]

Salida FALSE FALSE FALSE: Esto indica que tu valor calculado de f1_2 es menor que los valores críticos al 1%, 5% y 10% para la prueba \(\phi_1\)

Dado que el valor calculado del estadístico \(\phi_1\) es menor que los valores críticos, no rechazamos la hipótesis nula de que conjuntamente el intercepto (\(a_0\)) y el coeficiente del nivel rezagado (\(\gamma\)) son cero.

Resultados de la Prueba de Raíz Unitaria ADF sin Constante ni Tendencia para la Serie Y2

adf3_y2 = ur.df(df_series$Y2,type="none",lag=0)
adf3_y2@testreg
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.66975 -0.16854 -0.01133  0.20828  2.10776 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.00448    0.01204  -0.372    0.711
## 
## Residual standard error: 0.3402 on 98 degrees of freedom
## Multiple R-squared:  0.001411,   Adjusted R-squared:  -0.008778 
## F-statistic: 0.1385 on 1 and 98 DF,  p-value: 0.7106
summary(adf3_y2)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.66975 -0.16854 -0.01133  0.20828  2.10776 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.00448    0.01204  -0.372    0.711
## 
## Residual standard error: 0.3402 on 98 degrees of freedom
## Multiple R-squared:  0.001411,   Adjusted R-squared:  -0.008778 
## F-statistic: 0.1385 on 1 and 98 DF,  p-value: 0.7106
## 
## 
## Value of test-statistic is: -0.3722 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61
#Valor del estadistico de prueba
adf3_y2@teststat
##                 tau1
## statistic -0.3721607
#Valores criticos de tau1
adf3_y2@cval
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61
#Solucion
adf3_y2@teststat[1,1]<adf3_y2@cval
##       1pct  5pct 10pct
## tau1 FALSE FALSE FALSE

De la expresión adf3_y2 = ur.df(df_series$Y2,type="none",lag=0) el argumento type="none" especifica que la regresión de prueba del Test de Dickey-Fuller Aumentado (ADF) no incluye ni un término constante (intercepto) ni un término de tendencia determinística.No obstante, utilicemos este argumento cuando se tenga fuertes razones para creer que tu serie de tiempo - No tiene una media constante distinta de cero si es estacionaria. - No tiene una tendencia determinística si es no estacionaria (es una caminata aleatoria sin una dirección promedio).

en conclusión, dado que el valor del estadístico \(\tau\) (-0.372) no es menor que ninguno de los valores críticos para el test ADF sin constante ni tendencia, no rechazamos la hipótesis nula de que \(\gamma = 0\). Esto sugiere que, incluso bajo la asunción de que no hay constante ni tendencia, no encontramos evidencia estadística para rechazar la presencia de una raíz unitaria en la serie df_series$Y2

test de Perron

detección de raíces unitarias en presencia de cambios estructurales en la serie

etección Preliminar del Punto de Quiebre en la Serie Y2

par(mfrow=c(1,1))
plot(df_series$Y2,type="l",las=1,xaxs="i",xlab="",ylab="",tck=0.02,col="steelblue4") 

#Detecta el punto de cambio 
ind_Y2 = which(max(abs(diff(df_series$Y2)))==abs(diff(df_series$Y2))) 
tau_Y2 = ind_Y2+1
tau_Y2
## [1] 51

Desglosando la expresión ind_Y2 = which(max(abs(diff(df_series$Y2)))==abs(diff(df_series$Y2))) tenemos que: - diff(df_series$Y2 Calcula la primera diferencia de la serie Y2, es decir \(Y_t - Y_{t-1}\) para cada punto. Los valores grandes en la primera diferencia indican cambios significativos en la serie. - abs(...) Toma el valor absoluto de las diferencias para identificar tanto aumentos como disminuciones bruscas. - max(...) Encuentra el valor máximo de las diferencias absolutas. - which(...) Devuelve el índice de la observación donde ocurre este valor máximo. Este índice corresponde al punto antes del cambio más grande. - tau_Y2 Muestra el valor estimado del punto de quiebre. Que para este caso en particular el valor es de 51

df_y2 = data.frame(Y=df_series$Y2,Ylag=c(NA,embed(df_series$Y2,2)[,-1]))
colnames(df_y2)=c("Y","Ylag")
df_y2$Dl=1
df_y2$Dl[1:tau_Y2]=0
df_y2$Dp=0
df_y2$Dp[tau_Y2]=1
df_y2$t = 1:nrow(df_y2)
df_y2 = df_y2[-1,]

Explicación del código:

df_y2 = data.frame(Y=df_series$Y2,Ylag=c(NA,embed(df_series$Y2,2)[,-1])): Crea un nuevo dataframe llamado df_y2. La columna Y contiene los valores de tu serie de tiempo df_series$Y2. La columna Ylag contiene los valores de la serie rezagados un período. embed(df_series$Y2,2)[,-1] crea una matriz con la serie original y la serie rezagada, y luego [,-1] selecciona solo la columna de la serie rezagada, con un NA al principio para mantener la longitud correcta para operaciones posteriores con la primera diferencia. Ojo: Para el Test de Perron en su forma básica, generalmente se utiliza el nivel rezagado \(Y_{t-1}\) directamente. Tu forma es equivalente pero introduce un rezago adicional en la variable Ylag que podría no ser intencional para el modelo ADF aumentado dentro del Test de Perron. Asegúrate de que esta sea la especificación que deseas para tu modelo. colnames(df_y2)=c("Y","Ylag"): Asigna nombres claros a las columnas del dataframe. df_y2$Dl=1: Crea una nueva columna llamada Dl (para “Delta level”) y la inicializa con el valor 1 para todas las observaciones. df_y2$Dl[1:tau_Y2]=0: Modifica la columna Dl. Para todas las observaciones desde la primera hasta el punto de quiebre estimado (tau_Y2 = 51), el valor de Dl se establece en 0. Esto crea una variable de nivel que es 0 antes del quiebre y 1 a partir del quiebre. df_y2$Dp=0: Crea una nueva columna llamada Dp (para “Delta pulse”) y la inicializa con el valor 0 para todas las observaciones. df_y2$Dp[tau_Y2]=1: Modifica la columna Dp. En el punto de quiebre estimado (tau_Y2 = 51), el valor de Dp se establece en 1. Esta es una variable de pulso que es 1 solo en el momento del quiebre y 0 en todos los demás períodos. df_y2$t = 1:nrow(df_y2): Crea una columna t que representa el tiempo o el índice de las observaciones. Esta variable se utilizará si decides incluir una tendencia en tu modelo del Test de Perron.

Modelo de Regresión con Quiebre

lm1_Y2 = lm(Y~Ylag+t+Dp+Dl,df_y2)
resumen_Y2<-summary(lm1_Y2)
resumen_Y2
## 
## Call:
## lm(formula = Y ~ Ylag + t + Dp + Dl, data = df_y2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.63606 -0.16653 -0.03317  0.20352  0.52366 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.089896   0.064046   1.404    0.164    
## Ylag         0.973727   0.036408  26.745  < 2e-16 ***
## t           -0.002127   0.001944  -1.094    0.277    
## Dp           2.153388   0.275093   7.828 7.32e-12 ***
## Dl           0.146854   0.148970   0.986    0.327    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2678 on 94 degrees of freedom
## Multiple R-squared:  0.9783, Adjusted R-squared:  0.9774 
## F-statistic:  1059 on 4 and 94 DF,  p-value: < 2.2e-16

Interpretación

  • (Intercept): El intercepto estimado es 0.0899. No es estadísticamente significativo (p-valor = 0.164).
  • Ylag: El coeficiente estimado para el valor rezagado de Y es 0.9737. Es altamente estadísticamente significativo (p-valor < 2e-16). Esto sugiere una fuerte persistencia en la serie.
  • t (Tendencia temporal): El coeficiente estimado para la tendencia temporal es -0.0021. No es estadísticamente significativo (p-valor = 0.277).La tendencia temporal no parece ser un factor significativo en este modelo.
  • Dp (Dummy de pulso): El coeficiente estimado para la variable de pulso es 2.1534. Es altamente estadísticamente significativo (p-valor = 7.32e-12). Esto indica que hubo un shock significativo y abrupto en el nivel de la serie en el momento del quiebre (observación 51).
  • Dl (Dummy de nivel): El coeficiente estimado para la variable de nivel es 0.1469. No es estadísticamente significativo (p-valor = 0.327). El cambio permanente en el nivel después del quiebre, capturado por Dl, no parece ser estadísticamente significativo en este modelo, una vez que se controla por el shock puntual (Dp).

Modelo de regresión sin tendencia (t)

lm2_Y2<-lm(Y~Ylag+Dp+Dl,df_y2)
resumen2_Y2<-summary(lm2_Y2)
resumen2_Y2
## 
## Call:
## lm(formula = Y ~ Ylag + Dp + Dl, data = df_y2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.69250 -0.17460 -0.00654  0.19723  0.52038 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.03888    0.04395   0.885    0.379    
## Ylag         0.96659    0.03586  26.958  < 2e-16 ***
## Dp           2.10477    0.27176   7.745 1.03e-11 ***
## Dl           0.06362    0.12821   0.496    0.621    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2681 on 95 degrees of freedom
## Multiple R-squared:  0.978,  Adjusted R-squared:  0.9773 
## F-statistic:  1409 on 3 and 95 DF,  p-value: < 2.2e-16
residuos2_Y2<-resid(lm2_Y2)
acf2(residuos2_Y2)

##      [,1]  [,2]  [,3] [,4]  [,5]  [,6]  [,7]  [,8] [,9] [,10] [,11] [,12] [,13]
## ACF  0.09 -0.03 -0.02 0.06 -0.01 -0.04 -0.02 -0.09 0.13  0.17 -0.12 -0.13  0.07
## PACF 0.09 -0.04 -0.01 0.07 -0.02 -0.03 -0.02 -0.10 0.15  0.15 -0.16 -0.08  0.08
##      [,14] [,15] [,16] [,17] [,18] [,19] [,20]
## ACF   0.06 -0.02  0.05  0.08  0.14  0.05 -0.01
## PACF  0.01  0.00  0.08  0.08  0.14 -0.03 -0.04

Coeficientes del Modelo:

  • (Intercept): No significativo (p-valor = 0.379).
  • Ylag: Altamente significativo (p-valor < 2e-16), confirmando la persistencia.
  • Dp: Altamente significativo (p-valor = 1.03e-11), indicando un shock puntual importante.
  • Dl: No significativo (p-valor = 0.621), sugiriendo que el cambio de nivel permanente no es estadísticamente relevante en este modelo.

Los valores del error estándar de los residuos, el R-cuadrado y el estadístico F son similares al modelo anterior, lo que indica un buen ajuste general.

Calculo del test de Perron

t_perron_Y2<-(resumen_Y2$coefficients[2,1]-1)/resumen_Y2$coefficients[2,2]
t_perron_Y2
## [1] -0.7216243
  • resumen_Y2$coefficients[2,1]: Esto extrae el coeficiente estimado de la segunda fila (que corresponde a Ylag) de la tabla de coeficientes del resumen del modelo lm1_Y2.

  • - 1: Le restas 1 a este coeficiente. Bajo la hipótesis nula de una raíz unitaria (sin considerar el quiebre), el coeficiente de \(Y_{t-1}\) en la regresión \(\Delta Y_t = \alpha Y_{t-1} + ...\) sería 0, lo que implica que el coeficiente de \(Y_{t-1}\) en la regresión \(Y_t = (1+\alpha) Y_{t-1} + ...\) sería 1. Por lo tanto, (coeficiente - 1) se relaciona con la magnitud del rechazo de la raíz unitaria.

  • / resumen_Y2$coefficients[2,2]: Divides el resultado anterior por el error estándar del coeficiente de Ylag. Esto se asemeja a la construcción de un estadístico t estándar.

par(mfrow=c(1,1))
plot(df_y2$Y[-1],type="l",las=1,xaxs="i",xlab="",ylab="",tck=0.02)
lines(lm1_Y2$fitted.values,col="steelblue4",lty=1)

test Perron con modelo estructural

Procedimiento del Test de Perron

  1. Identificación del punto de quiebre

    1. Determinar visualmente o mediante métodos estadísticos el punto donde ocurre el cambio estructural.
    2. Alternativamente, utilizar la fecha de un evento conocido que podría haber causado el cambio.
  2. Creación de variables dummy

    1. Variable de cambio en nivel (Du): toma valor 0 antes del quiebre y 1 después.
    2. Variable de cambio en tendencia (Dt): toma valor 0 antes del quiebre y valores secuenciales después.
    3. Variable de pulso (Dbreak): toma valor 1 solo en el período inmediato al quiebre.
  3. Especificación del modelo

    1. Modelo IO1 (Innovational Outlier - cambio en nivel): incluye Du y Dbreak.
    2. Modelo IO2 (Innovational Outlier - cambio en nivel y tendencia): incluye Du, Dt y Dbreak.
    3. Modelo AO (Additive Outlier): requiere un enfoque en dos etapas.
  4. Estimación del modelo

    1. Estimar el modelo mediante mínimos cuadrados ordinarios (MCO).
    2. Analizar la significancia de los coeficientes de las variables dummy.
  5. Análisis de los residuos

    1. Aplicar un test de raíz unitaria (como ADF) a los residuos del modelo.
    2. Comparar el estadístico con los valores críticos específicos del test de Perron.
  6. Comparación con modelo sin cambio estructural

    1. Realizar un test F o test de razón de verosimilitud para comparar modelos.
    2. Determinar si el modelo con cambio estructural es significativamente mejor.
  7. Interpretación de resultados

    1. Si los residuos son estacionarios y el modelo con cambio estructural es significativo, se rechaza la hipótesis de raíz unitaria en favor de estacionariedad con cambio estructural.
# 1. Definir el punto de quiebre conocido
breakpoint <- 51
n <- nrow(df_y2)
# 2. Crear variables dummy para el cambio estructural
df_y2$Du <- ifelse(1:n > breakpoint, 1, 0)  # Cambio en nivel (intercepto)
df_y2$Dt <- ifelse(1:n > breakpoint, 1:n - breakpoint, 0)  # Cambio en tendencia (pendiente)
df_y2$Dbreak <- ifelse(1:n == breakpoint + 1, 1, 0)  # Dummy para el punto exacto de quiebre
# 3. Estimar el modelo de Perron con las variables de cambio estructural
# Modelo IO1 (Innovational Outlier - cambio en intercepto)
perron_io1 <- lm(Y ~ Ylag + Dp + Dl + Du + Dbreak, data = df_y2)
# Modelo IO2 (Innovational Outlier - cambio en intercepto y pendiente)
perron_io2 <- lm(Y ~ Ylag + Dp + Dl + Du + Dt + Dbreak, data = df_y2)
# 4. Mostrar resultados
summary(perron_io1)
## 
## Call:
## lm(formula = Y ~ Ylag + Dp + Dl + Du + Dbreak, data = df_y2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.6867 -0.1699  0.0000  0.1907  0.5220 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.03736    0.04393   0.850    0.397    
## Ylag         0.96912    0.03590  26.991  < 2e-16 ***
## Dp           2.10315    0.27144   7.748 1.13e-11 ***
## Dl           0.40067    0.28782   1.392    0.167    
## Du          -0.34830    0.27121  -1.284    0.202    
## Dbreak      -0.19846    0.27066  -0.733    0.465    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2677 on 93 degrees of freedom
## Multiple R-squared:  0.9785, Adjusted R-squared:  0.9774 
## F-statistic:   848 on 5 and 93 DF,  p-value: < 2.2e-16
summary(perron_io2)
## 
## Call:
## lm(formula = Y ~ Ylag + Dp + Dl + Du + Dt + Dbreak, data = df_y2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.6595 -0.1618 -0.0143  0.1772  0.5369 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.061970   0.043510   1.424  0.15776    
## Ylag         0.928207   0.037964  24.450  < 2e-16 ***
## Dp           2.129296   0.263004   8.096 2.27e-12 ***
## Dl           0.512819   0.281803   1.820  0.07204 .  
## Du          -0.123112   0.275694  -0.447  0.65625    
## Dt          -0.008166   0.003044  -2.683  0.00866 ** 
## Dbreak      -0.401785   0.272809  -1.473  0.14423    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2593 on 92 degrees of freedom
## Multiple R-squared:  0.9801, Adjusted R-squared:  0.9788 
## F-statistic: 754.9 on 6 and 92 DF,  p-value: < 2.2e-16
# 5. Test de raíz unitaria con cambio estructural
# Calcular los residuos del modelo (usamos IO2 que es más completo)
df_y2$residuals <- residuals(perron_io2)
# Test de Dickey-Fuller Aumentado usando urca
adf_test_urca <- ur.df(df_y2$residuals, type = "none", lags = 1)
summary(adf_test_urca)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.62634 -0.17141 -0.00947  0.18054  0.50611 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## z.lag.1     -1.0374     0.1387  -7.478 3.73e-11 ***
## z.diff.lag   0.1040     0.1033   1.007    0.317    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2471 on 95 degrees of freedom
## Multiple R-squared:  0.4688, Adjusted R-squared:  0.4576 
## F-statistic: 41.92 on 2 and 95 DF,  p-value: 8.919e-14
## 
## 
## Value of test-statistic is: -7.4782 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61
# 6. Comparar con tu modelo original
summary(lm2_Y2)
## 
## Call:
## lm(formula = Y ~ Ylag + Dp + Dl, data = df_y2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.69250 -0.17460 -0.00654  0.19723  0.52038 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.03888    0.04395   0.885    0.379    
## Ylag         0.96659    0.03586  26.958  < 2e-16 ***
## Dp           2.10477    0.27176   7.745 1.03e-11 ***
## Dl           0.06362    0.12821   0.496    0.621    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2681 on 95 degrees of freedom
## Multiple R-squared:  0.978,  Adjusted R-squared:  0.9773 
## F-statistic:  1409 on 3 and 95 DF,  p-value: < 2.2e-16
# 7. Realizar un test F para comparar los modelos
# Esto te ayudará a determinar si las variables de cambio estructural son significativas
anova(lm2_Y2, perron_io2)
## Analysis of Variance Table
## 
## Model 1: Y ~ Ylag + Dp + Dl
## Model 2: Y ~ Ylag + Dp + Dl + Du + Dt + Dbreak
##   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
## 1     95 6.8269                              
## 2     92 6.1834  3   0.64353 3.1916 0.02727 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 8. Visualizar los resultados
par(mfrow=c(2,2))
plot(df_y2$Y, type="l", main="Serie Original")
abline(v=breakpoint, col="red", lty=2)

plot(fitted(perron_io2), type="l", main="Valores Ajustados")
abline(v=breakpoint, col="red", lty=2)

plot(df_y2$residuals, type="l", main="Residuos")
abline(v=breakpoint, col="red", lty=2)

acf(df_y2$residuals, main="ACF de Residuos")

Interpretación de los Resultados del Test de Perron

Basándose en los resultados detallados que se han compartido, se pueden ofrecer las siguientes conclusiones.

1. Evidencia de cambio estructural significativo

  • El modelo que incluye las variables de cambio estructural (Du, Dt y Dbreak) muestra una mejora estadísticamente significativa sobre el modelo base, como lo confirma el test ANOVA (p-valor = 0.02727 < 0.05).
  • La variable Dt (cambio en tendencia) es estadísticamente significativa (p-valor = 0.00866) en el modelo completo, lo que indica un cambio en la pendiente después del punto de quiebre.

2. Estacionariedad de los residuos

  • El test ADF aplicado a los residuos muestra un valor estadístico de -7.4782, que es mucho más negativo que los valores críticos (-2.6, -1.95, -1.61 para niveles de significancia del 1%, 5% y 10% respectivamente).
  • Esto indica un fuerte rechazo de la hipótesis nula de raíz unitaria en los residuos, confirmando que los residuos son estacionarios.

3. Persistencia en la serie

  • El coeficiente de Ylag en el modelo final es 0.928207, que es cercano pero significativamente menor que 1, lo que sugiere un alto grado de persistencia pero no una raíz unitaria.

4. Impacto del cambio estructural

  • El coeficiente de Dp (2.129296) es altamente significativo, indicando un fuerte efecto del cambio estructural en la serie.
  • El coeficiente negativo de Dt (-0.008166) sugiere un cambio en la tendencia después del punto de quiebre.

Conclusión final

Se puede concluir que:

  1. La serie presenta un cambio estructural significativo en el punto 51, como se había identificado previamente.
  2. La serie es estacionaria alrededor de este cambio estructural, como lo confirma el test ADF en los residuos.
  3. El modelo de Perron es apropiado para la serie, ya que mejora significativamente el ajuste en comparación con el modelo sin variables de cambio estructural.
  4. El cambio estructural afecta tanto al nivel como a la tendencia de la serie, como lo indican los coeficientes significativos.
  5. La hipótesis de raíz unitaria se rechaza cuando se tiene en cuenta el cambio estructural, lo que sugiere que la aparente no estacionariedad de la serie original se debe principalmente al cambio estructural y no a una verdadera raíz unitaria.

Esta conclusión es consistente con la teoría del test de Perron, que sostiene que las pruebas estándar de raíz unitaria pueden fallar en rechazar la hipótesis nula incorrectamente cuando hay cambios estructurales presentes.

Referencia:

Enders, W. (2014). Applied Econometric Time Series. Wiley, 4th Edition. (Capítulo 4)

Hamilton, J. D. (1994). Time Series Analysis. Princeton University Press. (Capítulo 17) Lütkepohl, H., &

Krätzig, M. (2004). Applied Time Series Econometrics. Cambridge University Press. (Capítulo 2)