UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

TEMA:

Cointegración y Causalidad

MATERIA:

Métodos para el análisis económico

DOCENTE:

MSF. Carlos Ademir Pérez Alas.

Grupo teorico

02

Integrantes Carnet
Yasira Yannel Medrano Carbajal MC22122
Angélica Valeria Mendoza Arana MA21116

CIUDAD UNIVERSITARIA, SABADO 29 DE NOVIEMBRE DE 2025


En este reporte se presentan la Prueba de Raíz Unitaria de Dickey-Fuller, la Cointegración de Johansen y la Causalidad de Granger, explicando su propósito, hipótesis, implementación en R y ejemplos prácticos.

1. Prueba de Raíz Unitaria de Dickey & Fuller.

Propósito de la prueba, es decir ¿Para qué se usa?

La prueba de Dickey & Fuller (ADF) se utiliza para verificar si una serie temporal, es estacionaria o si contiene una raíz unitaria. Una serie con raíz unitaria es no estacionaria, lo que significa que sus valores cambian de forma persistente en el tiempo y pueden generar relaciones espurias en modelos econométricos. Por ello, la ADF permite determinar si la serie debe diferenciarse antes de usarla en análisis como cointegración o modelos VAR.

Hipótesis de la prueba:

Las hipótesis de la prueba de Dickey-Fuller se formulan para evaluar si una serie temporal es estacionaria o no. La hipótesis nula postula que la serie presenta una raíz unitaria, lo que indica que es no estacionaria, mientras que la hipótesis alternativa sostiene que la serie es estacionaria.

La prueba de Dickey-Fuller se fundamenta en la siguiente ecuación:

Δyt = αyt-1 + εt

Donde:

Δyt: es la primera diferencia de la serie temporal yt (yt - yt-1).

yt-1: es el valor de la serie en el período anterior.

α: es el parámetro que se somete a prueba.

εt: es el error aleatorio.

Hipótesis Nula (H0): α = 0

Esta hipótesis indica que la serie de tiempo presenta una raíz unitaria, lo que sugiere que es no estacionaria y sigue un proceso de camino aleatorio.

Hipótesis Alternativa (H1): α < 0

Esta hipótesis sostiene que la serie es estacionaria, lo que implica que tiende a regresar a su media a lo largo del tiempo y que los choques tienen un efecto temporal que se atenúa con el paso del tiempo. Se define como α < 0. Si se cumple que α < 0, se concluye que yt es estacionaria.

Es decir:

H0: α = 0, posee raíz unitaria y es una serie temporal no estacionaria.

H1: α < 0, serie temporal estacionaria.

Sintaxis de implementación en R, explicando cada uno de los argumentos:

En R, la prueba de Dickey-Fuller se puede llevar a cabo mediante la función ur.df() del paquete urca. La sintaxis básica de esta función es la siguiente:

ur.df(y, type = c(“none”, “drift”, “trend”), lags = 0)

Donde:

y: Es la serie temporal que se va a analizar.

type: Especifica el tipo de modelo que se empleará en la prueba de Dickey-Fuller. Los valores posibles son:

  • none: no incluye ni constante ni tendencia en la regresión de la prueba.
  • drift: incorpora una constante (intercepto) en la regresión de la prueba.
  • trend: incluye tanto una constante como una tendencia en la regresión de la prueba.

lags: Especifica el número de rezagos de la variable dependiente que se incluirán en la regresión de la prueba. La prueba de Dickey-Fuller aumentada (ADF) utiliza rezagos para corregir la autocorrelación en los errores, permitiendo especificar cualquier cantidad de rezagos para controlar la autocorrelación serial.

Estadístico de prueba:

En la prueba de Dickey-Fuller, el estadístico de prueba es un valor t calculado para el parámetro α en la regresión de prueba. Esta regresión se basa en los siguientes modelos:

  • Sin constante ni tendencia: Δyt = αyt-1 + εt.

  • Con constante (drift): Δyt = α0 + αyt-1 + εt.

  • Con constante y tendencia: Δyt = α0 + α1t + αyt-1 + εt.

La salida de la función ur.df() en R muestra el valor de este estadístico t bajo la etiqueta “Value of test-statistic is:”. Es importante destacar que esta distribución no es la t-Student habitual, sino una distribución no estándar tabulada por Dickey y Fuller.

Criterio de decision:

H0: No se puede rechazar H0. Si el valor Pvalue > 0.05 o si el valor absoluto del estadístico de prueba es menor que el valor absoluto del valor crítico, se concluye que la serie es no estacionaria.

H1: Se rechaza H0. Si el valor Pvalue < 0.05, o si el valor absoluto del estadístico de prueba es mayor que el valor absoluto del valor crítico y el estimador α es negativo, se concluye que la serie es estacionaria.

Interpretación del rechazo, o no rechazo de la Hipótesis Nula de la prueba:

