A31-[Tarea Grupal] Investigación sobre Cointegración y Causalidad.
Introducción
En economía, los conceptos de cointegración y causalidad son herramientas fundamentales que permiten analizar relaciones de largo plazo y dependencias dinámicas entre series temporales. Estas técnicas ayudan a responder preguntas importantes, como si dos o más series tienen una relación equilibrada a largo plazo o si los movimientos en una variable pueden predecir los movimientos en otra.
El concepto de cointegración hace referencia a la existencia de una relación de equilibrio entre dos o más series no estacionarias. A pesar de que las series individuales puedan presentar tendencias estocásticas, una combinación lineal de ellas podría ser estacionaria, lo que indica una relación económica significativa a largo plazo. Uno de los métodos más utilizados para evaluar la cointegración es el enfoque de Johansen.
Mientras que la causalidad de Granger busca determinar si los valores pasados de una serie temporal ayudan a predecir los valores actuales de otra. Aunque la causalidad en el sentido de Granger no implica causalidad en el sentido estricto, es una herramienta útil para estudiar relaciones predictivas entre variables.
Sin embargo, la causalidad y la cointegración no pueden ser aplicadas sin antes verificar la estacionariedad de las series temporales, para ello la prueba de Dickey-Fuller es ampliamente utilizada para evaluar la presencia de raíces unitarias en las series.
A continuación, se describen las pruebas y cómo implementarlas en R.
I. Prueba de Raíz Unitaria
1. Prueba de Raíz Unitaria de Dickey & Fuller
1.1 Próposito de la prueba
El objetivo principal de la prueba de Dickey-Fuller es identificar la presencia de una raíz unitaria en una serie temporal, por lo que permite conocer el comportamiento estacionario de una serie a lo largo del tiempo. Una serie con raíz unitaria presenta una tendencia estocástica, lo que puede conducir a relaciones espurias en modelos de regresión, es decir que los valores de la serie no convergen hacia una media estable, sino que están influenciados por shocks (o perturbaciones) aleatorios acumulativos que generan un comportamiento impredecible en el tiempo.
Existen tres versiones principales de la prueba de Dickey-Fuller:
Prueba de raíz unitaria simple: evalúa si una serie temporal tiene una raíz unitaria sin considerar términos adicionales.
Prueba con término constante (deriva): incluye un término constante en el modelo para considerar la posibilidad de una media distinta de cero.
Prueba con término constante y tendencia temporal: considera tanto un término constante como una tendencia determinista en el tiempo, permitiendo evaluar series que pueden tener una tendencia lineal.
Esta prueba esta basada en un modelo autoregresivo de orden 1 (AR(1)):
\[(Y[t]== PY[t-1] + ع[t] )\] \(Y[t] =\) es el valor de la serie en el tiempo \(t\).
\(P=\) es el parámetro autoregresivo que indica la relación entre \(Y[t]\) y \(Y[t-1]\)
\(ع[t]=\) es el término de error, que se asume ruido blanco \((ع[t]∼N(O,σ^2))\)
El interés principal está en evaluar si \(P=1\), lo que implica la existencia de una raíz unitaria y, por ende, no estacionariedad.
1.2 Hipótesis de la prueba
⦿ Hipótesis nula (H0): p = 1 La serie temporal tiene una raíz unitaria (es no estacionaria).
⦿ Hipótesis alternativa (𝐻1): p < 1 La serie temporal no tiene una raíz unitaria (es estacionaria).
Cuando 𝜌= 1, el modelo se convierte en un proceso aleatorio:
\[(Y[t]== Y[t-1] + ع[t] )\]
Explicación sobre la hipótesis nula y alternativa
La hipótesis nula postula que la serie es no estacionaria, lo que implica que cualquier shock tendrá un efecto permanente en la serie. Rechazar H₀ sugiere que la serie es estacionaria, indicando que los shocks tendrán efectos transitorios y la serie revertirá a su media a largo plazo.
1.3 Sintaxis de implementación en R
La función ur.df() permite realizar la prueba Dickey-Fuller original. La sintaxis general es:
# Cargar el paquete
library(urca)
# Generar datos: paseo aleatorio
set.seed(123)
n <- 100
y <- cumsum(rnorm(n)) # Serie con raíz unitaria
df.result<-ur.df(y, type = "none", lags = 0, selectlags = "Fixed")•y: Serie temporal que deseas analizar.
•type: Tipo de modelo que se ajustará. Puede ser:
1.”none”: Sin constante ni tendencia.
2.”drift”: Con constante.
3.”trend” Con tendencia.
•lags: Número de retardos a incluir en el modelo.
•selectlags: Método para seleccionar el número óptimo de retardos (por defecto, “Fixed” usa el número especificado en lags).
##
## ###############################################
## # 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
## -2.30579 -0.47885 0.07106 0.69641 2.19208
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.0007217 0.0278574 -0.026 0.979
##
## Residual standard error: 0.9203 on 98 degrees of freedom
## Multiple R-squared: 6.848e-06, Adjusted R-squared: -0.0102
## F-statistic: 0.0006711 on 1 and 98 DF, p-value: 0.9794
##
##
## Value of test-statistic is: -0.0259
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.6 -1.95 -1.61
En este ejemplo la salida es:
El estadístico de prueba es -0.0259
El valor crítico al 5% es -1.950. Como -0.0259 > 1.950, no se rechaza H0, lo que indica que la serie tiene raíz unitaria (no estacionaria).
1.4 Estadístico de prueba
El estadístico de la prueba se basa en estimar el parámetro de un modelo autorregresivo (AR) y verificar si este es significativamente diferente de 1. La hipótesis nula de la prueba es que existe una raíz unitaria (𝐻0: p = 1), frente a la alternativa de estacionariedad (𝐻1:p < 1).Es decir que la prueba de Dickey y Fuller derivan el estadístico de prueba basado en el estimador de 𝜙 y su error estándar:
\[ \tau = \frac{\hat{\phi}}{SE(\hat{\phi})} \]
Este estadístico (𝜏) se compara con valores críticos específicos tabulados por Dickey y Fuller (1981), donde es importante aclarar que estos valores críticos no son los mismos que los de una distribución t-Student estándar debido a la dependencia serial en los datos.
1.5 Criterio de decisión
1.Rechazar 𝐻0 (es decir, la serie es estacionaria): Si el valor del estadístico de prueba 𝜏es menor (más negativo) que el valor crítico tabulado.
2.No rechazar 𝐻0 (es decir, la serie tiene una raíz unitaria y es no estacionaria): Si el valor del estadístico de prueba𝜏es mayor que el valor crítico tabulado.
1.6 Interpretación del rechazo o no rechazo de hipótesis nula
•Rechazo de Rechazo de H0: El p-valor es menor a 0.05, por lo que se rechaza H0. La serie es estacionaria.
•No rechazo de H0: El p-valor es mayor a 0.05, por lo que no se rechaza H0. La serie no es estacionaria.
1.7 Ejemplo de ejercicio práctico de prueba de Dickey-Fuller
Contexto del ejercicio
Supongamos que queremos analizar si los precios de un bien económico (por ejemplo, un índice de precios al consumidor o el precio del petróleo) presentan una raíz unitaria, lo que indicaría que son no estacionarios.
Lo que implicaría que si los precios tienen una raíz unitaria, las fluctuaciones en los precios no tienden a estabilizarse, y los efectos de los choques económicos (como una crisis) persisterían en el tiempo. Por el contrario, si los precios son estacionarios, los choques tienen efectos transitorios y eventualmente el precio vuelve a un nivel de equilibrio.
1.7.1 Generar datos simulados
# Crear una serie temporal simulada (caminata aleatoria no estacionaria)
set.seed(123)
tiempo <- 1:100 # 100 observaciones
precios <- cumsum(rnorm(100, mean = 0, sd = 1)) # Caminata aleatoria (no estacionaria)
# Graficar la serie temporal
plot(precios, type = "l", main = "Serie Temporal Simulada de Precios",
ylab = "Precios", xlab = "Tiempo", col = "blue", lwd = 2)
1.7.2. Aplicar la prueba Dickey-Fuller
simple
# Función para la prueba Dickey-Fuller simple
dickey_fuller <- function(serie) {
# Crear la serie diferenciada
delta_y <- diff(serie)
y_lag <- serie[-length(serie)] # Serie desplazada una unidad
# Ajustar el modelo: ΔY[t] = β0 + β1*Y[t-1] + ε[t]
modelo <- lm(delta_y ~ y_lag)
# Obtener el coeficiente de Y[t-1] y su error estándar
beta <- coef(modelo)["y_lag"]
se_beta <- summary(modelo)$coefficients["y_lag", "Std. Error"]
# Calcular el estadístico de prueba τ
tau <- beta / se_beta
# Retornar resultados
return(list(
estadistico = tau,
coeficiente = beta,
error_estandar = se_beta,
modelo = summary(modelo)
))
}
# Aplicar la prueba Dickey-Fuller simple
resultado_df <- dickey_fuller(precios)
# Mostrar los resultados
print(resultado_df$estadistico) # Estadístico τ## y_lag
## -1.149443
##
## Call:
## lm(formula = delta_y ~ y_lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.30139 -0.53330 -0.05617 0.57144 2.28307
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.20805 0.13330 1.561 0.122
## y_lag -0.04615 0.04015 -1.149 0.253
##
## Residual standard error: 0.9136 on 97 degrees of freedom
## Multiple R-squared: 0.01344, Adjusted R-squared: 0.003267
## F-statistic: 1.321 on 1 and 97 DF, p-value: 0.2532
1.7.3. Interpretar la salida
# Valores críticos manuales para la prueba Dickey-Fuller simple
valores_criticos <- c(-2.57, -1.95, -1.62) # Niveles de significancia 1%, 5%, 10%
niveles_significancia <- c("1%", "5%", "10%")
# Comparar el estadístico de prueba con los valores críticos
cat("Estadístico de prueba τ:", resultado_df$estadistico, "\n")## Estadístico de prueba τ: -1.149443
## Valores críticos:
for (i in seq_along(valores_criticos)) {
cat(paste0(niveles_significancia[i], ": ", valores_criticos[i], "\n"))
}## 1%: -2.57
## 5%: -1.95
## 10%: -1.62
#Graficación del estadístico y valores críticos
# Crear un dataframe para graficar
datos <- data.frame(
Nivel = c(niveles_significancia, "Estadístico"),
Valor = c(valores_criticos, resultado_df$estadistico)
)
# Agregar tipo de valor
datos$Tipo <- ifelse(datos$Nivel == "Estadístico", "Estadístico", "Crítico")
# Graficar
library(ggplot2)
ggplot(datos, aes(x = Nivel, y = Valor, color = Tipo)) +
geom_point(size = 4) +
geom_line(aes(group = Tipo), linetype = "dashed") +
labs(
title = "Prueba Dickey-Fuller Simple",
subtitle = "Comparación del estadístico de prueba con valores críticos",
x = "Nivel de significancia",
y = "Valor del estadístico"
) +
theme_minimal() +
theme(legend.position = "top")1.7.4. Resultado de la prueba
# Interpretación automática
if (resultado_df$estadistico < valores_criticos[2]) {
cat("Conclusión: Se rechaza H0. La serie es estacionaria.\n")
} else {
cat("Conclusión: No se rechaza H~0~. La serie tiene una raíz unitaria (no es estacionaria).\n")
}## Conclusión: No se rechaza H~0~. La serie tiene una raíz unitaria (no es estacionaria).
Ejemplo según las versiones de la prueba de Dickey-Fuller
A. Prueba Dickey-Fuller Simple (Sin constante ni tendencia)
Se requiere analizar los rendimientos diarios de una acción bursátil para verificar si son estacionarios. En general, los rendimientos se consideran estacionarios porque no tienen un promedio constante ni tendencia.
# Simulación de rendimientos diarios
set.seed(42)
rendimientos <- rnorm(100, mean = 0, sd = 1) # Serie sin tendencia ni constante
# Implementación de df.test para la versión simple
df.test.simple <- function(serie) {
delta_y <- diff(serie)
y_lag <- serie[-length(serie)] # Serie rezagada una unidad
modelo <- lm(delta_y ~ y_lag - 1) # Sin constante
beta <- coef(modelo)["y_lag"]
se_beta <- summary(modelo)$coefficients["y_lag", "Std. Error"]
tau <- beta / se_beta
return(list(estadistico = tau, modelo = summary(modelo)))
}
# Aplicar la prueba
resultado_simple <- df.test.simple(rendimientos)
print(resultado_simple$estadistico)## y_lag
## -9.419719
# Simulación de rendimientos diarios
set.seed(42)
rendimientos <- rnorm(100, mean = 0, sd = 1)
# Gráfico de la serie
plot(rendimientos, type = "l", col = "blue", lwd = 2,
main = "Rendimientos Diarios de una Acción Bursátil",
xlab = "Tiempo", ylab = "Rendimientos")
abline(h = 0, col = "red", lty = 2) # Línea de referencia##
## Call:
## lm(formula = delta_y ~ y_lag - 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.9982 -0.6667 0.1624 0.6731 2.2130
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## y_lag -0.9435 0.1002 -9.42 2.2e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.036 on 98 degrees of freedom
## Multiple R-squared: 0.4752, Adjusted R-squared: 0.4698
## F-statistic: 88.73 on 1 and 98 DF, p-value: 2.201e-15
# Valores críticos manuales para la prueba Dickey-Fuller simple
valores_criticos <- c(-2.58, -1.95, -1.62) # Niveles de significancia 1%, 5%, 10%
niveles_significancia <- c("1%", "5%", "10%")
# Comparar el estadístico de prueba con los valores críticos
cat("Estadístico de prueba τ:", resultado_simple$estadistico, "\n")## Estadístico de prueba τ: -9.419719
## Valores criticos:
for (i in seq_along(valores_criticos)) {
cat(paste0(niveles_significancia[i], ": ", valores_criticos[i], "\n"))
}## 1%: -2.58
## 5%: -1.95
## 10%: -1.62
# Comparación con valores críticos
tau <- resultado_simple$estadistico
if (tau < -2.58) {
cat("Rechazamos H0 al 1%. La serie es estacionaria.\n")
} else if (tau < -1.95) {
cat("Rechazamos H0 al 5%. La serie es estacionaria.\n")
} else if (tau < -1.62) {
cat("Rechazamos H0 al 10%. La serie es estacionaria.\n")
} else {
cat("No se rechaza H0. La serie tiene raíz unitaria.\n")
}## Rechazamos H0 al 1%. La serie es estacionaria.
B. Prueba Dickey-Fuller con Constante (Sin tendencia)
Se requiere analizar el tipo de cambio nominal (USD/MXN) para verificar si es estacionario alrededor de un promedio constante. Esto es importante porque, si tiene una raíz unitaria, los cambios en el tipo de cambio pueden tener efectos persistentes.
# Cargar librerías necesarias
library(ggplot2)
library(knitr)
library(urca)
library(tseries)
# Simulación de tipo de cambio nominal
set.seed(123)
tipo_cambio <- cumsum(rnorm(100, mean = 0, sd = 0.5)) + 20 # Base en 20
# Implementación de la prueba de Dickey-Fuller con constante
df.test.constante <- function(serie) {
delta_y <- diff(serie) # Diferencias de la serie
y_lag <- serie[-length(serie)] # Serie rezagada
# Modelo con constante
modelo <- lm(delta_y ~ y_lag)
# Coeficiente y estadístico tau
beta <- coef(modelo)["y_lag"]
se_beta <- summary(modelo)$coefficients["y_lag", "Std. Error"]
tau <- beta / se_beta
# Valores críticos de Dickey-Fuller para n = 100
valores_criticos <- c(-3.51, -2.89, -2.58) # Para niveles de significancia 1%, 5%, 10%
# Determinar si se rechaza H0
decision <- ifelse(tau < valores_criticos[2], "Rechaza H0: La serie es estacionaria",
"No rechaza H0: La serie tiene raíz unitaria")
return(list(estadistico = tau, valores_criticos = valores_criticos, decision = decision, modelo = summary(modelo)))
}
# Aplicar la prueba
resultado_constante <- df.test.constante(tipo_cambio)
# Imprimir resultados
cat("Estadístico Tau:", resultado_constante$estadistico, "\n")## Estadístico Tau: -1.149443
## Valores críticos (1%, 5%, 10%): -3.51 -2.89 -2.58
## Decisión: No rechaza H0: La serie tiene raíz unitaria
# Calcular la diferencia de la serie
diferencia_tipo_cambio <- diff(tipo_cambio)
# Crear un data frame para graficar el tipo de cambio
datos <- data.frame(
Tiempo = 1:length(tipo_cambio),
Tipo_Cambio = tipo_cambio
)
# Crear un data frame para graficar la diferencia
datos_diferencia <- data.frame(
Tiempo = 2:length(tipo_cambio), # Ajustar el tiempo para las diferencias
Diferencia = diferencia_tipo_cambio # Sin NA inicial
)
# Graficar el tipo de cambio
grafico_original <- ggplot(datos, aes(x = Tiempo, y = Tipo_Cambio)) +
geom_line(color = "blue") +
theme_minimal() +
labs(title = "Evolución del Tipo de Cambio Simulado",
x = "Tiempo",
y = "Tipo de Cambio")
# Graficar la primera diferencia
grafico_diferencia <- ggplot(datos_diferencia, aes(x = Tiempo, y = Diferencia)) +
geom_line(color = "red") +
theme_minimal() +
labs(title = "Primera Diferencia del Tipo de Cambio",
x = "Tiempo",
y = "Diferencia")
# Mostrar gráficos
print(grafico_original)C. Prueba Dickey-Fuller con Tendencia
Se analiza el crecimiento del Producto Interno Bruto (PIB) de un país asiático a lo largo del tiempo, por lo que es importante determinar si el PIB sigue una tendencia a largo plazo y si es estacionario, ya que esto puede influir en las decisiones de política económica. La prueba de Dickey-Fuller con tendencia permitirá evaluar si el PIB tiene una raíz unitaria.
# Instalar y cargar las librerías necesarias
# install.packages("urca") # Descomentar si no está instalado
library(urca)
# Simulación de datos: Generar una serie temporal con tendencia
set.seed(123)
n <- 100
time <- 1:n
trend <- 0.5 * time # Tendencia lineal
noise <- rnorm(n) # Ruido aleatorio
gdp_series <- trend + noise # Serie temporal combinada
# Graficar la serie temporal original
plot(gdp_series, type = "l", main = "Serie Temporal del PIB con Tendencia",
xlab = "Tiempo", ylab = "PIB", col = "blue", lwd = 2)
grid()# Aplicar la prueba de Dickey-Fuller con tendencia
df_result <- ur.df(gdp_series, type = "trend", lags = 0)
# Resumen de los resultados
summary(df_result)##
## ###############################################
## # 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
## -2.47426 -0.56919 -0.02435 0.62933 2.04214
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.48562 0.18683 2.599 0.0108 *
## z.lag.1 -1.03357 0.10284 -10.051 <2e-16 ***
## tt 0.51908 0.05186 10.010 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9219 on 96 degrees of freedom
## Multiple R-squared: 0.513, Adjusted R-squared: 0.5029
## F-statistic: 50.56 on 2 and 96 DF, p-value: 1.002e-15
##
##
## Value of test-statistic is: -10.0506 43.2355 50.5646
##
## 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
# Diferenciación para hacer la serie estacionaria
gdp_diff <- diff(gdp_series)
# Graficar la serie temporal diferenciada (estacionaria)
plot(gdp_diff, type = "l", main = "Serie Temporal del PIB (Diferenciada)",
xlab = "Tiempo", ylab = "Diferencia del PIB", col = "red", lwd = 2)
grid()# Aplicar la prueba de Dickey-Fuller a la serie diferenciada
df_diff_result <- ur.df(gdp_diff, type = "none", lags = 0)
# Resumen de los resultados de la prueba sobre la serie diferenciada
summary(df_diff_result)##
## ###############################################
## # 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
## -2.1787 -0.0172 0.5199 1.2815 3.7830
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -1.27151 0.09755 -13.03 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.351 on 97 degrees of freedom
## Multiple R-squared: 0.6365, Adjusted R-squared: 0.6328
## F-statistic: 169.9 on 1 and 97 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.034
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.6 -1.95 -1.61
# Extraer el estadístico de prueba y los valores críticos para la serie diferenciada
test_statistic_diff <- df_diff_result@teststat
critical_values_diff <- df_diff_result@cval
# Mostrar resultados relevantes para la serie diferenciada
cat("Estadístico de prueba DF (diferenciado):", test_statistic_diff, "\n")## Estadístico de prueba DF (diferenciado): -13.03397
## Valores críticos (diferenciado):
## 1pct 5pct 10pct
## tau1 -2.6 -1.95 -1.61
En la primera prueba, cuando no estaba diferenciado, la serie tiene raiz unitaria, por eso el primer grafico tiene tendencia, al aplicarle la diferencia la serie se vuelve estacionaria en la segunda prueba.
Por ejemplo para la segunda prueba con la serie diferenciada (estacionaria) el estadístico de prueba (-13.034) es mucho menor (más negativo) que el valor crítico al nivel del 1% (-2.6), por lo que se puede rechazar la hipótesis nula de que hay una raíz unitaria en la serie temporal.Es decir que la serie temporal es estacionaria, y no tiene una raíz unitaria, lo cual sugiere que las fluctuaciones en la serie son estables y no persistentes a lo largo del tiempo
Por lo tanto la prueba ha proporcionado evidencia sólida para concluir que la serie analizada es estacionaria en este contexto específico.
D. Prueba Dickey-Fuller con Constante y Tendencia
Se requiere analizar el PIB real de un país para determinar si tiene una raíz unitaria, considerando que el PIB suele tener una tendencia creciente a largo plazo.
# Simulación de PIB real con tendencia
set.seed(456)
tiempo <- 1:100
pib_real <- 0.5 * tiempo + cumsum(rnorm(100, mean = 0, sd = 2)) # Tendencia + ruido
# Implementación de df.test con constante y tendencia
df.test.tendencia <- function(serie) {
delta_y <- diff(serie)
y_lag <- serie[-length(serie)] # Serie rezagada
tiempo <- 1:length(y_lag) # Tendencia
modelo <- lm(delta_y ~ y_lag + tiempo) # Incluye constante y tendencia
beta <- coef(modelo)["y_lag"]
se_beta <- summary(modelo)$coefficients["y_lag", "Std. Error"]
tau <- beta / se_beta
return(list(estadistico = tau, modelo = summary(modelo)))
}
# Aplicar la prueba
resultado_tendencia <- df.test.tendencia(pib_real)
print(resultado_tendencia$estadistico)## y_lag
## -2.524849
# Simulación de PIB real con tendencia
set.seed(456)
tiempo <- 1:100
pib_real <- 0.5 * tiempo + cumsum(rnorm(100, mean = 0, sd = 2))
# Gráfico de la serie
plot(pib_real, type = "l", col = "purple", lwd = 2,
main = "PIB Real con Tendencia",
xlab = "Tiempo", ylab = "PIB Real")
abline(lm(pib_real ~ tiempo), col = "red", lty = 2) # Línea de tendencia# Cargar librerías necesarias
library(ggplot2)
library(gridExtra)
# Simulación de PIB real con tendencia
set.seed(456)
tiempo <- 1:100
pib_real <- 0.5 * tiempo + cumsum(rnorm(100, mean = 0, sd = 2)) # Tendencia + ruido
# Implementación de df.test con constante y tendencia
df.test.tendencia <- function(serie, alpha = 0.05) {
delta_y <- diff(serie)
y_lag <- serie[-length(serie)] # Serie rezagada
tiempo <- 1:length(y_lag) # Tendencia
modelo <- lm(delta_y ~ y_lag + tiempo) # Incluye constante y tendencia
# Coeficientes del modelo
beta <- coef(modelo)["y_lag"]
se_beta <- summary(modelo)$coefficients["y_lag", "Std. Error"]
# Estadístico t (tau)
tau <- beta / se_beta
# Valor p para la prueba de hipótesis
df_residuals <- modelo$df.residual
p_value <- 2 * pt(-abs(tau), df_residuals) # Prueba bilateral
# Decisión sobre la hipótesis nula
if (p_value < alpha) {
decision <- "Rechazamos la hipótesis nula: la serie es estacionaria."
} else {
decision <- "No rechazamos la hipótesis nula: la serie no es estacionaria."
}
return(list(estadistico = tau, p_value = p_value, decision = decision, modelo = summary(modelo), residuos = residuals(modelo)))
}
# Aplicar la prueba
resultado_tendencia <- df.test.tendencia(pib_real)
# Imprimir resultados
cat("Estadístico t (tau):", resultado_tendencia$estadistico, "\n")## Estadístico t (tau): -2.524849
## Valor p: 0.01321394
## Decisión: Rechazamos la hipótesis nula: la serie es estacionaria.
# Gráfico de la serie temporal del PIB real
pib_df <- data.frame(tiempo = tiempo, pib_real = pib_real)
grafico_original <- ggplot(pib_df, aes(x = tiempo, y = pib_real)) +
geom_line(color = "blue") +
geom_point() +
labs(title = "Simulación de PIB Real con Tendencia",
x = "Tiempo",
y = "PIB Real") +
theme_minimal()
# Gráfico de los residuos del modelo
residuos_df <- data.frame(tiempo = tiempo[-1], residuos = resultado_tendencia$residuos)
grafico_ajustado <- ggplot(residuos_df, aes(x = tiempo, y = residuos)) +
geom_line(color = "red") +
geom_point() +
labs(title = "Residuos del Modelo (Dickey-Fuller)",
x = "Tiempo",
y = "Residuos") +
theme_minimal()
# Mostrar ambos gráficos en un solo layout
grid.arrange(grafico_original, grafico_ajustado, ncol = 2)II. Prueba de Cointegración de Johansen
Cointegración en el enfoque de Søren Johansen
2.1 Próposito de la prueba
La prueba de cointegración de Johansen se utiliza para identificar relaciones de equilibrio a largo plazo entre dos o más series temporales no estacionarias integradas del mismo orden (generalmente I(1)). Es particularmente útil cuando las variables tienen tendencias comunes y queremos confirmar si existe una combinación lineal estacionaria entre ellas.
2.2 Hipótesis de la prueba
La prueba de Johansen considera las siguientes hipótesis, dependiendo del enfoque (traza o valor propio máximo):
⦿ Hipótesis nula (H0): No existe cointegración, o el número de relaciones de cointegración es igual a r.
⦿ Hipótesis alternativa (𝐻1): Existe cointegración.
•Para la prueba de traza: El número de relaciones de cointegración es mayor que r.
•Para el valor propio máximo: Existe r+1 relaciones de cointegración.
Explicación sobre la hipótesis nula y alternativa
La hipótesis nula se basa en la ausencia de cointegración, ya que queremos verificar si las series se mueven juntas en el largo plazo. El rechazo de 𝐻0 sugiere evidencia de relaciones cointegradas.
2.3 Sintaxis de implementación en R
Se utiliza la función ca.jo() del paquete urca. Su estructura principal es la siguiente:
library(urca)
# Generar datos de ejemplo
set.seed(123)
X <- cumsum(rnorm(100)) # Serie temporal 1
Y <- 0.5 * X + cumsum(rnorm(100, sd = 0.5)) # Serie temporal 2
# Combinar las series en una matriz
data <- cbind(X, Y)
# Prueba de cointegración de Johansen
johansen_test <- ca.jo(data, type = "trace", ecdet = "const", K = 2)
# Resumen de resultados
summary(johansen_test)##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: trace statistic , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 1.072486e-01 2.318156e-02 4.625767e-18
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 1 | 2.30 7.52 9.24 12.97
## r = 0 | 13.42 17.85 19.96 24.60
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## X.l2 Y.l2 constant
## X.l2 1.000000 1.0000000 1.000000
## Y.l2 -3.307289 0.3364121 -0.904584
## constant -14.108442 -2.7209703 -2.704134
##
## Weights W:
## (This is the loading matrix)
##
## X.l2 Y.l2 constant
## X.d -0.01843043 -0.04778993 1.380371e-17
## Y.d 0.02200934 -0.03023045 4.320676e-18
•data: Matriz de las series temporales que se desean analizar.
•type: Especifica el tipo de prueba a realizar:
•“trace”: Prueba de traza.
•“eigen”: Prueba de valor propio máximo.
•ecdet: Indica el modelo para los datos:
•“none”: Sin término constante.
•“const”: Incluye término constante en el modelo.
•“trend”: Incluye término de tendencia lineal.
•K: Número de rezagos en el modelo VAR subyacente.
2.4 Estadístico de prueba
El estadístico de prueba incluye:
•Estadístico de traza:
•Estadístico de valor propio máximo:
Donde es el tamaño de la muestra y son los valores propios estimados.En la salida de R, estos estadísticos se muestran junto con sus valores críticos para diferentes niveles de significancia ().
2.5 Criterio de decisión
1. Comparar el estadístico de prueba con los valores críticos:
•Si el estadístico es mayor que el valor crítico, se rechaza .
•De lo contrario, no se rechaza .
2. Según el número de relaciones cointegradas encontradas.
2.6 Interpretación del rechazo o no rechazo de hipótesis nula
•Rechazo de 𝐻0: Existe evidencia de al menos una relación de cointegración entre las variables, indicando que se mueven juntas en el largo plazo.
•No rechazo de 𝐻0: No hay evidencia suficiente para afirmar que las variables están cointegradas.
2.7 Ejemplo de ejercicio práctico de la prueba de cointegración de Johansen
Contexto del ejercicio
Supongamos que queremos analizar la relación a largo plazo entre dos series económicas simuladas:
Los precios de un bien Xt
La cantidad demandada de ese bien Yt
Queremos determinar si estas dos series tienen una relación de equilibrio a largo plazo.
Pasos a seguir:
2.7.1 Carga de datos o generación de datos simulados
Creamos dos series temporales no estacionarias 𝑋_𝑡 y 𝑌_𝑡,donde 𝑌_𝑡 depende parcialmente de 𝑋_𝑡
# Configuración inicial
set.seed(42) # Para reproducibilidad
# Serie 1: Precios
X <- cumsum(rnorm(200, mean = 0.5)) # Tendencia con ruido
# Serie 2: Cantidad demandada (relacionada con X)
Y <- 0.8 * X + cumsum(rnorm(200, sd = 2)) # Dependencia + ruido
# Combinar en una matriz
data <- cbind(X, Y)
print(data)## X Y
## [1,] 1.870958 -2.5050917
## [2,] 1.806260 -1.8892959
## [3,] 2.669389 1.1438571
## [4,] 3.802251 6.1692257
## [5,] 4.706520 4.1389172
## [6,] 5.100395 2.1523064
## [7,] 7.111917 2.3498812
## [8,] 7.517258 0.5660424
## [9,] 10.035682 1.2892939
## [10,] 10.472968 1.2683667
## [11,] 12.277837 0.3098184
## [12,] 15.064483 6.6130790
## [13,] 14.175622 6.1175399
## [14,] 14.396833 6.1262927
## [15,] 14.763512 7.4108749
## [16,] 15.899462 8.3944656
## [17,] 16.115209 8.3028872
## [18,] 13.958754 9.5312977
## [19,] 12.018287 7.5448638
## [20,] 13.838400 6.4337500
## [21,] 14.031762 7.3597749
## [22,] 12.750453 5.6317024
## [23,] 13.078536 4.8505764
## [24,] 14.793211 4.0860537
## [25,] 17.188404 6.8589403
## [26,] 17.257935 6.5665285
## [27,] 17.500666 7.7920485
## [28,] 16.237503 6.3127875
## [29,] 17.197600 5.7638585
## [30,] 17.057605 8.1523358
## [31,] 18.013055 8.3731685
## [32,] 19.217893 11.2329423
## [33,] 20.752996 10.0578603
## [34,] 20.644070 9.0384870
## [35,] 21.649025 9.3037483
## [36,] 20.432016 7.5482105
## [37,] 20.147557 10.0180574
## [38,] 19.796649 9.6918019
## [39,] 17.882442 8.6488875
## [40,] 18.418564 7.1930421
## [41,] 19.124563 6.2994065
## [42,] 19.263506 8.4066984
## [43,] 20.521669 11.9301924
## [44,] 20.294964 14.2465559
## [45,] 19.426683 10.7906569
## [46,] 20.359501 15.6368327
## [47,] 20.048108 17.4214639
## [48,] 21.992209 18.9233099
## [49,] 22.060763 20.3853685
## [50,] 23.216411 19.3671164
## [51,] 24.038336 17.8323441
## [52,] 23.754497 17.7033739
## [53,] 25.830225 16.9669642
## [54,] 26.973124 18.2613216
## [55,] 27.562885 21.3285419
## [56,] 28.339435 19.8820351
## [57,] 29.518724 19.3485846
## [58,] 30.108557 19.9135788
## [59,] 27.615467 15.8839145
## [60,] 28.400350 15.7452529
## [61,] 28.533115 17.5969761
## [62,] 29.218346 20.0842505
## [63,] 30.300170 21.7174028
## [64,] 32.199907 19.5340810
## [65,] 31.972614 19.2442539
## [66,] 33.775157 22.8158344
## [67,] 34.611005 25.1109030
## [68,] 36.149511 25.9600749
## [69,] 37.570240 21.6967981
## [70,] 38.791118 22.7954339
## [71,] 38.247999 23.5084422
## [72,] 38.657813 23.9279002
## [73,] 39.781331 25.1415398
## [74,] 39.327808 25.6418519
## [75,] 39.284979 24.8144894
## [76,] 40.365975 28.2992430
## [77,] 41.634154 30.2545728
## [78,] 42.597922 28.5402464
## [79,] 42.212145 30.9947762
## [80,] 41.612364 32.9238694
## [81,] 43.625071 36.1821829
## [82,] 44.382993 33.4632613
## [83,] 44.971433 32.7954008
## [84,] 45.350536 34.3697112
## [85,] 44.656208 33.9016921
## [86,] 45.768204 35.4873142
## [87,] 46.051065 40.6327894
## [88,] 46.368308 39.2498234
## [89,] 47.801654 36.1701002
## [90,] 49.123427 37.7749093
## [91,] 51.015544 37.9134087
## [92,] 51.039370 38.8245516
## [93,] 52.189718 38.1200610
## [94,] 54.080829 44.0570604
## [95,] 53.470040 43.3210173
## [96,] 53.109247 42.0777122
## [97,] 52.477509 41.2397983
## [98,] 51.518295 42.1975539
## [99,] 52.098277 42.8562209
## [100,] 53.251482 40.5275509
## [101,] 54.952447 41.8790817
## [102,] 56.497198 44.6353669
## [103,] 55.993989 44.3107818
## [104,] 58.342471 47.6597116
## [105,] 58.175698 47.2333476
## [106,] 58.781212 47.6019840
## [107,] 58.858956 48.6289182
## [108,] 59.236606 50.9169253
## [109,] 59.924799 48.9746888
## [110,] 60.543960 49.4030425
## [111,] 61.018867 49.6410441
## [112,] 61.626940 48.6096610
## [113,] 61.641505 46.5525940
## [114,] 61.637287 45.2877564
## [115,] 60.476188 45.5324926
## [116,] 60.593855 44.7939803
## [117,] 60.581204 43.2140845
## [118,] 63.783095 46.1024299
## [119,] 62.920979 42.9393085
## [120,] 63.558235 45.5408610
## [121,] 62.564610 43.7767701
## [122,] 61.594175 43.3786791
## [123,] 62.218877 43.9804537
## [124,] 61.722238 43.5826611
## [125,] 62.220415 47.5999671
## [126,] 62.292156 46.0067040
## [127,] 62.178485 48.2067077
## [128,] 60.653807 47.0501118
## [129,] 59.929059 44.7999018
## [130,] 60.608575 45.2059876
## [131,] 61.676196 47.5536275
## [132,] 61.683319 46.7082881
## [133,] 62.183381 45.5641740
## [134,] 63.806271 47.1680139
## [135,] 65.746127 50.6970922
## [136,] 65.149013 50.0724845
## [137,] 65.531694 47.6045758
## [138,] 67.233192 46.3524227
## [139,] 67.263462 44.8398484
## [140,] 67.710993 44.1436565
## [141,] 68.124886 44.4319165
## [142,] 67.737207 45.4627695
## [143,] 67.792523 44.6377882
## [144,] 68.263078 42.7864727
## [145,] 68.349209 44.0695896
## [146,] 69.962595 45.9112124
## [147,] 69.981602 48.2411123
## [148,] 70.048433 44.9296153
## [149,] 71.245296 46.0617435
## [150,] 70.688927 48.3233726
## [151,] 71.148229 50.1391614
## [152,] 70.096684 47.6328199
## [153,] 71.763853 50.4316125
## [154,] 71.990208 48.8688422
## [155,] 72.022362 47.9877709
## [156,] 71.284110 49.7722376
## [157,] 71.776348 49.5857374
## [158,] 71.476066 51.0026039
## [159,] 71.442573 50.3933547
## [160,] 73.230249 48.6707700
## [161,] 73.554723 47.2327180
## [162,] 72.982940 44.5982523
## [163,] 73.646147 44.1602367
## [164,] 73.783409 43.5974235
## [165,] 74.873422 44.1627186
## [166,] 76.805844 45.2221617
## [167,] 76.313152 48.6124118
## [168,] 77.267802 46.6041353
## [169,] 77.852700 46.2424052
## [170,] 79.248266 48.0570207
## [171,] 79.518488 51.5300827
## [172,] 80.855107 52.7764218
## [173,] 79.610051 54.2586785
## [174,] 81.799510 52.7211345
## [175,] 83.164288 56.7056700
## [176,] 83.513512 55.6039288
## [177,] 82.564505 54.2918610
## [178,] 83.707513 52.9874304
## [179,] 84.690707 54.0417241
## [180,] 85.184352 58.0073177
## [181,] 85.835808 63.3728092
## [182,] 85.751699 61.1518642
## [183,] 86.620505 62.8187918
## [184,] 87.415160 66.2315587
## [185,] 87.635900 66.0168376
## [186,] 86.799664 64.9114987
## [187,] 88.000412 65.2625418
## [188,] 89.054609 67.3015646
## [189,] 88.718302 69.8273781
## [190,] 87.623714 70.3269471
## [191,] 88.328673 71.5312900
## [192,] 88.483585 71.0514798
## [193,] 89.236197 72.6502665
## [194,] 88.442194 70.9159907
## [195,] 87.983024 69.9901413
## [196,] 89.568799 73.4517881
## [197,] 90.472573 75.0588342
## [198,] 91.559061 76.4100568
## [199,] 93.874289 77.7510243
## [200,] 94.503111 80.1161472
# Visualización de las series
plot.ts(data, col = c("blue", "red"), main = "Series Temporales Simuladas - Tendencia", ylab = "Valores", xlab = "Tiempo")
legend("topright", legend = c("Precios (X)", "Cantidad Demandada (Y)"), col = c("blue", "red"), lty = 1)En la representación gráfica se puede observar que para la serie de precios y cantidad demanda existe tendencia e incluso se puede inferir que los residuales no van a ser estacionarios.
2.7.2 Verificación de estacionariedad mediante la prueba de Dickey-Fuller
##
## Call:
## lm(formula = Y ~ X)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.6549 -2.8443 -0.1197 2.8233 10.5942
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.34162 0.67187 -4.974 1.42e-06 ***
## X 0.77102 0.01196 64.453 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.365 on 198 degrees of freedom
## Multiple R-squared: 0.9545, Adjusted R-squared: 0.9543
## F-statistic: 4154 on 1 and 198 DF, p-value: < 2.2e-16
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -10.6549 -2.8443 -0.1197 0.0000 2.8233 10.5942
# Crear un data frame para los valores ajustados y los residuos
df_residuos <- data.frame(
Fitted = modelopd$fitted.values,
Residuals = residuales2
)
# Graficar residuos vs valores ajustados
ggplot(df_residuos, aes(x = Fitted, y = Residuals)) +
geom_point() +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs(title = "Gráfico de Residuos",
x = "Valores Ajustados",
y = "Residuos") +
theme_minimal()Con esta visualización del gráfico de residuos se insiste que los valores no son estacionarios, porque los residuos no están distribuidos aleatoriamente alrededor de la línea horizontal en cero, lo que sugiere que el modelo no está bien especificado, o mejor dicho las variables no estan cointegradas.
Aunque la no estacionariedad se ha observado a simple vista es necesario probarlo mediante la prueba de raíz unitaria de Dickey & Fuller
2.7.2.1 Prueba de raíz unitaria de Dickey & Fuller con tendencia
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression trend
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.2564 -1.3546 -0.0851 1.3454 5.1771
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.080213 0.267944 -0.299 0.7650
## z.lag.1 -0.078124 0.031787 -2.458 0.0149 *
## tt 0.001291 0.002321 0.556 0.5788
## z.diff.lag -0.005399 0.072952 -0.074 0.9411
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.861 on 194 degrees of freedom
## Multiple R-squared: 0.03495, Adjusted R-squared: 0.02003
## F-statistic: 2.342 on 3 and 194 DF, p-value: 0.07448
##
##
## Value of test-statistic is: -2.4577 2.2517 3.2897
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau3 -3.99 -3.43 -3.13
## phi2 6.22 4.75 4.07
## phi3 8.43 6.49 5.47
Hipótesis de la prueba ADF
H0: La serie tiene una raíz unitaria (no es estacionaria).
H1: La serie no tiene raíz unitaria (es estacionaria).
Interpretación del valor p_value y el estadístico de prueba de la raíz unitaria de Dickey & Fuller con tendencia.
Si 𝑝< 0.05: Se rechaza H0 , concluyendo que la serie es estacionaria.
Estadística de prueba ≤ valor crítico: Se rechaza H0 , concluyendo que la serie es estacionaria.
Si 𝑝≥ 0.05: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Estadística de prueba > valor crítico: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Interpretación del resultado
Al tener una estadística de prueba de -2.4577 mayor que el valor crítico de -3.99, no se puede rechazar la H0, concluyendo que la serie no es estacionaria.
Además, el valor p-value de 0.07448 > 0.05, sugiere que no hay suficiente evidencia para rechazar la hipótesis nula, por lo que se concluye que la serie es no estacionaria.
2.7.2.2 Prueba de raíz unitaria de Dickey & Fuller con constante”
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.2956 -1.3867 -0.0787 1.3951 5.1615
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.049349 0.132074 0.374 0.7091
## z.lag.1 -0.079392 0.031649 -2.508 0.0129 *
## z.diff.lag -0.003173 0.072713 -0.044 0.9652
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.858 on 195 degrees of freedom
## Multiple R-squared: 0.03342, Adjusted R-squared: 0.0235
## F-statistic: 3.371 on 2 and 195 DF, p-value: 0.03638
##
##
## Value of test-statistic is: -2.5085 3.2344
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.46 -2.88 -2.57
## phi1 6.52 4.63 3.81
Hipótesis de la prueba ADF
H0: La serie tiene una raíz unitaria (no es estacionaria).
H1: La serie no tiene raíz unitaria (es estacionaria).
Interpretación del valor p_value y el estadístico de prueba de la raíz unitaria de Dickey & Fuller con constante.
Si 𝑝< 0.05: Se rechaza H0 , concluyendo que la serie es estacionaria.
Estadística de prueba ≤ valor crítico: Se rechaza H0 , concluyendo que la serie es estacionaria.
Si 𝑝≥ 0.05: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Estadística de prueba > valor crítico: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Interpretación del resultado
Al tener una estadística de prueba de -2.5085 mayor que el valor crítico de -3.46, no se puede rechazar la H0, concluyendo que la serie no es estacionaria.
Sin embargo, el valor p-value de 0.03 < 0.05, sugiere que hay suficiente evidencia para rechazar la hipótesis nula, por lo que requiere de un análisis más riguroso para concluir que la serie es o no estacionaria.
2.7.2.3 Prueba de raíz unitaria de Dickey & Fuller sin constante y sin tendencia”
##
## ###############################################
## # 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
## -5.246 -1.337 -0.028 1.445 5.211
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.079609 0.031574 -2.521 0.0125 *
## z.diff.lag -0.002389 0.072523 -0.033 0.9738
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.853 on 196 degrees of freedom
## Multiple R-squared: 0.0335, Adjusted R-squared: 0.02364
## F-statistic: 3.397 on 2 and 196 DF, p-value: 0.03545
##
##
## Value of test-statistic is: -2.5213
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.58 -1.95 -1.62
Hipótesis de la prueba ADF
H0: La serie tiene una raíz unitaria (no es estacionaria).
H1: La serie no tiene raíz unitaria (es estacionaria).
Interpretación del valor p_value y el estadístico de prueba de la raíz unitaria de Dickey & Fuller sin constante y sin tendencia.
Si 𝑝< 0.05: Se rechaza H0 , concluyendo que la serie es estacionaria.
Estadística de prueba ≤ valor crítico: Se rechaza H0 , concluyendo que la serie es estacionaria.
Si 𝑝≥ 0.05: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Estadística de prueba > valor crítico: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Interpretación del resultado
Al tener una estadística de prueba de -2.5213 mayor que el valor crítico de -2.58, no se puede rechazar la H0, concluyendo que la serie no es estacionaria.
Además, el valor p-value de 0.03 < 0.05, sugiere que hay suficiente evidencia para rechazar la hipótesis nula, pero el estadístico de prueba afirma lo contrario, por lo que se requiere de un análisis más riguroso para concluir que la serie es o no estacionaria.
En general, los resultados son contradictorios entre las diferentes pruebas, la primera sugiere que la serie es no estacionaria, mientras que la segunda y la tercera queda a la espectativa. Dada esta inconsistencia, se realiza un análisis adicional para determinar si las series son realmente estacionarias.
2.7.3.- Verificación de estacionariedad mediante la prueba KPSS (Kwiatkowski-Phillips-Schmidt-Shin)
library(tseries)
library(knitr)
library(urca)
# Configuración inicial
set.seed(42) # Para reproducibilidad
# Serie 1: Precios
X <- cumsum(rnorm(200, mean = 0.5)) # Tendencia con ruido
# Serie 2: Cantidad demandada (relacionada con X)
Y <- 0.8 * X + cumsum(rnorm(200, sd = 2)) # Dependencia + ruido
# Combinar en una matriz
data <- cbind(X, Y)
# Instalar y cargar el paquete fUnitRoots si no está instalado
if (!require(fUnitRoots)) {
install.packages("fUnitRoots")
}
library(fUnitRoots)
# Aplicar la prueba KPSS a cada serie
kpss_test_X <- ur.kpss(X, type = "mu", lags = "short")
kpss_test_Y <- ur.kpss(Y, type = "mu", lags = "short")
# Mostrar resultados de la prueba KPSS para X
cat("Resultados de la prueba KPSS para la serie X:\n")## Resultados de la prueba KPSS para la serie X:
##
## #######################
## # KPSS Unit Root Test #
## #######################
##
## Test is of type: mu with 4 lags.
##
## Value of test-statistic is: 4.067
##
## Critical value for a significance level of:
## 10pct 5pct 2.5pct 1pct
## critical values 0.347 0.463 0.574 0.739
# Mostrar resultados de la prueba KPSS para Y
cat("\nResultados de la prueba KPSS para la serie Y:\n")##
## Resultados de la prueba KPSS para la serie Y:
##
## #######################
## # KPSS Unit Root Test #
## #######################
##
## Test is of type: mu with 4 lags.
##
## Value of test-statistic is: 3.8217
##
## Critical value for a significance level of:
## 10pct 5pct 2.5pct 1pct
## critical values 0.347 0.463 0.574 0.739
Hipótesis de la prueba KPSS
H0: La serie temporal es estacionaria.
H1: La serie temporal no es estacionaria.
Interpretación del estadístico de prueba de KPSS (Kwiatkowski-Phillips-Schmidt-Shin)
Estadística de prueba > valor crítico: Se rechaza la H0 , concluyendo que la serie es no estacionaria.
Estadística de prueba < valor crítico: No se puede rechazar H0, concluyendo que la serie es estacionaria.
Interpretación del resultado
El estadístico de prueba para X es (4.067), por lo que es mucho mayor que todos los valores críticos (0.347, 0.463, 0.574, y 0.739), dado que el estadístico de prueba excede el valor crítico al nivel de significancia del 1%, 2.5%, 5% y 10%, rechazamos la hipótesis nula (H0).Esto indica que la serie X es no estacionaria
El estadístico de prueba para Y es 3.8217, también es mayor que todos los valores críticos (0.347, 0.463, 0.574, y 0.739). Al igual que en el caso anterior, dado que el estadístico de prueba excede el valor crítico al nivel de significancia del 1%, 2.5%, 5% y 10%, también rechazamos la hipótesis nula (H0). Esto indica que la serie Y es no estacionaria y sugiere que tiene una raíz unitaria.
Dado que ambas series han sido identificadas como no estacionarias, es recomendable diferenciarlas antes de proceder a realizar pruebas de cointegración, como la prueba de Johansen.
Por tanto la diferenciación puede ayudar a convertir las series en estacionarias, lo cual es un requisito previo para llevar a cabo el análisis posterior sobre cointegración
2.7.4- Aplicación de la diferenciación para volver las series no estacionarias a estacionarias
# Diferenciar las series
diff_X <- diff(X)
diff_Y <- diff(Y)
# Combinar las series diferenciadas en una matriz
data_diff <- cbind(diff_X, diff_Y)
print(head(data_diff,n = 20))## diff_X diff_Y
## [1,] -0.06469817 0.615795858
## [2,] 0.86312841 3.033152984
## [3,] 1.13286260 5.025368569
## [4,] 0.90426832 -2.030308538
## [5,] 0.39387548 -1.986610744
## [6,] 2.01152200 0.197574808
## [7,] 0.40534096 -1.783838795
## [8,] 2.51842371 0.723251525
## [9,] 0.43728590 -0.020927215
## [10,] 1.80486965 -0.958548378
## [11,] 2.78664539 6.303260648
## [12,] -0.88886070 -0.495539071
## [13,] 0.22121123 0.008752786
## [14,] 0.36667866 1.284582214
## [15,] 1.13595040 0.983590691
## [16,] 0.21574708 -0.091578411
## [17,] -2.15645542 1.228410510
## [18,] -1.94046693 -1.986433963
## [19,] 1.82011335 -1.111113732
## [20,] 0.19336141 0.926024906
# Prueba de estacionariedad para las series diferenciadas
adf_dX <- adf.test(diff_X)
cat("\nPrueba de ADF para diff_X (diferenciada):\n")##
## Prueba de ADF para diff_X (diferenciada):
##
## Augmented Dickey-Fuller Test
##
## data: diff_X
## Dickey-Fuller = -5.7498, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
##
## Prueba de ADF para diff_Y (diferenciada):
##
## Augmented Dickey-Fuller Test
##
## data: diff_Y
## Dickey-Fuller = -6.1269, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
Interpretación de los resultados obtenidos de la prueba ADF para X e Y diferenciada.
Tanto para X e Y el 𝑝_value < 0.05, por tanto se puede rechazar la 𝐻0, concluyendo que las series son estacionarias.
2.7.5 Aplicar la prueba de cointegración de Johansen
2.7.5.1 Mediante la prueba de la traza
Cargamos el paquete urca y realizamos la prueba:
# Cargar librería
library(urca)
# Prueba de Johansen (cointegración)
johansen_test1 <- ca.jo(data_diff, type = "trace", ecdet = "const", K = 2)
# Resumen de los resultados
summary(johansen_test1)##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: trace statistic , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 4.111258e-01 3.175732e-01 -1.110223e-16
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 1 | 75.27 7.52 9.24 12.97
## r = 0 | 179.59 17.85 19.96 24.60
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## diff_X.l2 diff_Y.l2 constant
## diff_X.l2 1.000000 1.00000000 1.000000
## diff_Y.l2 -4.435646 -0.09569912 -0.292463
## constant 1.310506 -0.42824656 73.684357
##
## Weights W:
## (This is the loading matrix)
##
## diff_X.l2 diff_Y.l2 constant
## diff_X.d 0.0388156 -0.96193083 -1.921805e-18
## diff_Y.d 0.2811781 -0.09612605 6.972658e-19
Resultado de la prueba de traza
Interpretación:
Para r ≤ 1, el estadístico de prueba es de 75.27, mucho mayor al valor crítico al 10% (7.52), al 5% (9.24), y al 1% (12.97), lo que sugiere que hay al menos una relación de cointegración.
Para r = 0: el estadístico de prueba (179.59) también supera ampliamente los valores críticos, indicando que hay al menos una relación de cointegración entre las series. Por lo tanto dado que para r = 0, y r ≤ 1 se rechaza la hipótesis nula, podemos concluir que hay al menos dos relaciones de cointegración entre las series bajo el contexto del método de traza.
2.7.5.2 Mediante la prueba de eigenvalue máximo
Cargamos el paquete urca y realizamos la prueba:
# Cargar librería
library(urca)
# Prueba de Johansen (cointegración)
johansen_test2 <- ca.jo(data_diff, type = "eigen", ecdet = "const", K = 2)
# Resumen de los resultados
summary(johansen_test2)##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: maximal eigenvalue statistic (lambda max) , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 4.111258e-01 3.175732e-01 -1.110223e-16
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 1 | 75.27 7.52 9.24 12.97
## r = 0 | 104.32 13.75 15.67 20.20
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## diff_X.l2 diff_Y.l2 constant
## diff_X.l2 1.000000 1.00000000 1.000000
## diff_Y.l2 -4.435646 -0.09569912 -0.292463
## constant 1.310506 -0.42824656 73.684357
##
## Weights W:
## (This is the loading matrix)
##
## diff_X.l2 diff_Y.l2 constant
## diff_X.d 0.0388156 -0.96193083 -1.921805e-18
## diff_Y.d 0.2811781 -0.09612605 6.972658e-19
Hipótesis para el método de eigenvalue máximo
H0: Hay r vectores de cointegración
H1: Hay r + 1 vectores de cointegración.
Resultado de la prueba de eigenvalue máximo
Interpretación:
Para r ≤ 1, el estadístico de prueba es de 75.27, mucho mayor al valor crítico al 10% (7.52), al 5% (9.24), y al 1% (12.97),lo que sugiere que hay al menos una relación de cointegración.
Para r = 0: el estadístico de prueba (104.32) también supera ampliamente los valores críticos, indicando que hay al menos una relación de cointegración entre las series. Por lo tanto dado que para r = 0, y r ≤ 1 se rechaza la hipótesis nula, podemos concluir que hay al menos dos relaciones de cointegración entre las series bajo el contexto del método de eigenvalue máximo.
En el resumen de resultados, los puntos clave son:
Estadístico de traza: Indica si existe evidencia de relaciones cointegradas.
Valores críticos: Compara el estadístico con estos valores para tomar decisiones.
Por ejemplo, si el estadístico de traza es mayor al valor crítico al 5%, rechazamos la hipótesis nula de (sin cointegración) y concluimos que existe al menos una relación cointegrada.
De acuerdo con los resultados obtenidos:
• Como se rechaza la hipótesis nula se deduce que existe una relación de equilibrio a largo plazo entre 𝑋t y 𝑌t.
• Caso contrario si no se hubiera rechazado la hipótesis nula se deducería que no hay evidencia suficiente para afirmar que las variables están cointegradas.
III. Causalidad en el Enfoque de Granger.
Causalidad en el enfoque de Granger
3.1 Próposito de la prueba
Es un test que se utiliza para examinar si una variable pude usarse para pronosticar otra y si tiene resultado unidireccional o bidireccional.
Para ello, se tiene que comparar y deducir si el comportamiento actual y pasado de una serie temporal X predice la conducta de otra serie temporal Y. Si esto ocurre, se puede afirmar que X causa Y, y el comportamiento es unidireccional. Si de la misma manera Y ayuda en la predicción de X, la causalidad es bidireccional, afirmando que X causa Y e Y causa X.
En general tenemos lo casos siguiente:
Causalidad unidireccional de X -> Y
Causalidad unidireccional de Y -> X
Causalidad bidireccional de X <–> Y
No hay causalidad entre las variables X e Y3.2 Hipótesis de la prueba
⦿ Hipótesis nula (H0): Establece que la serie temporal X no causa Granger a la serie temporal Y, en otra palabra no contiene informacion para predecir a Y mas de lo que se puede predecir utilizando los valores pasados de Y mismo.
⦿ Hipótesis alternativa (𝐻1):
La serie temporal X causa granger a la serie temporal Y, dado a que los valores pasados de X pueden predecir los valores futuros de Y
Explicación sobre la hipótesis nula y alternativa
Hipótesis nula H0 (X no causa a Y en el sentido de Granger ).Es decir, los valores pasados de X no proporcionan información adicional significativa para predecir Y, más allá de la que ya proporcionan los valores pasados de 𝑌.
Hipótesis nula H1 (X causa a Y en el sentido de Granger), esto implica que los valores pasados de 𝑋 contienen información que mejora la predicción de Y.
3.3 Sintaxis de implementación en R
En R,usamos la función grangertest() del paquete lmtest para realizar una prueba de causalidad de Granger, que tiene la siguiente sintaxis:
grangertest(X, Y, order = p)
Dónde:
X: Esta es la primera serie de tiempo.
Y: El segundo conjunto de la serie temporal
orden: En la primera serie temporal, el número de rezagos que se utilizarán. El valor predeterminado es 1.
3.4 Estadístico de prueba
Para probar que X causa Granger Y, se debe examinar si los valores rezagados de X en la regresión de Y sobre los valores rezagados de X e Y reduce significativamente el error de varianza.Se dice que una serie temporal X es causa Granger de Y si se puede demostrar que esos valores X proporcionan información estadísticamente significativa sobre los valores futuros de Y a través de una serie de pruebas t y pruebas F(F-statistic) sobre valores rezagados de X. Dichas pruebas nos brindan un valor p(p_value) correspondiente.
Estadístico de prueba F (F-statistic): Se utiliza para comparar los modelos restringido y no restringido.
Valor p (p-value): Indica la probabilidad de obtener un resultado al menos tan extremo como el observado, bajo la hipótesis nula.
3.5 Criterio de decisión
En r, tenemos que si el valor de F-statistic es alto, indica que los valores de 𝑌 mejoran la predicción de 𝑋 o en el caso de p-value, si es menor que 0.05, se rechaza la hipótesis nula y se concluye que Y causa a 𝑋.
3.6 Interpretación del rechazo o no rechazo de hipótesis nula
Comparamos el valor F obtenido con el valor F_statistic. Si el valor F es mayor que el valor F_statistic, puede rechazar la hipótesis nula, pero antes se verifica el valor P.
Si el valor P < Nivel de significancia (el 5 % se usa ampliamente), entonces la hipótesis nula sería rechazada. Si el valor P > Nivel de significancia, entonces no se puede rechazar la hipótesis nula.
3.7 Ejemplo de ejercicio práctico en el sentido de Granger
Contexto del ejercicio
En este ejemplo utilizaremos datos EuStockMarkets, especificamente los valores de Dax y SMI, de la siguinete manera:
3.7.1 Carga de Datos
#Cargamos datos utilizando aleatoriamente los valores DAX y SMI
tsData <- EuStockMarkets[ , 1:2]
#Vemos las primeras seis filas del conjunto de datos
head(tsData)## DAX SMI
## [1,] 1628.75 1678.1
## [2,] 1613.63 1688.5
## [3,] 1606.51 1678.6
## [4,] 1621.04 1684.1
## [5,] 1618.16 1686.6
## [6,] 1610.61 1671.6
3.7.2 Verificación de estacionariedad
# Convertir a un formato de data frame para manipulación más sencilla
tsData_df <- as.data.frame(tsData)
colnames(tsData_df) <- c("DAX", "SMI") # Asignar nombres claros a las columnas
# Verificar la estacionariedad de las series (Prueba ADF)
library(tseries)
# Prueba de raíz unitaria para DAX
adf.test(tsData_df$DAX)##
## Augmented Dickey-Fuller Test
##
## data: tsData_df$DAX
## Dickey-Fuller = -0.82073, Lag order = 12, p-value = 0.9598
## alternative hypothesis: stationary
##
## Augmented Dickey-Fuller Test
##
## data: tsData_df$SMI
## Dickey-Fuller = -0.522, Lag order = 12, p-value = 0.9808
## alternative hypothesis: stationary
Hipótesis de la prueba ADF
H0: La serie tiene una raíz unitaria (no es estacionaria).
H1: La serie no tiene raíz unitaria (es estacionaria).
Interpretación del valor 𝑝
Si 𝑝< 0.05: Se rechaza H0 , concluyendo que la serie es estacionaria.
Si 𝑝≥ 0.05: No se puede rechazar H0, concluyendo que la serie no es estacionaria.
Interpretación del resultado
Tanto para DAX y SMI el 𝑝≥ 0.05, por tanto no se puede rechazar H0, concluyendo que la serie no es estacionaria, motivo por el cuál se van a diferenciar las series utilizando la función diff(), para que se vuelva estacionaria.
# Al ser las series no son estacionarias, hay que diferenciarlas
dDAX <- diff(tsData_df$DAX) # Diferenciar la serie DAX
dSMI <- diff(tsData_df$SMI) # Diferenciar la serie SMI
# Prueba de estacionariedad para las series diferenciadas
adf_dDAX <- adf.test(dDAX)
cat("\nPrueba de ADF para dDAX (diferenciada):\n")##
## Prueba de ADF para dDAX (diferenciada):
##
## Augmented Dickey-Fuller Test
##
## data: dDAX
## Dickey-Fuller = -9.9997, Lag order = 12, p-value = 0.01
## alternative hypothesis: stationary
##
## Prueba de ADF para dSMI (diferenciada):
##
## Augmented Dickey-Fuller Test
##
## data: dSMI
## Dickey-Fuller = -10.769, Lag order = 12, p-value = 0.01
## alternative hypothesis: stationary
3.7.3 Aplicacion de la prueba de Granger
## Granger causality test
##
## Model 1: dDAX ~ Lags(dDAX, 1:3) + Lags(dSMI, 1:3)
## Model 2: dDAX ~ Lags(dDAX, 1:3)
## Res.Df Df F Pr(>F)
## 1 1849
## 2 1852 -3 3.1126 0.02536 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se demuestra la estadística de prueba F = 3.1126 y el valor correspondiente de la estadistica de pruebe correspondienete a F es Pr(>F) 0.02536 Por esta razón rechazamos la hipótesis nula de la prueba porque el valor p es menor que 0.05, por lo que hay evidencia de que DAX causa a SMI en el sentido de Granger. Es decir, los valores pasados de DAX tienen un impacto significativo en la predicción de SMI.
3.7.4 Realización de la prueba de causalidad de Granger en sentido inverso
A pesar de que se rechazó la hipótesis nula de la prueba, es posible que se esté produciendo una causalidad inversa. En ese ejemplo, es probable que los cambios en los valores del DAX estén afectando a los cambios en los valores del SMI.
Para descartar esta posibilidad, debemos utilizar DAX como variable predictora y SMI como variable respondedora en la prueba de causalidad de Granger a la inversa:
## Granger causality test
##
## Model 1: dSMI ~ Lags(dSMI, 1:3) + Lags(dDAX, 1:3)
## Model 2: dSMI ~ Lags(dSMI, 1:3)
## Res.Df Df F Pr(>F)
## 1 1849
## 2 1852 -3 2.1302 0.09447 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se demuestra la estadística de prueba F = 2.1302 y el valor correspondiente de la estadística de prueba correspondienete a F es Pr(>F) 0.09447. Por esta razón no rechazamos la hipótesis nula de la prueba porque el valor p es mayor que 0.05, por lo que no hay evidencia de que DAX causa a SMI en el sentido de Granger. Es decir, los valores pasados de DAX no tienen un impacto significativo en la predicción de SMI.
Conclusión
La prueba de Dickey-Fuller, la prueba de Johansen y la de causalidad de Granger, son herramientas para el estudio de las series temporales, donde la prueba de Dickey-Fuller resulta bien importante ya que permite determinar si una serie temporal tiene una raíz unitaria, ya que es un requisito previo para aplicar las pruebas de cointegración y causalidad.
Para la prueba de Johansen, es indispensable realizar pruebas de raíz unitaria antes de su aplicación. Esto asegura que se cumplan las condiciones necesarias para la cointegración y que los análisis posteriores sean válidos y confiables. Sin esta verificación previa, los resultados podrían no reflejar adecuadamente las relaciones subyacentes entre las series.
De manera similar, la causalidad de Granger se utiliza para evaluar si una serie temporal puede predecir otra. Sin embargo, también requiere que se verifique la presencia de raíces unitarias en las series analizadas. Si se ignoran estas pruebas, los resultados pueden ser engañosos y llevar a conclusiones erróneas sobre las relaciones predictivas entre las variables.
En resumen, la interdependencia entre estas pruebas resalta la importancia de realizar un análisis riguroso y sistemático en el estudio de series temporales para obtener resultados precisos y significativos.
Bibliografía
Cuellar, L. (2025). Cómo hacer el test de cointegración en Rstudio. Recuperado de https://www.youtube.com/watch?v=0DbmqWLGrTY.
Dickey, D. A., & Fuller, W. A. (1979). Distribution of the estimators for autoregressive time series with a unit root. Journal of the American Statistical Association, 74(366a), 427-431.
Enders, W. (2008). Applied econometric time series. John Wiley & Sons.
Montero. R (2013). Variables no estacionarias y cointegración. Documentos de Trabajo en Economía Aplicada. Universidad de Granada. España