Thiago Noronha Gardin
Prof: Manoel Pires
Estimou-se um modelo VAR com 3 defasagens utilizando a base de dados
QUARTERLY e o ordenamento das variáveis: - \(∆\)lip (variação no log da produção
industrial), - \(∆\)unemp (variação no
desemprego), e - \(s\) (spread de
juros).
Estimando o modelo VAR
Selecionamos 3 defasagens conforme o enunciado e estimamos o modelo VAR.
var_model <- VAR(data, p = 3, type = "const")
summary(var_model)->modelsm
modelsm
VAR Estimation Results:
=========================
Endogenous variables: dlip, dunemp, s
Deterministic variables: const
Sample size: 208
Log Likelihood: 554.153
Roots of the characteristic polynomial:
0.8005 0.7518 0.7518 0.5129 0.5129 0.4941 0.4941 0.3861 0.3861
Call:
VAR(y = data, p = 3, type = "const")
Estimation results for equation dlip:
=====================================
dlip = dlip.l1 + dunemp.l1 + s.l1 + dlip.l2 + dunemp.l2 + s.l2 + dlip.l3 + dunemp.l3 + s.l3 + const
Estimate Std. Error t value Pr(>|t|)
dlip.l1 5.610e-01 1.013e-01 5.536 9.74e-08 ***
dunemp.l1 -6.289e-03 5.259e-03 -1.196 0.233
s.l1 -1.071e-03 1.663e-03 -0.644 0.520
dlip.l2 -8.249e-02 1.065e-01 -0.775 0.439
dunemp.l2 7.212e-03 5.398e-03 1.336 0.183
s.l2 -9.415e-04 2.391e-03 -0.394 0.694
dlip.l3 1.919e-01 1.011e-01 1.899 0.059 .
dunemp.l3 4.679e-03 4.790e-03 0.977 0.330
s.l3 8.134e-05 1.699e-03 0.048 0.962
const -5.530e-04 1.897e-03 -0.292 0.771
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01242 on 198 degrees of freedom
Multiple R-Squared: 0.4046, Adjusted R-squared: 0.3776
F-statistic: 14.95 on 9 and 198 DF, p-value: < 2.2e-16
Estimation results for equation dunemp:
=======================================
dunemp = dlip.l1 + dunemp.l1 + s.l1 + dlip.l2 + dunemp.l2 + s.l2 + dlip.l3 + dunemp.l3 + s.l3 + const
Estimate Std. Error t value Pr(>|t|)
dlip.l1 -7.372118 1.938976 -3.802 0.000191 ***
dunemp.l1 0.329196 0.100643 3.271 0.001264 **
s.l1 0.011522 0.031831 0.362 0.717763
dlip.l2 0.295902 2.037186 0.145 0.884661
dunemp.l2 -0.073243 0.103304 -0.709 0.479156
s.l2 0.001648 0.045750 0.036 0.971300
dlip.l3 -2.737375 1.934281 -1.415 0.158584
dunemp.l3 -0.038370 0.091671 -0.419 0.675987
s.l3 0.050335 0.032512 1.548 0.123167
const 0.168639 0.036292 4.647 6.14e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2377 on 198 degrees of freedom
Multiple R-Squared: 0.5219, Adjusted R-squared: 0.5002
F-statistic: 24.02 on 9 and 198 DF, p-value: < 2.2e-16
Estimation results for equation s:
==================================
s = dlip.l1 + dunemp.l1 + s.l1 + dlip.l2 + dunemp.l2 + s.l2 + dlip.l3 + dunemp.l3 + s.l3 + const
Estimate Std. Error t value Pr(>|t|)
dlip.l1 3.06994 4.29574 0.715 0.47567
dunemp.l1 -0.37053 0.22297 -1.662 0.09814 .
s.l1 1.06119 0.07052 15.048 < 2e-16 ***
dlip.l2 0.45851 4.51333 0.102 0.91918
dunemp.l2 0.39479 0.22887 1.725 0.08609 .
s.l2 -0.31763 0.10136 -3.134 0.00199 **
dlip.l3 3.28676 4.28534 0.767 0.44401
dunemp.l3 -0.27995 0.20309 -1.378 0.16963
s.l3 0.14334 0.07203 1.990 0.04797 *
const -0.21507 0.08040 -2.675 0.00810 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.5267 on 198 degrees of freedom
Multiple R-Squared: 0.8254, Adjusted R-squared: 0.8175
F-statistic: 104 on 9 and 198 DF, p-value: < 2.2e-16
Covariance matrix of residuals:
dlip dunemp s
dlip 0.0001543 -0.002119 0.001198
dunemp -0.0021188 0.056517 -0.022737
s 0.0011976 -0.022737 0.277405
Correlation matrix of residuals:
dlip dunemp s
dlip 1.0000 -0.7174 0.1830
dunemp -0.7174 1.0000 -0.1816
s 0.1830 -0.1816 1.0000
modelsm$roots
[1] 0.8005093 0.7518345 0.7518345 0.5128831 0.5128831 0.4940832 0.4940832 0.3860852 0.3860852
modelsm$covres
dlip dunemp s
dlip 0.0001543404 -0.002118807 0.001197639
dunemp -0.0021188066 0.056517451 -0.022737300
s 0.0011976390 -0.022737300 0.277405171
O modelo VAR estimado inclui as variáveis Δlip (variação no log da produção industrial), Δunemp (variação no desemprego) e s (spread de juros), com três defasagens. A análise dos coeficientes sugere algumas relações significativas. No caso de Δlip, a defasagem da própria variável (Δlip.l1) tem um impacto estatisticamente significativo e positivo, indicando que a produção industrial responde positivamente a seus próprios valores defasados. No entanto, as outras variáveis não apresentam significância estatística para explicar Δlip. Para Δunemp, Δlip.l1 tem um impacto negativo e significativo, indicando que aumentos na produção industrial reduzem o desemprego, conforme esperado. No caso de s, a variável s.l1 é altamente significativa e reflete persistência no spread de juros ao longo do tempo. As interrelações entre as variáveis são capturadas na matriz de covariância dos resíduos, que mostra uma correlação negativa forte entre Δlip e Δunemp (\(-0.7174\)), corroborando a relação esperada entre produção industrial e desemprego. A magnitude dos \(R^2\) ajustados sugere que o modelo explica bem as variações em s (81.75%), Δunemp (50.02%) e moderadamente Δlip (37.76%). Esses resultados indicam que o modelo VAR é adequado para capturar as interações dinâmicas entre as variáveis analisadas.
causality(var_model, cause = "s")$Granger
Granger causality H0: s do not Granger-cause dlip dunemp
data: VAR object var_model
F-Test = 3.6948, df1 = 6, df2 = 594, p-value = 0.001295
A análise do teste de causalidade de Granger revelou o spread de juros (𝑠) causa Granger as variáveis Δlip e Δunemp O teste de causalidade de Granger indica que s fornece informações úteis para prever tanto Δlip quanto Δunemp. No caso de Δlip, rejeitamos a hipótese nula de que s não causa Granger a variável, com um valor F=3.6948 e p=0.001295.
grangertest(dunemp~s,order=3,data) ->test
test_s<-causality(var_model, cause = "s")
test_s$Granger
Granger causality H0: s do not Granger-cause dlip dunemp
data: VAR object var_model
F-Test = 3.6948, df1 = 6, df2 = 594, p-value = 0.001295
Da mesma forma, o teste demonstra que s causa Granger Δunemp, implicando que mudanças no spread de juros têm impacto dinâmico sobre o desemprego.
####c)Analise a decomposição da variância desse VAR.
fevd_results <- fevd(var_model, n.ahead = 10)
fevd_results
A decomposição da variância complementa esses resultados ao mostrar como a variância de cada variável é explicada ao longo do tempo. Inicialmente, Δlip é quase completamente explicada por si mesma (100% no período 1), mas ao longo do tempo, uma pequena parcela da variância é atribuída a s, chegando a 5,8% no período 10. Isso sugere que, embora o spread de juros tenha um impacto limitado sobre a produção industrial no longo prazo, ele não é desprezível. Para Δunemp, o spread de juros desempenha um papel crescente ao longo do tempo, explicando 13,18% da variância no período 10, indicando que a influência de s sobre o desemprego se intensifica no longo prazo. Já para s, sua própria variância é explicada principalmente por si mesma, embora a contribuição de Δlip cresça gradualmente, chegando a 30,13% no período 10.
#library(patchwork)
# Analisar funções de impulso-resposta
irf(var_model, impulse = "s", response = c("s"), boot = TRUE) %>% plot()
irf(var_model, impulse = "s", response = c("dlip"), boot = TRUE) %>% plot()
irf(var_model, impulse = "s", response = c("dunemp"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dlip", response = c("s"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dlip", response = c("dlip"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dlip", response = c("dunemp"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dunemp", response = c("s"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dunemp", response = c("dlip"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dunemp", response = c("dunemp"), boot = TRUE) %>% plot()
As funções de impulso-resposta (IRF) oferecem uma visão adicional sobre os efeitos de choques entre as variaveis. Para os impulsos em s, observamos um um efeito significativo até o 7 lag nele mesmo, já a resposta da Δlip começar é significativamente negativa para o 5º a7 lag, enquanto a resposta da Δunemp é positiva entre 3 lag, e tem um feito persistente para além do 10º periodo. Para os impulsos em Δlip, observamos um um efeito positivo significativo e persistente como resposta de S, nele mesmoo o choque perde efito a partir do 3º periodo, e a resposta de Δunemp é negativa para os 4º primeiros periodos e significativamente positiva no longo prazo.
Finalmente, Para os impulsos em Δunemp, observamos um um efeito não significativo como resposta de S e Δlip, e nele mesmo o choque perde efeito a partir do 3º periodo.
library(readxl)
Import <- read_excel("Importações.xlsx")
New names:
Import$log_M <- log(Import$M) # Log do volume de importações
Import$log_Y <- log(Import$Y) # Log do PIB
Import$log_q <- log(Import$Q) # Log da taxa de câmbio real
Import %>% ts(frequency = 4, start = 1996)->ts_imp
ts_imp %>% plot()
Antes de aplicar técnicas de cointegração, precisamos verificar se as séries são não estacionárias
# Teste ADF para as variáveis
adf.test(Import$log_M)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 1.85 0.983
[2,] 1 1.41 0.959
[3,] 2 1.34 0.954
[4,] 3 1.32 0.952
[5,] 4 1.42 0.959
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -1.199 0.627
[2,] 1 -1.041 0.682
[3,] 2 -0.918 0.725
[4,] 3 -0.701 0.801
[5,] 4 -0.715 0.797
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -1.63 0.729
[2,] 1 -1.91 0.611
[3,] 2 -1.90 0.616
[4,] 3 -1.83 0.644
[5,] 4 -1.69 0.703
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(Import$log_Y)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 3.68 0.99
[2,] 1 3.20 0.99
[3,] 2 3.40 0.99
[4,] 3 3.15 0.99
[5,] 4 3.00 0.99
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -1.38 0.562
[2,] 1 -1.28 0.597
[3,] 2 -1.09 0.666
[4,] 3 -1.22 0.619
[5,] 4 -1.14 0.647
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -1.35 0.847
[2,] 1 -1.40 0.825
[3,] 2 -1.09 0.920
[4,] 3 -1.16 0.909
[5,] 4 -1.10 0.918
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(Import$log_q)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 0.648 0.828
[2,] 1 0.512 0.789
[3,] 2 0.585 0.810
[4,] 3 0.650 0.829
[5,] 4 0.761 0.861
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -1.95 0.348
[2,] 1 -2.40 0.172
[3,] 2 -2.23 0.241
[4,] 3 -2.10 0.291
[5,] 4 -2.10 0.291
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -1.94 0.596
[2,] 1 -2.46 0.383
[3,] 2 -2.24 0.472
[4,] 3 -2.08 0.540
[5,] 4 -2.02 0.564
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
Os resultados do teste Augmented Dickey-Fuller (ADF) indicam que todas as variáveis em nível não são estacionárias. então tem-se que verificar se elas são em 1ª difereça
adf.test(Import$log_M %>% diff)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 -8.67 0.01
[2,] 1 -6.63 0.01
[3,] 2 -5.94 0.01
[4,] 3 -5.31 0.01
[5,] 4 -4.47 0.01
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -8.85 0.01
[2,] 1 -6.81 0.01
[3,] 2 -6.12 0.01
[4,] 3 -5.54 0.01
[5,] 4 -4.68 0.01
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -8.80 0.01
[2,] 1 -6.76 0.01
[3,] 2 -6.06 0.01
[4,] 3 -5.50 0.01
[5,] 4 -4.62 0.01
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(Import$log_Y %>% diff)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 -8.96 0.01
[2,] 1 -7.25 0.01
[3,] 2 -5.14 0.01
[4,] 3 -4.31 0.01
[5,] 4 -3.35 0.01
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -9.90 0.01
[2,] 1 -8.36 0.01
[3,] 2 -6.24 0.01
[4,] 3 -5.42 0.01
[5,] 4 -4.36 0.01
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -9.92 0.01
[2,] 1 -8.36 0.01
[3,] 2 -6.30 0.01
[4,] 3 -5.46 0.01
[5,] 4 -4.41 0.01
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(Import$log_q %>% diff)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 -8.33 0.01
[2,] 1 -7.29 0.01
[3,] 2 -6.55 0.01
[4,] 3 -5.98 0.01
[5,] 4 -4.57 0.01
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -8.33 0.01
[2,] 1 -7.30 0.01
[3,] 2 -6.57 0.01
[4,] 3 -6.04 0.01
[5,] 4 -4.62 0.01
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -8.30 0.01
[2,] 1 -7.28 0.01
[3,] 2 -6.56 0.01
[4,] 3 -6.04 0.01
[5,] 4 -4.64 0.01
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
Vemos aqui que em 1º diferença todas as variaveis são estacionárias. portanto, há condições para elas serem cointegradas.
Pontanto agora vamos estimar a relação de longo prazo das variaveis, e fazer teste de Engle-Granger para verificar se os resíduos do modelo de regressão são estacionários. no teste é estimado a regressão linear entre as variaveis e seu resíduo é testado quanto à estacionariedade. Os teste foi performado em 4 lags dado a escala temporal dos dados.
library(aTSA)
X_imp<-Import[,6:7] %>% as.matrix()
coint.test(y = Import$log_M,X = X_imp,nlag = 4)
Response: Import$log_M
Input: X_imp
Number of inputs: 2
Model: y ~ X + 1
-------------------------------
Engle-Granger Cointegration Test
alternative: cointegrated
Type 1: no trend
lag EG p.value
4.00 -2.66 0.10
-----
Type 2: linear trend
lag EG p.value
4.000 0.173 0.100
-----
Type 3: quadratic trend
lag EG p.value
4.0 -1.1 0.1
-----------
Note: p.value = 0.01 means p.value <= 0.01
: p.value = 0.10 means p.value >= 0.10
Pelo teste de Engle Granger rejeitamos a hipotese nula de não cointegração. Isso indica a existência de uma relação de cointegração entre as variaveis.
Agora vamos estimar um Modelo de Correção de Erro (ECM) para capturar as dinâmicas de curto prazo ajustadas pela relação de longo prazo.
vec_model <- ca.jo(Import[,5:7], type = "trace", ecdet = "const",K = 4)
vec_model %>% summary()
######################
# Johansen-Procedure #
######################
Test type: trace statistic , without linear trend and constant in cointegration
Eigenvalues (lambda):
[1] 2.089758e-01 1.032476e-01 5.527395e-02 2.715327e-16
Values of teststatistic and critical values of test:
test 10pct 5pct 1pct
r <= 2 | 6.25 7.52 9.24 12.97
r <= 1 | 18.24 17.85 19.96 24.60
r = 0 | 44.03 32.00 34.91 41.07
Eigenvectors, normalised to first column:
(These are the cointegration relations)
log_M.l4 log_Y.l4 log_q.l4 constant
log_M.l4 1.0000000 1.000000 1.000000 1.0000000
log_Y.l4 -2.3349911 -1.964137 -2.310461 0.1289107
log_q.l4 0.3914955 0.296525 1.597002 0.5449159
constant 4.7623184 3.163679 -1.124304 -8.1976233
Weights W:
(This is the loading matrix)
log_M.l4 log_Y.l4 log_q.l4 constant
log_M.d -0.02534055 -0.19646815 -0.014572363 8.370696e-15
log_Y.d 0.03520288 -0.05693835 0.001588987 -2.935783e-16
log_q.d 0.07446135 0.17817399 -0.046961572 -1.198650e-14
vamos acora criar o modelo de correção de erros pelo metodo de
ecm_model <- cajorls(vec_model, r = 1) # Assumindo uma relação de cointegração
ecm_model
$rlm
Call:
lm(formula = substitute(form1), data = data.mat)
Coefficients:
log_M.d log_Y.d log_q.d
ect1 -0.025341 0.035203 0.074461
log_M.dl1 -0.250525 0.054133 -0.150494
log_Y.dl1 2.073846 -0.014690 -0.306959
log_q.dl1 -0.164288 -0.017963 0.201061
log_M.dl2 -0.049048 0.057300 0.187856
log_Y.dl2 0.441862 -0.320574 0.095033
log_q.dl2 -0.121669 -0.010021 -0.110020
log_M.dl3 -0.014868 0.008783 -0.014206
log_Y.dl3 -0.218596 -0.095263 -0.665061
log_q.dl3 0.028887 -0.003810 -0.141237
$beta
ect1
log_M.l4 1.0000000
log_Y.l4 -2.3349911
log_q.l4 0.3914955
constant 4.7623184
roots(var_model)
[1] 0.8005093 0.7518345 0.7518345 0.5128831 0.5128831 0.4940832 0.4940832 0.3860852 0.3860852
O sistema é estável, pois todas as raízes do modelo estão dentro do círculo unitário (todas as raiz menores que 1), indicando que as dinâmicas entre as variáveis convergem ao longo do tempo para o equilíbrio de longo prazo.
Os resultados do modelo indicam que existe uma relação de cointegração entre as variáveis, conforme evidenciado pela significância do termo de correção de erro (ect1=−0.0253). O coeficiente negativo e significativo sugere que cerca de 2,53% dos desvios em relação ao equilíbrio de longo prazo são corrigidos a cada período, indicando um ajuste lento, mas consistente, em direção à relação de equilíbrio.
library(cointReg)
cointReg(y = Import$log_M,x =X_imp,n.lag = 4,demeaning=T) ->ECM
ECM
### FM-OLS model ###
Model: y ~ x
Parameters: Kernel = "ba" // Bandwidth = 20.7751 ("Andrews")
Coefficients:
Estimate Std.Err t value Pr(|t|>0)
log_Y 1.65778 0.12311 13.4657 < 2.2e-16 ***
log_q -0.63848 0.13245 -4.8206 4.536e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
ECM$varmat
log_Y log_q
log_Y 0.01515653 -0.01628028
log_q -0.01628028 0.01754266
Assim, pode-se dizer que existe uma relação de cointegração entre as variáveis, confirmada pela estimação do modelo FM-OLS, que ajusta uma relação de longo prazo robusta entre volume de importações, PIB e taxa de câmbio real. As elasticidades são consistentes com a teoria econômica: a elasticidade-renda (1.66) é positiva e maior que 1, indicando que as importações crescem mais do que proporcionalmente ao PIB, enquanto a elasticidade-câmbio (−0.64) é negativa, refletindo que uma desvalorização cambial reduz o volume de importações ao aumentar os preços dos bens importados.
library(readxl)
cambio <- read_excel("câmbio.xlsx", col_types = c("date",
"numeric", "numeric"))
Warning: Expecting numeric in C299 / R299C3: got '-'Warning: Expecting date in A300 / R300C1: got 'Fonte'Warning: Expecting numeric in B300 / R300C2: got 'Sisbacen PTAX800'Warning: Expecting numeric in C300 / R300C3: got 'BCB-DSTAT'
cambio$log_e <- log(cambio$`3695 - Taxa de câmbio - Livre - Dólar americano (compra) - Fim de período - mensal - u.m.c./US$`) # Log da taxa de câmbio nominal
cambio$log_q <- log(cambio$`11752 - Índice da taxa de câmbio real efetiva (IPCA) - Jun/1994=100 - Índice`) # Log da taxa de câmbio real
cambio %>% drop_na()->cambio
drop_na: removed 2 rows (1%), 297 rows remaining
cambio%>% ts(start =c(2000,2),freq=12 ) %>% plot
Antes de estimar os vars, é preciso averiguar a estacionáridade das series
# Verificar a estacionaridade das variáveis
adf.test(cambio$log_e)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 0.996 0.914
[2,] 1 1.046 0.920
[3,] 2 0.768 0.865
[4,] 3 0.708 0.848
[5,] 4 0.725 0.852
[6,] 5 0.723 0.852
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -0.722 0.795
[2,] 1 -0.719 0.796
[3,] 2 -0.991 0.701
[4,] 3 -0.976 0.706
[5,] 4 -0.932 0.721
[6,] 5 -0.976 0.706
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -1.44 0.812
[2,] 1 -1.40 0.829
[3,] 2 -1.67 0.716
[4,] 3 -1.71 0.700
[5,] 4 -1.67 0.713
[6,] 5 -1.69 0.709
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(cambio$log_q)
Augmented Dickey-Fuller Test
alternative: stationary
Type 1: no drift no trend
lag ADF p.value
[1,] 0 0.419 0.765
[2,] 1 0.314 0.734
[3,] 2 0.336 0.740
[4,] 3 0.308 0.732
[5,] 4 0.287 0.727
[6,] 5 0.268 0.721
Type 2: with drift no trend
lag ADF p.value
[1,] 0 -1.31 0.590
[2,] 1 -1.93 0.354
[3,] 2 -1.95 0.346
[4,] 3 -1.97 0.338
[5,] 4 -1.95 0.348
[6,] 5 -2.03 0.315
Type 3: with drift and trend
lag ADF p.value
[1,] 0 -1.41 0.827
[2,] 1 -2.00 0.576
[3,] 2 -2.01 0.570
[4,] 3 -2.04 0.560
[5,] 4 -2.02 0.568
[6,] 5 -2.11 0.532
----
Note: in fact, p.value = 0.01 means p.value <= 0.01
Ambos os resultados indicam que as séries não são estacionárias, permitindo o uso do modelo VAR. Para o modelo VAR optou-se por incluir tendencia e constante induzidas pela analise gráfica e duas defasagens foram selecionadas para eliminar autocorrelação nos resíduos, sem comprometer a significância das defasagens. A identificação estrutural de longo prazo assumiu que choques na taxa nominal não afetam permanentemente a taxa real.
var_data <- cambio[, c("log_e", "log_q")]
var_model <- VAR(var_data, p = 2, type = "both")
summary(var_model)
VAR Estimation Results:
=========================
Endogenous variables: log_e, log_q
Deterministic variables: both
Sample size: 295
Log Likelihood: 1239.466
Roots of the characteristic polynomial:
0.985 0.8985 0.5176 0.3242
Call:
VAR(y = var_data, p = 2, type = "both")
Estimation results for equation log_e:
======================================
log_e = log_e.l1 + log_q.l1 + log_e.l2 + log_q.l2 + const + trend
Estimate Std. Error t value Pr(>|t|)
log_e.l1 0.8175465 0.0752667 10.862 < 2e-16 ***
log_q.l1 0.3252088 0.1079891 3.011 0.00283 **
log_e.l2 0.2388857 0.0789511 3.026 0.00270 **
log_q.l2 -0.4285234 0.1033389 -4.147 4.44e-05 ***
const 0.4468552 0.2910693 1.535 0.12582
trend -0.0001306 0.0001371 -0.952 0.34173
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.04713 on 289 degrees of freedom
Multiple R-Squared: 0.9855, Adjusted R-squared: 0.9853
F-statistic: 3939 on 5 and 289 DF, p-value: < 2.2e-16
Estimation results for equation log_q:
======================================
log_q = log_e.l1 + log_q.l1 + log_e.l2 + log_q.l2 + const + trend
Estimate Std. Error t value Pr(>|t|)
log_e.l1 4.311e-01 4.743e-02 9.088 < 2e-16 ***
log_q.l1 8.726e-01 6.805e-02 12.822 < 2e-16 ***
log_e.l2 -3.362e-01 4.975e-02 -6.756 7.79e-11 ***
log_q.l2 -1.868e-02 6.512e-02 -0.287 0.774469
const 6.187e-01 1.834e-01 3.373 0.000846 ***
trend -2.442e-04 8.641e-05 -2.826 0.005040 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0297 on 289 degrees of freedom
Multiple R-Squared: 0.9784, Adjusted R-squared: 0.9781
F-statistic: 2624 on 5 and 289 DF, p-value: < 2.2e-16
Covariance matrix of residuals:
log_e log_q
log_e 0.002221 0.001076
log_q 0.001076 0.000882
Correlation matrix of residuals:
log_e log_q
log_e 1.0000 0.7689
log_q 0.7689 1.0000
amat <- diag(2) # Matriz de identificação estrutural
amat[2, 1] <- NA # Restrição: taxa nominal não tem efeito permanente na real,
amat
[,1] [,2]
[1,] 1 0
[2,] NA 1
svar_model <- SVAR(var_model, Amat = amat)
Warning: Convergence not achieved after 100 iterations. Convergence value: 0.00104177804634711 .
svar_model
SVAR Estimation Results:
========================
Estimated A matrix:
log_e log_q
log_e 1.0000 0
log_q -0.0155 1
As duas equações mostram que ambas as taxas log_e e log_q são interdependentes e influenciadas tanto pelos seus próprios valores defasados quanto pelas interações cruzadas. O modelo captura as dinâmicas de curto prazo entre as variáveis. A identificação estrutural impôs a restrição de que choques na taxa nominal não afetam permanentemente a taxa real.
irf_resultseq <- irf(svar_model, impulse = "log_e", response = "log_q",
n.ahead = 12, boot = TRUE)
irf_resultsqe <- irf(svar_model, impulse = "log_q", response = "log_e",
n.ahead = 12, boot = TRUE)
#cbind(irf_resultseq$irf$log_e,irf_resultseq$Lower$log_e,irf_resultseq$Upper$log_e)
irf_resultseq %>% plot
#cbind(irf_resultsqe$irf$log_q,irf_resultsqe$Lower$log_q,irf_resultsqe$Upper$log_q)
irf_resultsqe %>% plot
A função de impulso-resposta (IRF) mostra que choques na taxa nominal têm efeitos temporários na taxa real, enquanto choques na taxa real apresentam efeitos mais duradouros. Isso corrobora a restrição de longo prazo imposta ao modelo.
#structural_shocks <- residuals(svar_model$var)
structural_shocks %>% ts(start = c(2000,1),frequency = 12) %>%
window(c(2019,8),c(2021,1)) %>%autoplot()
#structural_shocks %>% as.data.frame() %>% select(log_e,log_q) %>%
# ts(start = c(2000,1),frequency = 12)%>%
# window(c(2018,1),c(2022,12)) %>%
# ggplot(aes)
##structural_shocks %>% as.data.frame() %>% select(log_q) %>%
# ts(start = c(2000,1),frequency = 12) %>% window(c(2018,1),c(2022,12))%>% ts.plot()
Os choques estruturais mostram que, durante a pandemia de 2020, houve uma alta volatilidade nos choques nominais, especialmente entre março e Maio de 2020. Por outro lado, os choques reais apresentaram menor volatilidade, mas ainda assim foram significativamente afetados, recebendo um choque grande em abril, refletindo ajustes estruturais na economia.
# Decomposição da variância
fevd_results <- fevd(svar_model, n.ahead = 10)
fevd_results
$log_e
log_e log_q
[1,] 1.0000000 0.00000000
[2,] 0.9406641 0.05933589
[3,] 0.9584455 0.04155445
[4,] 0.9670308 0.03296919
[5,] 0.9739441 0.02605592
[6,] 0.9761323 0.02386771
[7,] 0.9734024 0.02659759
[8,] 0.9673517 0.03264827
[9,] 0.9584906 0.04150936
[10,] 0.9479282 0.05207183
$log_q
log_e log_q
[1,] 0.0002400602 0.9997599
[2,] 0.1010045120 0.8989955
[3,] 0.1249425317 0.8750575
[4,] 0.1734425600 0.8265574
[5,] 0.2124015232 0.7875985
[6,] 0.2566652192 0.7433348
[7,] 0.2990882429 0.7009118
[8,] 0.3416794500 0.6583206
[9,] 0.3821972773 0.6178027
[10,] 0.4204140793 0.5795859
A decomposição da variância indica que a taxa nominal (log_e) e a taxa real (log_q) são predominantemente explicada por seus próprios choques no curto prazo, porém a taxa real (log_q) sobre maior influencia no longo prazo pela taxa nominal.
library(readxl)
mpyr_data <- read_excel("MPRY_cointegração.xlsx")
New names:
# Criar a variável m-p (diferença entre log(M1) e log(preços))
plot(mpyr_data %>% ts)
mpyr_data$mp <- mpyr_data$LM1 - mpyr_data$LP
adf_mp_2lags <- ur.df(mpyr_data$mp, type = "none", lags = 2)
adf_mp_4lags <- ur.df(mpyr_data$mp, type = "none", lags = 4)
adf_log_y_2lags <- ur.df(mpyr_data$LY, type = "none", lags = 2)
adf_log_y_4lags <- ur.df(mpyr_data$LY, type = "none", lags = 4)
adf_R_2lags <- ur.df(mpyr_data$R, type = "none", lags = 2)
adf_R_4lags <- ur.df(mpyr_data$R, type = "none", lags = 4)
# Exibir os resultados do ADF
summary(adf_mp_2lags)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-0.185285 -0.015641 0.002605 0.028442 0.152228
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 0.006641 0.005146 1.291 0.20038
z.diff.lag1 0.359840 0.110585 3.254 0.00164 **
z.diff.lag2 -0.009151 0.107012 -0.086 0.93206
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.05376 on 84 degrees of freedom
Multiple R-squared: 0.1747, Adjusted R-squared: 0.1452
F-statistic: 5.927 on 3 and 84 DF, p-value: 0.001021
Value of test-statistic is: 1.2906
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_mp_4lags)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-0.167341 -0.021045 0.001341 0.021794 0.133672
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 0.003069 0.005033 0.610 0.54369
z.diff.lag1 0.355614 0.113374 3.137 0.00239 **
z.diff.lag2 -0.154548 0.112089 -1.379 0.17180
z.diff.lag3 0.379156 0.112533 3.369 0.00116 **
z.diff.lag4 0.027303 0.111358 0.245 0.80694
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.05082 on 80 degrees of freedom
Multiple R-squared: 0.2923, Adjusted R-squared: 0.2481
F-statistic: 6.609 on 5 and 80 DF, p-value: 3.384e-05
Value of test-statistic is: 0.6098
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_log_y_2lags)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-0.203874 -0.027691 0.002593 0.040023 0.151014
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 0.009616 0.003198 3.007 0.00348 **
z.diff.lag1 0.282793 0.108960 2.595 0.01115 *
z.diff.lag2 -0.129319 0.107757 -1.200 0.23347
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.06152 on 84 degrees of freedom
Multiple R-squared: 0.2256, Adjusted R-squared: 0.1979
F-statistic: 8.156 on 3 and 84 DF, p-value: 7.907e-05
Value of test-statistic is: 3.0073
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_log_y_4lags)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-0.209925 -0.029029 0.005306 0.040224 0.160647
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 0.012162 0.003618 3.361 0.00119 **
z.diff.lag1 0.275216 0.110920 2.481 0.01519 *
z.diff.lag2 -0.159382 0.114471 -1.392 0.16768
z.diff.lag3 0.005431 0.114135 0.048 0.96216
z.diff.lag4 -0.178884 0.108884 -1.643 0.10433
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0615 on 80 degrees of freedom
Multiple R-squared: 0.2584, Adjusted R-squared: 0.212
F-statistic: 5.575 on 5 and 80 DF, p-value: 0.0001861
Value of test-statistic is: 3.3613
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_R_2lags)
###############################################
# 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.10452 -0.55130 0.07705 0.60051 3.03308
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 -0.008074 0.023843 -0.339 0.735737
z.diff.lag1 0.156345 0.102317 1.528 0.130257
z.diff.lag2 -0.366480 0.102834 -3.564 0.000606 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.165 on 84 degrees of freedom
Multiple R-squared: 0.1492, Adjusted R-squared: 0.1188
F-statistic: 4.91 on 3 and 84 DF, p-value: 0.003422
Value of test-statistic is: -0.3386
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_R_4lags)
###############################################
# 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
-2.71368 -0.48680 0.06395 0.69372 2.97532
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 -0.002471 0.024422 -0.101 0.919670
z.diff.lag1 0.195467 0.110961 1.762 0.081960 .
z.diff.lag2 -0.447490 0.112593 -3.974 0.000154 ***
z.diff.lag3 0.102078 0.111749 0.913 0.363747
z.diff.lag4 -0.194967 0.112129 -1.739 0.085923 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.162 on 80 degrees of freedom
Multiple R-squared: 0.1823, Adjusted R-squared: 0.1312
F-statistic: 3.568 on 5 and 80 DF, p-value: 0.005791
Value of test-statistic is: -0.1012
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.6 -1.95 -1.61
Para todas as variáveis analisadas. o teste ADF não rejeita a hipótese nula de raiz unitária em ambos os casos (com 2 e 4 lags). Isso confirma que as séries não são estacionárias em nível.
XX<-mpyr_data[,4:5] %>% as.matrix()
coint.test(y = mpyr_data$mp,X = XX,nlag = 4)
Response: mpyr_data$mp
Input: XX
Number of inputs: 2
Model: y ~ X + 1
-------------------------------
Engle-Granger Cointegration Test
alternative: cointegrated
Type 1: no trend
lag EG p.value
4.0000 -3.3184 0.0638
-----
Type 2: linear trend
lag EG p.value
4.0000 -0.0618 0.1000
-----
Type 3: quadratic trend
lag EG p.value
4.000 0.632 0.100
-----------
Note: p.value = 0.01 means p.value <= 0.01
: p.value = 0.10 means p.value >= 0.10
Pelo teste de Engle Granger rejeitamos a hipotese nula de não cointegração. Isso indica a existência de uma relação de cointegração entre as variaveis.
modelcoint$residuals %>% as.data.frame()%>% drop_na() %>% ts(end = max(mpyr_data$...1)) %>% acf()
drop_na: removed 9 rows (10%), 81 rows remaining
Os coeficientes estimados do modelo são estatisticamente significativos e mostram uma elasticidade positiva entre mp e logy (coeficiente 0.757643, indicando que um aumento de 1% no PIB leva a um aumento de aproximadamente 0,76% na demanda por moeda ajustada pelos preços. Esse resultado está alinhado com a teoria econômica, que prevê uma relação positiva entre renda e demanda por moeda. Por outro lado, a relação com a taxa de juros R é negativa (coeficiente −0.128801), como esperado, já que taxas de juros mais altas representam um maior custo de oportunidade de manter moeda, reduzindo a demanda por ela.
# Subamostra 1: 1903-1945
subsample1 <- subset(mpyr_data, DUMMY==0)
XX1<-subsample1[,4:5] %>% as.matrix()
cointRegD(x =XX1,y=subsample1$mp, n.lead = 4, n.lag = 4,demeaning=T) ->modelcoint1
modelcoint1
### D-OLS model ###
Model: subsample1$mp ~ XX1
Parameters: Kernel = "ba" // Bandwidth = 5.350522 ("Andrews")
Leads = 4 / Lags = 4 (set manually)
Coefficients:
Estimate Std.Err t value Pr(|t|>0)
LY 0.5642111 0.0353332 15.968 < 2.2e-16 ***
R -0.1362747 0.0081326 -16.756 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
modelcoint1$residuals %>% ts(end = max(subsample1$...1)) %>% plot(main="Residuals of Cointegration Regression (D-OLS)")
# Subamostra 2: 1946-1987
subsample2 <- subset(mpyr_data, DUMMY==1)
XX2<-subsample2[,4:5] %>% as.matrix()
cointRegD(x =XX2,y=subsample2$mp, n.lead = 4, n.lag = 4,demeaning=T) ->modelcoint2
modelcoint2
### D-OLS model ###
Model: subsample2$mp ~ XX2
Parameters: Kernel = "ba" // Bandwidth = 7.494225 ("Andrews")
Leads = 4 / Lags = 4 (set manually)
Coefficients:
Estimate Std.Err t value Pr(|t|>0)
LY 0.6999462 0.0195363 35.828 < 2.2e-16 ***
R -0.0769930 0.0049953 -15.413 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
modelcoint2$residuals %>% ts(end = max(subsample2$...1)) %>% plot(main="Residuals of Cointegration Regression (D-OLS)")
O novo modelo em periodos separados mostrou residuos melhor comportados. A elasticidade renda da demanda por moeda aumentou de 0.564 para 0.700 entre as duas subamostras, o que pode indicar mudanças estruturais na economia ao longo do tempo. A modernização econômica e o aumento do uso de moeda em transações podem ter contribuído para essa maior sensibilidade ao PIB.Em ambas as subamostras, a elasticidade é menor que 1, o que está de acordo com a teoria econômica, sugerindo que a demanda por moeda aumenta a uma taxa menor que a do crescimento econômico. já a elasticidade em relação à taxa de juros diminuiu de −0.136 no período de 1903-1945 para −0.077 no período de 1946-1987. Isso sugere que, com o avanço econômico e financeiro, a sensibilidade da demanda por moeda às mudanças na taxa de juros foi reduzida, possivelmente devido à maior diversificação dos instrumentos financeiros disponíveis e mudanças nos hábitos de liquidez da economia.