-Si no se puede rechazar H0, la serie presenta una raíz unitaria y es no estacionaria. Esto sucede cuando el valor p es mayor que un nivel de significancia establecido (comúnmente 0.05) o cuando el valor absoluto del estadístico de prueba es menor que el valor absoluto del valor crítico correspondiente.

-Si se rechaza H0, la serie no tiene raíz unitaria y es estacionaria, lo que ocurre cuando el valor Pvalue es menor que 0.05 o el estadístico de prueba supera el valor crítico. Es crucial que el estimador α (alfa) sea negativo; si es positivo, la conclusión de estacionariedad no es válida. Esto indica que la serie tiende a regresar a su media con media y varianza constantes.

Ejemplo 1 — Dickey–Fuller Simple (D-F Simple)

Serie simulada: Temperatura diaria en un invernadero

En este ejemplo se simula una serie llamada temp_invernadero, que representa temperaturas diarias medidas en un invernadero durante 120 días. Aunque la serie fue generada para imitar variaciones alrededor de un nivel estable, la prueba de Dickey-Fuller indicó que la serie presenta raíz unitaria y es no estacionaria, lo que significa que los valores pueden cambiar de forma persistente en el tiempo y no tienden a estabilizarse alrededor de una media constante..

library(urca)
library(tseries)
set.seed(2024)

# Simulación de una serie estacionaria de temperatura
temp_invernadero <- rnorm(120, mean = 25, sd = 1)

plot(temp_invernadero, type = "l",
     main = "Temperatura en Invernadero (120 días)",
     xlab = "Días",
     ylab = "Temperatura (°C)")

adf_temp <- ur.df(temp_invernadero, type = "none", lags = 1)
summary(adf_temp)
## 
## ############################################### 
## # 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 
## -3.8115 -0.7098  0.0557  0.9669  3.1584 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## z.lag.1    -0.000927   0.004721  -0.196    0.845    
## z.diff.lag -0.496342   0.080828  -6.141 1.18e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.279 on 116 degrees of freedom
## Multiple R-squared:  0.2459, Adjusted R-squared:  0.2329 
## F-statistic: 18.91 on 2 and 116 DF,  p-value: 7.801e-08
## 
## 
## Value of test-statistic is: -0.1964 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau1 -2.58 -1.95 -1.62

Interpretación:

El estadístico de prueba obtenido es -0.1964, mientras que los valores críticos son -1.62 (10%), -1.95 (5%) y -2.58 (1%). Como -0.1964 es mayor que todos los valores críticos, y el p-value = 0.845 es mucho mayor que 0.05, no se rechaza la hipótesis nula.

Esto indica que la serie presenta raíz unitaria y es no estacionaria, lo que significa que los valores de la serie pueden cambiar de forma persistente en el tiempo y no tienden a estabilizarse alrededor de una media constante.

Ejemplo 2 — Dickey–Fuller Aumentada (ADF)

Serie simulada: Precio de tomates en un mercado local

Este ejemplo genera la serie precio_tomates, la cual simula el precio de un tomate durante 150 días. La serie fue construida como un paseo aleatorio con tendencia leve, para representar un precio que cambia en el tiempo y muestra comportamiento no estacionario.

library(urca)
library(tseries)
set.seed(55)

# Simulación de una serie NO estacionaria (paseo aleatorio con tendencia)
precio_tomates <- cumsum(rnorm(150, mean = 0.05, sd = 0.4)) + 5

plot(precio_tomates, type = "l",
     main = "Precio Diario Simulado del Tomate",
     xlab = "Tiempo",
     ylab = "Precio (USD)")

adf_tomate <- adf.test(precio_tomates, alternative = "stationary")

print("Prueba ADF: Precio del Tomate")
## [1] "Prueba ADF: Precio del Tomate"
print(adf_tomate)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  precio_tomates
## Dickey-Fuller = -2.5365, Lag order = 5, p-value = 0.3529
## alternative hypothesis: stationary

Interpretación:

No se rechaza H₀, la serie tiene raíz unitaria → es no estacionaria. El precio del tomate sigue un comportamiento de paseo aleatorio con tendencia.

2. Cointegración en el enfoque de Soren Johansen:

Propósito de la prueba (¿Para qué se usa?)

La prueba de cointegración de Johansen se utiliza para determinar si existe una relación de equilibrio de largo plazo entre varias series no estacionarias integradas del mismo orden. El método evalúa si una combinación lineal de esas variables es estacionaria, lo cual indicaría que están cointegradas. Esto permite modelar correctamente relaciones económicas que se mueven juntas en el tiempo, aun cuando cada serie individual sea no estacionaria.

Propósitos esenciales de la prueba de cointegración de Johansen:

-Identificación de relaciones a largo plazo: Establece si las variables comparten tendencias estocásticas comunes, lo que sugiere que se mueven juntas hacia un equilibrio a largo plazo.

-Análisis de equilibrio: Facilita el modelado de cómo las variables se ajustan para regresar al equilibrio, mejorando la comprensión de su dinámica de ajuste.

-Prevención de regresiones espurias: Contribuye a evitar conclusiones erróneas que pueden surgir de correlaciones coincidentales entre variables no estacionarias.

-Determinación del número de relaciones de cointegración: Identifica cuántas combinaciones lineales estacionarias existen entre las variables, lo cual es esencial para modelar sistemas complejos.

-Modelado de corrección de errores: Sirve como fundamento para desarrollar modelos VECM que integran tanto los ajustes a corto plazo como la relación de equilibrio a largo plazo.

Hipótesis de la prueba:

En el enfoque de Johansen, se plantean dos hipótesis fundamentales para evaluar la cointegración entre variables no estacionarias.

La ecuación fundamental que establece la cointegración se fundamenta en el concepto de que, a pesar de que las series individuales no sean estacionarias.

La ecuación general que describe esta relación es la siguiente:

β’yt= β1 Y1t + β2 Y2t+ βn Ynt = ut

Donde:

yt: es un vector que contiene las variables no estacionarias, en el tiempo t.

β: es el vector de cointegración, que contiene los coeficientes que definen la combinación lineal.

ut: es el término de error o residuo resultante de la combinación lineal.

La ecuación de cointegración busca una combinación lineal de variables no estacionarias (yt), ponderadas por coeficientes (β), que resulte en un residuo estacionario (ut). Si este residuo (ut) es estacionario, las variables se consideran cointegradas, lo que implica una relación de equilibrio a largo plazo.

Hipótesis Nula (H0): r = 0 No existe cointegración entre las variables analizadas. Esto implica que las variables no comparten una tendencia estocástica común y, por lo tanto, no se mueven juntas hacia un equilibrio a largo plazo. La aceptación de esta hipótesis sugiere que cualquier relación observada entre las variables es meramente espuria.

Hipótesis Alternativa (H1): r ≥ 1 Existe al menos una relación de cointegración entre las variables. Esto significa que, a pesar de ser no estacionarias individualmente, hay una combinación lineal de las variables que es estacionaria, indicando que comparten una tendencia común y se ajustan hacia un equilibrio a largo plazo.

Es decir:

H0: r = 0 , no existe cointegración entre las variables. H1: r ≥ 1, existe al menos una relación de cointegración entre las variables.

Sintaxis de implementación en R, explicando cada uno de los argumentos:

Para realizar la prueba de cointegración de Johansen, se utilizan principalmente las siguientes funciones de los paquetes urca y vars :

1. Función ca.jo() del paquete urca: Esta función es fundamental para llevar a cabo la prueba de cointegración de Johansen.

x: (obligatorio) Representa la serie de tiempo o el marco de datos que contiene las variables a analizar. Debe ser una matriz o un objeto convertible a matriz numérica, es decir, las variables deben ser numéricas. Por ejemplo, es un conjunto de datos que consiste en varias series temporales utilizadas en la prueba.

type: (opcional) Especifica el tipo de estadístico de prueba. Puede ser (máximo autovalor) o (estadístico de traza). Si no se especifica, el valor por defecto es .

ecdet: (opcional) Define los componentes determinísticos a incluir en el modelo. Puede ser (sin determinante), (incluye una constante) o (incluye una tendencia lineal). El valor por defecto es .

K: (opcional) Indica el número de rezagos a incluir en el modelo VAR subyacente. Generalmente se elige basado en criterios de información; el valor por defecto es 2.

spec: (opcional) Especifica el tipo de modelo VEC a considerar. Puede ser (relaciones de largo plazo) o (relaciones transitorias). El valor por defecto es season: (opcional) Especifica la frecuencia de datos estacionales. Por ejemplo, para datos trimestrales, se debe establecer en 4. El valor por defecto es NULL, lo que significa que no se considera la estacionalidad.

2. Función cajorls() del paquete urca: Se utiliza para estimar los parámetros del modelo de corrección de errores (VEC) tras realizar la prueba de cointegración.

x: (obligatorio) Representa el resultado de la prueba de cointegración realizada con , es decir, toma el objeto devuelto por .

r: (opcional) Indica el número de relaciones de cointegración encontradas en la prueba anterior que se usarán en la estimación VEC. El valor por defecto es 1, y se determina al analizar los resultados del test de Johansen.

3. Función VARorder() del paquete vars: Se utiliza para determinar el número óptimo de rezagos a incluir en un modelo VAR, que es un paso previo a la prueba de cointegración con .

x: (obligatorio) Representa la serie de tiempo o el marco de datos que contiene las variables a analizar. Debe ser una matriz o un objeto convertible a matriz numérica.

maxlag: (opcional) Especifica el número máximo de rezagos a considerar. El valor por defecto es 10.

type: (opcional) Especifica los componentes determinísticos a incluir en el modelo para determinar el orden de retardo óptimo. Puede ser (sin determinante), (incluye una constante) o (incluye una tendencia lineal). El valor por defecto es .

Estadístico de prueba:

En el enfoque de Johansen, se utilizan dos estadísticos de prueba para evaluar la cointegración:

Estadístico de traza

Este estadístico evalúa la hipótesis nula de que el rango de cointegración es (r) (número de relaciones de cointegración) frente a la alternativa de que el rango es (n) (número total de variables).

En la salida de R, se presenta bajo la sección “Trace test” y muestra el valor del estadístico junto con los valores críticos para diferentes niveles de significancia (0.01, 0.05, 0.10). Si el estadístico de traza es mayor que el valor crítico correspondiente, se rechaza la hipótesis nula.

Estadístico de máximo autovalor

Este estadístico evalúa la hipótesis nula de que el rango de cointegración es (r) frente a la alternativa de que el rango es (r+1).

En la salida de R, se presenta bajo la sección “Max-Eigen test” y también incluye el valor del estadístico y los valores críticos. Si el estadístico de máximo autovalor supera el valor crítico, se rechaza la hipótesis nula.

Criterio de decisión:

Estadístico de traza

En la salida de R, se encuentra en la sección “Trace test”. Para cada valor de ( r ) (número de relaciones de cointegración), se presenta el estadístico de traza y los valores críticos para diferentes niveles de significancia (0.01, 0.05, 0.10).

Criterio de decisión: Si el estadístico de traza es mayor que el valor crítico correspondiente, se rechaza la hipótesis nula de que el rango de cointegración es ( r ).

Estadístico de máximo autovalor

En la salida de R, se encuentra en la sección “Max-Eigen test”. Similarmente, se presentan los valores del estadístico y los valores críticos.

Criterio de decisión: Si el estadístico de máximo autovalor es mayor que el valor crítico correspondiente, se rechaza la hipótesis nula de que el rango de cointegración es (r).

Interpretación

-Si se rechaza la hipótesis nula en ambos estadísticos para un valor de (r), se concluye que hay al menos (r + 1) relaciones de cointegración.

-Si no se puede rechazar la hipótesis nula, se concluye que no hay suficientes evidencias para afirmar la existencia de relaciones de cointegración en el modelo analizado.

Interpretación del rechazo, o no rechazo de la Hipótesis Nula de la prueba:

La hipótesis nula en las pruebas de cointegración de Johansen se refiere al número de relaciones de cointegración entre las variables analizadas.

-En la prueba del autovalor máximo, la hipótesis nula establece que el rango de cointegración es (r) (número de relaciones de cointegración) frente a la alternativa de que el rango es (r+ 1).

-En la prueba de la traza, la hipótesis nula establece que el rango de cointegración es (r) o menor, en contraste con la alternativa de que el rango es (n), donde (n) es el número total de variables en el sistema.

Rechazo de la Hipótesis Nula: Si el estadístico de prueba supera el valor crítico correspondiente para un nivel de significancia dado (por ejemplo, 5%), se rechaza la hipótesis nula. Esto indica que hay evidencia estadística para concluir que existe más de (r) relaciones de cointegración.

En la prueba del autovalor máximo, rechazar la hipótesis nula implica que hay al menos (r + 1) relaciones de cointegración.

En la prueba de la traza, rechazar la hipótesis nula sugiere que hay más de (r) relaciones de cointegración.

No Rechazo de la Hipótesis Nula: Si el estadístico de prueba es menor o igual que el valor crítico correspondiente, no se rechaza la hipótesis nula. Esto sugiere que no hay suficiente evidencia estadística para concluir que existe más de (r) relaciones de cointegración.

El número de relaciones de cointegración se determina identificando el punto en el que se rechaza la hipótesis nula por primera vez, analizando los resultados de la prueba para cada valor de (r).

EJEMPLO 1 — PIB, Consumo y Formación de Capital:

library(urca)
library(vars)

set.seed(10)

# Simulación de datos macroeconómicos no estacionarios
PIB <- cumsum(rnorm(150, mean = 0.8, sd = 1.5)) + 100
Consumo <- cumsum(rnorm(150, mean = 0.6, sd = 1)) + 80
Inversion <- cumsum(rnorm(150, mean = 0.4, sd = 1.2)) + 60

data_A <- cbind(PIB, Consumo, Inversion)

# Prueba Johansen
johansen_A <- ca.jo(data_A, type = "trace", ecdet = "const", K = 2)
summary(johansen_A)
## 
## ###################### 
## # Johansen-Procedure # 
## ###################### 
## 
## Test type: trace statistic , without linear trend and constant in cointegration 
## 
## Eigenvalues (lambda):
## [1] 3.641736e-01 5.238033e-02 4.535925e-02 9.176058e-17
## 
## Values of teststatistic and critical values of test:
## 
##           test 10pct  5pct  1pct
## r <= 2 |  6.87  7.52  9.24 12.97
## r <= 1 | 14.83 17.85 19.96 24.60
## r = 0  | 81.85 32.00 34.91 41.07
## 
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
## 
##                   PIB.l2 Consumo.l2 Inversion.l2    constant
## PIB.l2          1.000000   1.000000   1.00000000   1.0000000
## Consumo.l2    -12.955973  -5.114320  -1.57613429   0.7156928
## Inversion.l2    8.194615   4.182747   0.07639075  -1.4440929
## constant     -107.748456  -5.155101  33.08763025 -69.1443682
## 
## Weights W:
## (This is the loading matrix)
## 
##                    PIB.l2   Consumo.l2 Inversion.l2      constant
## PIB.d       -0.0013857852 -0.001449427 -0.031568688  9.118856e-17
## Consumo.d   -0.0009653296  0.006846922  0.009571979  1.643663e-17
## Inversion.d -0.0012309020 -0.007590329  0.018396323 -1.766770e-16
# Estimación VECM con r = 1
vecm_A <- cajorls(johansen_A, r = 1)
vecm_A
## $rlm
## 
## Call:
## lm(formula = substitute(form1), data = data.mat)
## 
## Coefficients:
##                PIB.d       Consumo.d   Inversion.d
## ect1           -0.0013858  -0.0009653  -0.0012309 
## PIB.dl1         0.0315279  -0.0972848  -0.1010149 
## Consumo.dl1    -0.0520129   0.1418720  -0.2471018 
## Inversion.dl1  -0.1576806  -0.0314172   0.1017712 
## 
## 
## $beta
##                     ect1
## PIB.l2          1.000000
## Consumo.l2    -12.955973
## Inversion.l2    8.194615
## constant     -107.748456

Interpretación:

Los resultados muestran evidencia de 1 vector de cointegración, lo que indica que PIB, Consumo e Inversión mantienen una relación de equilibrio a largo plazo. Aunque cada variable es no estacionaria, juntas siguen una trayectoria estable. El VECM refleja cómo cada variable corrige desviaciones respecto a ese equilibrio común.

EJEMPLO 2 — Tipo de Cambio, Inflación y Tasa de Interés:

set.seed(100)

# Simulación de serie no estacionaria con tendencia
tipo_cambio <- cumsum(rnorm(200, mean = 0.02, sd = 0.3)) + 8
inflacion <- cumsum(rnorm(200, mean = 0.01, sd = 0.15)) + 2
tasa_interes <- cumsum(rnorm(200, mean = 0.015, sd = 0.25)) + 4

data_B <- cbind(tipo_cambio, inflacion, tasa_interes)

# Prueba de cointegración Johansen
johansen_B <- ca.jo(data_B, type = "trace", ecdet = "const", K = 2)
summary(johansen_B)
## 
## ###################### 
## # Johansen-Procedure # 
## ###################### 
## 
## Test type: trace statistic , without linear trend and constant in cointegration 
## 
## Eigenvalues (lambda):
## [1]  5.297723e-02  1.870921e-02  8.260142e-03 -1.990617e-17
## 
## Values of teststatistic and critical values of test:
## 
##           test 10pct  5pct  1pct
## r <= 2 |  1.64  7.52  9.24 12.97
## r <= 1 |  5.38 17.85 19.96 24.60
## r = 0  | 16.16 32.00 34.91 41.07
## 
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
## 
##                 tipo_cambio.l2 inflacion.l2 tasa_interes.l2    constant
## tipo_cambio.l2       1.0000000    1.0000000       1.0000000   1.0000000
## inflacion.l2        -0.5030166   -7.6014309      -0.8303827  -0.2596147
## tasa_interes.l2     -0.3532661    2.3465850      -1.8447902   0.4750405
## constant            -7.7805618   -0.2229242       3.0460285 -10.8687784
## 
## Weights W:
## (This is the loading matrix)
## 
##                tipo_cambio.l2 inflacion.l2 tasa_interes.l2      constant
## tipo_cambio.d    -0.068611904  0.002124524    0.0002689042  3.627457e-16
## inflacion.d       0.006805365  0.003031917    0.0022735374 -7.010549e-17
## tasa_interes.d   -0.009479122 -0.004255376    0.0043475657 -2.200146e-17
# Estimación de VECM con r = 1
vecm_B <- cajorls(johansen_B, r = 1)
vecm_B
## $rlm
## 
## Call:
## lm(formula = substitute(form1), data = data.mat)
## 
## Coefficients:
##                   tipo_cambio.d  inflacion.d  tasa_interes.d
## ect1              -0.068612       0.006805    -0.009479     
## tipo_cambio.dl1   -0.231371      -0.035175    -0.042530     
## inflacion.dl1     -0.045585      -0.050366    -0.204344     
## tasa_interes.dl1  -0.006300       0.051852    -0.038428     
## 
## 
## $beta
##                       ect1
## tipo_cambio.l2   1.0000000
## inflacion.l2    -0.5030166
## tasa_interes.l2 -0.3532661
## constant        -7.7805618

Interpretación:

El estadístico Trace indica que existe 1 vector de cointegración. Esto implica que tipo de cambio, inflación y tasa de interés están vinculados a largo plazo, formando un equilibrio macroeconómico. El VECM permite observar cómo cada variable ajusta su comportamiento cuando se aleja del equilibrio.

EJEMPLO 3 — Demanda de Energía, Producción Industrial y Precio del Petróleo:

set.seed(33)

# Simulación de series relacionadas económicamente
energia <- cumsum(rnorm(180, mean = 0.4, sd = 1)) + 50
industria <- cumsum(rnorm(180, mean = 0.3, sd = 0.9)) + 70
petróleo <- cumsum(rnorm(180, mean = 0.05, sd = 2)) + 40

data_C <- cbind(energia, industria, petróleo)

# Prueba de cointegración Johansen
johansen_C <- ca.jo(data_C, type = "trace", ecdet = "const", K = 2)
summary(johansen_C)
## 
## ###################### 
## # Johansen-Procedure # 
## ###################### 
## 
## Test type: trace statistic , without linear trend and constant in cointegration 
## 
## Eigenvalues (lambda):
## [1]  1.977497e-01  7.008318e-02  2.805695e-02 -5.012470e-17
## 
## Values of teststatistic and critical values of test:
## 
##           test 10pct  5pct  1pct
## r <= 2 |  5.07  7.52  9.24 12.97
## r <= 1 | 18.00 17.85 19.96 24.60
## r = 0  | 57.22 32.00 34.91 41.07
## 
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
## 
##              energia.l2 industria.l2 petróleo.l2   constant
## energia.l2    1.0000000    1.0000000   1.0000000  1.0000000
## industria.l2 -2.0069209    0.9563698  -3.4331026 -1.7424281
## petróleo.l2   0.3683368  -18.9034419   0.2455849  0.6481462
## constant     32.4365621  672.4402639 216.5544004 40.5297836
## 
## Weights W:
## (This is the loading matrix)
## 
##               energia.l2  industria.l2  petróleo.l2      constant
## energia.d   -0.012387808  0.0002004837 -0.002596215  1.485242e-16
## industria.d -0.003711353 -0.0009805751  0.007098906 -1.957600e-16
## petróleo.d  -0.002204067  0.0067696573  0.005645208 -5.327750e-16
# Estimación VECM con r = 1
vecm_C <- cajorls(johansen_C, r = 1)
vecm_C
## $rlm
## 
## Call:
## lm(formula = substitute(form1), data = data.mat)
## 
## Coefficients:
##                energia.d  industria.d  petróleo.d
## ect1           -0.012388  -0.003711    -0.002204 
## energia.dl1    -0.110786   0.082651    -0.017660 
## industria.dl1   0.089519   0.003624    -0.029482 
## petróleo.dl1    0.027077   0.021113    -0.025700 
## 
## 
## $beta
##                    ect1
## energia.l2    1.0000000
## industria.l2 -2.0069209
## petróleo.l2   0.3683368
## constant     32.4365621

Interpretación:

Los resultados sugieren la existencia de 1 vector de cointegración. Esto significa que la demanda de energía, la actividad industrial y el precio del petróleo se mueven coordinadamente, convergiendo hacia un equilibrio de largo plazo. El VECM muestra cómo cada variable corrige los desajustes respecto a ese equilibrio común.

3. Causalidad en el sentido de Granger:

Propósito de la prueba, es decir ¿Para qué se usa?

La prueba de causalidad de Granger se utiliza para determinar si una serie temporal aporta información útil para predecir otra. En esencia, verifica si los valores pasados de una variable 𝑋 ayudan a mejorar la predicción de los valores futuros de otra variable 𝑌 más allá de lo que 𝑌 puede predecirse a partir de su propia historia. Su propósito central es evaluar si una variable contiene información predictiva única sobre otra, partiendo del principio de que el pasado puede influir en el futuro. Es importante aclarar que la causalidad de Granger no implica causalidad real o teórica, sino una relación basada únicamente en la precedencia temporal y en la capacidad predictiva de las series.

Hipótesis de la prueba:

La prueba de causalidad de Granger determina si una serie temporal X tiene la capacidad de predecir otra serie temporal Y. Esto se hace mediante la comparación de dos modelos de regresión; uno que incluye los valores pasados (rezagados) de X y otro que no los incluye.

Modelo 1: Con valores pasados de X

Yt = α0 + α1yt-1 + α2yt-2 +⋯+ αpYt-p + β1 Xt-1+ β2 Xt-2 +⋯+ βp Xt-p εt

Donde:

Yt: es el valor de la serie temporal Y en el tiempo t.

Yt-1: son los valores rezagados de la serie temporal Y en el tiempo t-i.

Xt-1: son los valores rezagados de la serie temporal X en el tiempo t-i.

α0: es el intercepto.

α1: los coeficientes asociados a los valores rezagados de Y.

β1: son los coeficientes asociados a los valores rezagados de X.

p: número de rezagos incluidos en el modelo.

εt: es el término de error.

Modelo 2: Sin valores pasados de X

Este modelo solo incluye los valores rezagados de Y para predecir el valor actual de Y, sin considerar la serie X:

Yt = α0 + α1yt-1 + α2yt-2 +⋯+ αpYt-p + εt

Donde:

Los componentes son los mismos que en el modelo 1, pero no se incluyen los valores rezagados de X.

Hipótesis nula (H0)

Establece que la serie temporal X no causa a la serie temporal Y en el sentido de Granger, lo que implica que los valores pasados de X no proporcionan información útil para predecir Y. Esta hipótesis se utiliza como punto de partida para el análisis, ya que se busca evidencia suficiente para rechazarla.

Hipótesis alternativa (H1) Propone que la serie temporal X sí causa a la serie temporal Y en el sentido de Granger, sugiriendo que los valores pasados de X son útiles para anticipar los valores futuros de Y. La aceptación de esta hipótesis implica que existe una relación de predecibilidad entre las dos series temporales, lo que puede tener implicaciones significativas en el análisis y la toma de decisiones.

Es decir: H0: Si la hipótesis nula no se puede rechazar, esto indica que los valores pasados de X no proporcionan información útil para predecir Y.

H1: Si la hipótesis nula se rechaza, esto indica que al menos uno de los valores pasados de X sí tiene información útil para predecir Y, por lo que se concluye que X “causa” a Y en el sentido de Granger.

Sintaxis de implementación en R, explicando cada uno de los argumentos:

Para llevar a cabo la prueba de causalidad de Granger en R, se utiliza la función grangertest() del paquete lmtest:

grangertest(y, x, order = 1)

Donde:

y: Representa la variable dependiente, es decir, la serie temporal que se desea predecir o la serie “causada”.

x: Es la variable independiente, que se utiliza para predecir y, conocida como la serie “causal”.

order: Un número entero que indica cuántos rezagos (o retardos) de x se incluirán en la prueba. El valor por defecto es 1, lo que significa que solo se considerará el valor inmediato anterior de x. Por ejemplo, si , se incluirán los valores de x de los tres períodos anteriores.

La función grangertest()toma como argumentos principales las dos series de tiempo (x e y) y busca determinar si x tiene un efecto causal de Granger sobre y.

El argumento order define cuántos rezagos de la variable x se incluirán en el análisis. La selección del número de rezagos debe basarse en la teoría económica, el conocimiento del proceso o criterios estadísticos como el AIC o BIC, y es común probar diferentes valores para este argumento.

La función genera una estadística de prueba F y un valor p. Si el valor p es menor que el nivel de significancia establecido (por ejemplo, 0.05), se rechaza la hipótesis nula de no causalidad de Granger.

Estadístico de prueba:

En la prueba de causalidad de Granger, se utiliza una estadística de prueba F para evaluar la relación entre las series temporales. Al ejecutar la función en R, se genera una salida que incluye varios componentes clave:

Estadístico F:

Este valor indica la relación entre la variabilidad explicada por el modelo que incluye los rezagos de x y la variabilidad no explicada. Un valor F más alto sugiere que los rezagos de x tienen un efecto significativo en la predicción de y.

Valor PValue:

Este valor se utiliza para determinar la significancia estadística del estadístico F. Si el valor p es menor que el nivel de significancia establecido (por ejemplo, 0.05), se rechaza la hipótesis nula de no causalidad de Granger, lo que sugiere que x causa a y en el sentido de Granger.

Ejemplo de salida en R. Al ejecutar la prueba, la salida puede verse así:

Res.Df: Grados de libertad residuales para cada modelo.

Df: Diferencia en los grados de libertad entre los dos modelos.

F: Estadístico de prueba F calculado.

Pr(>F): Valor p asociado al estadístico F.

Si el valor p es significativamente bajo (por ejemplo, menor a 0.05), se concluye que existe causalidad de Granger de x sobre y.

EJEMPLO 1 — Causalidad entre inflación y tipo de cambio:

Hipótesis

H₀: La inflación no Granger–causa el tipo de cambio.

H₁: La inflación sí Granger–causa el tipo de cambio.

H₀: El tipo de cambio no Granger–causa la inflación.

H₁: El tipo de cambio sí Granger–causa la inflación.

library(lmtest)
set.seed(123)

# Datos simulados realistas
t <- 200
inflacion <- cumsum(rnorm(t, mean = 0.05, sd = 0.2))   # Tendencia suave
tipo_cambio <- 0.4 * lag(inflacion, 1) + cumsum(rnorm(t, sd = 0.3))
tipo_cambio[1] <- 0

data1 <- data.frame(inflacion, tipo_cambio)

# Prueba en un sentido: inflación → tipo de cambio
granger_1 <- grangertest(tipo_cambio ~ inflacion, order = 2, data = data1)

# Prueba en el sentido contrario: tipo de cambio → inflación
granger_2 <- grangertest(inflacion ~ tipo_cambio, order = 2, data = data1)

granger_1
## Granger causality test
## 
## Model 1: tipo_cambio ~ Lags(tipo_cambio, 1:2) + Lags(inflacion, 1:2)
## Model 2: tipo_cambio ~ Lags(tipo_cambio, 1:2)
##   Res.Df Df      F Pr(>F)
## 1    193                 
## 2    195 -2 1.7316 0.1797
granger_2
## Granger causality test
## 
## Model 1: inflacion ~ Lags(inflacion, 1:2) + Lags(tipo_cambio, 1:2)
## Model 2: inflacion ~ Lags(inflacion, 1:2)
##   Res.Df Df      F Pr(>F)
## 1    193                 
## 2    195 -2 0.5394  0.584

Los valores p obtenidos fueron:

Inflación → Tipo de cambio: p = 0.1797

Tipo de cambio → Inflación: p = 0.584

Como ambos p-values son mayores que 0.05, no se rechaza la hipótesis nula.

Interpretación:

No existe evidencia estadística de causalidad de Granger en ninguno de los dos sentidos, es decir, ni la inflación predice al tipo de cambio ni el tipo de cambio predice a la inflación.

EJEMPLO 2 — Causalidad entre turismo y PIB trimestral

Hipótesis Turismo → PIB

H₀: El turismo NO Granger-causa el PIB.

H₁: El turismo SÍ Granger-causa el PIB.

PIB → Turismo

H₀: El PIB NO Granger-causa el turismo.

H₁: El PIB SÍ Granger-causa el turismo.

library(lmtest)
set.seed(99)

# Simulamos turismo y PIB con cierta relación
t <- 150
turismo <- cumsum(rnorm(t, mean = 2, sd = 10))
pib <- 0.3 * lag(turismo, 1) + cumsum(rnorm(t, mean = 5, sd = 20))
pib[1] <- turismo[1]

data2 <- data.frame(turismo, pib)

# Prueba: Turismo → PIB
granger_A <- grangertest(pib ~ turismo, order = 3, data = data2)

# Prueba: PIB → Turismo
granger_B <- grangertest(turismo ~ pib, order = 3, data = data2)

granger_A
## Granger causality test
## 
## Model 1: pib ~ Lags(pib, 1:3) + Lags(turismo, 1:3)
## Model 2: pib ~ Lags(pib, 1:3)
##   Res.Df Df      F   Pr(>F)   
## 1    140                      
## 2    143 -3 4.4698 0.004971 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
granger_B
## Granger causality test
## 
## Model 1: turismo ~ Lags(turismo, 1:3) + Lags(pib, 1:3)
## Model 2: turismo ~ Lags(turismo, 1:3)
##   Res.Df Df    F  Pr(>F)  
## 1    140                  
## 2    143 -3 2.34 0.07602 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretación:

Los resultados de la prueba de causalidad de Granger muestran que los valores pasados del turismo sí ayudan a predecir el PIB, ya que el p-value (0.004971) es menor que 0.05, por lo que se rechaza la hipótesis nula en ese sentido. En cambio, los valores pasados del PIB no ayudan a predecir el turismo, porque su p-value (0.07602) es mayor que 0.05. En conclusión, existe una causalidad unidireccional desde el turismo hacia el PIB, pero no en el sentido contrario.

EJEMPLO 3 — Causalidad entre ventas y publicidad (datos simulados)

Hipótesis Publicidad → Ventas

H₀: La publicidad NO causa las ventas.

H₁: La publicidad SÍ causa las ventas.

Ventas → Publicidad

H₀: Las ventas NO causan la publicidad.

H₁: Las ventas SÍ causan la publicidad.

library(lmtest)
set.seed(7)

t <- 180

publicidad <- abs(rnorm(t, mean = 50, sd = 10))
ventas <- 0.6 * lag(publicidad, 1) + abs(rnorm(t, mean = 80, sd = 15))
ventas[1] <- publicidad[1]

data3 <- data.frame(publicidad, ventas)

# Prueba: publicidad → ventas
g1 <- grangertest(ventas ~ publicidad, order = 2, data = data3)

# Prueba: ventas → publicidad
g2 <- grangertest(publicidad ~ ventas, order = 2, data = data3)

g1
## Granger causality test
## 
## Model 1: ventas ~ Lags(ventas, 1:2) + Lags(publicidad, 1:2)
## Model 2: ventas ~ Lags(ventas, 1:2)
##   Res.Df Df      F Pr(>F)
## 1    173                 
## 2    175 -2 1.2706 0.2833
g2
## Granger causality test
## 
## Model 1: publicidad ~ Lags(publicidad, 1:2) + Lags(ventas, 1:2)
## Model 2: publicidad ~ Lags(publicidad, 1:2)
##   Res.Df Df      F Pr(>F)
## 1    173                 
## 2    175 -2 0.2518 0.7777

Interpretación:

Los resultados indican que no existe evidencia estadística de causalidad de Granger en ninguno de los dos sentidos, ya que tanto la prueba ventas → publicidad (p = 0.7777) como publicidad → ventas (p = 0.2833) presentan valores p mayores que 0.05. Esto significa que, con estos datos, los valores pasados de la publicidad no ayudan a predecir las ventas, ni los valores pasados de las ventas ayudan a predecir la publicidad. En conclusión, no hay relación de causalidad de Granger entre ventas y publicidad.