Category

Comentário de Conjuntura

Investigando cointegração entre consumo de energia e crescimento do PIB

By | Comentário de Conjuntura

Como tenho comentado nas últimas semanas, estamos tendo acesso aos primeiros dados de março que trazem os efeitos da pandemia do coronavírus sobre a economia brasileira. Um dos indicadores que tenho acompanhado mais de perto é o consumo diário de energia elétrica. Como comentei também por aqui, publicamos na semana passada a Edição 73 do Clube do Código, que traz uma intensa investigação da relação dessa série com o PIB, tanto em nível quanto em termos de taxa de crescimento.

Nesse Comentário de Conjuntura trago mais alguns detalhes do exercício. O mesmo está disponível no repositório privado do Clube no github, acessível para alunos do plano premium dos nossos Cursos Aplicados de R e para os assinantes do Clube. Para assinar, clique aqui. A seguir, carregamos os pacotes utilizados na investigação.


library(tidyverse)
library(scales)
library(readxl)
library(xts)
library(forecast)
library(sidrar)
library(lubridate)
library(zoo)
library(gridExtra)
library(tstools)
library(vars)
library(aod)
library(dynlm)
library(stargazer)
### Pacote Seasonal
library(seasonal)
Sys.setenv(X13_PATH = "C:/Séries Temporais/R/Pacotes/seas/x13ashtml")

A seguir, nós importamos as séries de energia e do PIB.


## Coleta de dados de energia
energia = read_csv2('energia.csv',
col_types = list(col_date(format='%d/%m/%Y'),
col_double()))

## Coletar dados do PIB
# PIB com ajuste sazonal
pib_sa = get_sidra(api='/t/1621/n1/all/v/all/p/all/c11255/90707/d/v584%202') %>%
mutate(date = as.yearqtr(`Trimestre (Código)`, format='%Y%q')) %>%
dplyr::select(date, Valor) %>%
as_tibble()
# PIB sem ajuste
names = c('date', 'pib_sa', 'pib', 'anual_pib')
pib = get_sidra(api='/t/1620/n1/all/v/all/p/all/c11255/90707/d/v583%202') %>%
mutate(date = as.yearqtr(`Trimestre (Código)`, format='%Y%q')) %>%
mutate(pib_sa = pib_sa$Valor) %>%
mutate(anual_pib = acum_i(Valor, 4)) %>%
dplyr::select(date, pib_sa, Valor, anual_pib) %>%
as_tibble() %>%
`colnames<-`(names)

Os dados de energia e do PIB estão com frequências diferentes, de modo que é preciso torná-las comparáveis. O código a seguir trata disso.


## Trimestralizar dados de Energia
consumo_energia = xts(energia$carga, order.by = energia$date)
consumo_energia_trimestral = apply.quarterly(consumo_energia, FUN=mean)
consumo_energia_trimestral_ts = ts(consumo_energia_trimestral,
start=c(2000,01), freq=4)
consumo_energia_trimestral_sa = final(seas(consumo_energia_trimestral_ts))
energia_trimestral = tibble(date = as.yearqtr(index(consumo_energia_trimestral_sa), format='%Y%q'),
carga=consumo_energia_trimestral_sa) %>%
mutate(anual_carga = acum_i(carga,4))

## Reunir dados
data = inner_join(pib, energia_trimestral, by='date') %>%
dplyr::select(date, pib_sa, carga, anual_pib, anual_carga) %>%
drop_na()

Com os dados comparáveis, nós plotamos o gráfico abaixo.

Uma das várias coisas que fazemos na Edição 73 do Clube do Código é estimar um modelo de correção de erros (ECM) entre as séries, uma vez que as mesmas guardam uma relação de longo prazo entre si. O modelo estimado é o seguinte:

(1)   \begin{align*} \Delta Carga_t = \gamma_0 + \gamma_1 \hat{u_{t-1}} + \gamma_2 \Delta PIB_t + \varepsilon_t \end{align*}

A tabela a seguir resume o modelo estimado.

Dependent variable:
d(anual_carga)
stats::lag(resid, -1) -0.189***
(0.055)
d(anual_pib) 1.032***
(0.183)
Constant 0.147
(0.184)
Observations 72
R2 0.403
Adjusted R2 0.386
Residual Std. Error 1.558 (df = 69)
F Statistic 23.273*** (df = 2; 69)
Note: *p<0.1; **p<0.05; ***p<0.01

 

(*) Aprenda a produzir exercícios como esse em nossos Cursos Aplicados de R.

(**) Os códigos estão disponíveis no Clube do Código.


Incerteza e atividade econômica

By | Comentário de Conjuntura

A pandemia do coronavírus vai ter um forte impacto sobre o nível de atividade, como já antecipam os primeiros indicadores antecedentes até aqui divulgados. É provável que seja o maior choque exógeno da nossa geração. Isso dito, um problema imediato surge: como quantificar os efeitos da pandemia sobre a economia?

Uma estratégia é utilizar indicadores correlacionados a choques como esse. Os candidatos mais óbvios são os indicadores de incerteza e de volatilidade. Abaixo, trazemos dois deles. O primeiro é o índice de incerteza econômica (IIE), produzido pelo núcleo de estatística da FGV. O segundo é o VIX, que mede volatilidade e é produzido pelo CBOE.

Os gráficos acima mostram que momentos de maior incerteza estão associados a choques como esse que estamos vivendo. E, como podemos ver a seguir, incerteza e nível de atividade, aqui representado pelo hiato do produto, estão negativamente correlacionados. Isto é, maiores níveis de incerteza estão correlacionados com hiato mais negativo.

Diversos estudos, inclusive, mostram que choques de incerteza provocam queda no crescimento econômico e, consequentemente, abertura do hiato. Na edição 52 do Clube do Código, por exemplo, nós verificamos o efeito da incerteza sobre variáveis macroeconômicas selecionadas, como o crescimento econômico. Os resultados encontrados sugerem que há uma redução no crescimento do PIB quando do efeito de um choque de incerteza.

Ademais, ao verificarmos a decomposição de variância entre as variáveis, é possível verificar que a incerteza tem grande impacto sobre a variância da proxy que representa o nível de atividade.

Isso dito, podemos esperar um grande impacto sobre o nível de atividade vindo da pandemia do coronavírus. A dimensão do impacto, contudo, ainda é bastante incerta. Vai depender, por exemplo, do tempo em que a economia brasileira será mantida em quarentena e, também, de como serão as medidas de política econômica e de política pública a serem adotadas pelo governo.

________________________

(*) Aprenda a produzir exercícios como esse em nossos Cursos Aplicados de R.

(**) Os códigos estão disponíveis no Clube do Código.


Reformas dos últimos anos permitem melhor enfrentamento ao coronavírus

By | Comentário de Conjuntura

A pandemia do coronavírus vai obrigar o estado brasileiro a gastar algo próximo ao que economizou com a reforma da previdência no ano passado. Se os números divulgados pelo atual ministro da economia em uma live com o pessoal da XP nesse final de semana estiverem corretos - o que eu particularmente tenho dúvidas. E, diga-se, deve mesmo gastar. Estamos lidando com um choque humanitário, onde a reação de política pública deve se concentrar em preservar as pessoas. Seja aumentando o gasto com saúde, seja ampliando de reforma rápida a rede de proteção social.

Proteger as pessoas, nesse momento, diga-se, é fazer um investimento no futuro. Preservar capital humano, permitindo que a retomada do organismo econômico seja o mais célere possível.

A calamidade pública imposta pela chegada do Covid-19 ao Brasil acionou as válvulas de escape da lei de responsabilidade fiscal e da emenda do teto de gastos. Isso liberou o estado brasileiro a fazer gastos extraordinários para tentar conter a pandemia no país.

O aumento do gasto no curto prazo, seja lá qual for a sua dimensão, será financiado via emissão de títulos. As pessoas físicas e jurídicas comprarão os títulos emitidos, liberando recursos para que o governo possa realizar os gastos necessários com saúde e proteção social.

A consequência disso será tanto o aumento da dívida pública quanto o aumento do seu custo e encurtamento do prazo. Isto é, a dívida vai ficar mais alta e mais difícil de ser paga. Isso implica que o ajuste fiscal no período t+k, onde k representa a quantidade de trimestres que levará para os efeitos da pandemia passar, deverá ser ainda maior do que o que vinha sendo implementado ao longo dos últimos três anos.

Para ilustrar esse ponto, vamos ver o que aconteceu com os yields de duas NTN-B, uma com vencimento em 2045 e outra com vencimento em 2024. Para isso, nós usamos o pacote GetTDData para coletar os dados, o pacote ggplot2 para visualização e outros pacotes da família tidyverse para tratamento.


library(GetTDData)
library(ggplot2)
library(dplyr)
library(magrittr)
library(scales)
library(gridExtra)

ntnb <- download.TD.data('NTN-B')
ntnb45 <- read.TD.files(dl.folder = 'TD Files',
maturity = '150545')

g1 = filter(ntnb45, ref.date > '2019-01-01') %>%
ggplot(aes(x=ref.date, y=yield.bid*100))+
geom_line()+
scale_x_date(breaks = date_breaks("2 month"),
labels = date_format("%b/%Y"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10))+
labs(x='', y='% a.a.',
title='NTN-B 2045')

ntnb24 <- read.TD.files(dl.folder = 'TD Files',
maturity = '150824')

g2 = filter(ntnb24, ref.date > '2019-01-01') %>%
ggplot(aes(x=ref.date, y=yield.bid*100))+
geom_line()+
scale_x_date(breaks = date_breaks("2 month"),
labels = date_format("%b/%Y"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10))+
labs(x='', y='% a.a.',
title='NTN-B 2024')

grid.arrange(g1, g2,
ncol=2, nrow=1)

Como é possível observar nos gráficos, houve um salto nos yields. Esse movimento fez com que o Tesouro entrasse comprador no mercado, sem data de saída, de modo a garantir a liquidez do sistema.

Um ponto importante aqui é que os juros associados aos títulos públicos estavam caindo antes da pandemia, refletindo a queda geral de juros que tivemos no país nos últimos anos. Houve uma queda do juro de equilíbrio da economia brasileira, refletindo em particular a emenda do teto de gastos, que garantiu maior solvência do setor público no médio/longo prazo. Sobre isso, inclusive, publicamos exercício no Clube do Código.

Em outras palavras, se ainda estivéssemos vivendo em um país sem teto de gastos e sem reforma da previdência, é provável que o "salto nos yields" fosse ainda maior, o que tornaria a tarefa de reagir à pandemia ainda mais complexa. No limite, o estado brasileiro teria que emitir moeda para fazer frente ao necessário aumento de gastos.

Feitas essas ressalvas, volto ao ponto da fragilidade fiscal. Mesmo com todas as medidas feitas até aqui, ainda estamos em um ponto bastante delicado. Para ilustrar, considere o nível de endividamento do setor público, com os dados do Banco Central coletados através do pacote BETS.


library(BETS)
library(tidyr)
dbgg = BETSget(13762, data.frame=TRUE)

drop_na(dbgg) %>%
ggplot(aes(x=date, y=value))+
geom_line()+
scale_x_date(breaks = date_breaks("1 year"),
labels = date_format("%Y"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10))+
labs(x='', y='% PIB',
title='Dívida Bruta do Governo Geral')

Observe que tivemos um aumento de dívida bastante pronunciado desde 2014. Somente na margem, com diversas medidas tomadas, como a devolução do valor emprestado ao BNDES, que a dívida bruta ensaiava sua redução. Nosso nível de endividamento é consideravelmente elevado, se comparado a países com mesma renda per capita.

Em termos de fluxo, por suposto, as coisas estavam melhorando, ainda que permanecesse a geração de déficit primário, quando o setor público não consegue gerar receitas o suficiente para pagar suas despesas essenciais.


primario = BETSget(5793, data.frame=TRUE)

drop_na(primario) %>%
ggplot(aes(x=date, y=-value))+
geom_line()+
geom_hline(yintercept=0, colour='red', linetype='dashed')+
scale_x_date(breaks = date_breaks("1 year"),
labels = date_format("%Y"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10))+
labs(x='', y='% PIB',
title='Resultado Primário')

Em síntese, nosso quadro fiscal é muito pior do que às vésperas da crise de 2008. E a crise atual é muito mais severa do que a crise de 2008. Como já dito e insisto, o estado brasileiro deve fazer tudo o que for necessário para conter os efeitos da pandemia. Mas quando tudo passar, não se engane, estaremos desafiados à aumentar em muitos graus o esforço reformista. Sem ele, estaríamos ainda mais vulneráveis do que estamos hoje.

________________________

(*) Aprenda R nos nossos Cursos Aplicados de R.

(**) Um pdf com os códigos estará disponível amanhã no Clube do Código.


Modelando o coronavírus no Brasil

By | Comentário de Conjuntura

Nas últimas semanas, o mundo foi assolado pela maior pandemia das últimas décadas, com impactos severos sobre os mercados globais e sobre os sistemas de saúde de grande parte dos países. No Brasil, o primeiro caso foi registrado no último dia 26 de fevereiro e a curva de crescimento dos infectados segue uma trajetória exponencial. De forma a compreender o comportamento dos casos no país, nós vamos implementar o famoso modelo SIR proposto por Kermack e McKendrick (1927) aos dados de covid-19 no Brasil. Meu objetivo aqui é basicamente construir o gráfico abaixo com as previsões de casos confirmados a partir de um modelo SIR.

Para estimar o modelo SIR, estou basicamente replicando o código do blog Learning Machines, com algumas mudanças tópicas para visualização e previsão dos casos infectados nos próximos dias em nosso país. Os dados para o Covid-19 foram obtidos através do pacote nCov2019. É possível, diga-se, que existam dados mais atualizados no repositório da JHU ou na plataforma do Ministério da Saúde. Os demais pacotes utilizados são carregados a seguir.


require(nCov2019)
require(dplyr)
require(ggplot2)
require(scales)
require(gridExtra)
require(deSolve)

Os dados são obtidos a seguir.


## Obtendo os dados
data = load_nCov2019()
data_global = data["global"] #extract global data
data_br = filter(data_global, country == 'Brazil')

A seguir, visualizamos os dados.


Infected = data_br$cum_confirm
Day <- 1:(length(Infected))
N <- 211289547 # População do Brasil

df = tibble(Day, Infected, lnInfected = log(Infected))

g1 = ggplot(df, aes(x=Day, y=Infected))+
geom_line()+
geom_point()+
labs(x='Dias', y='Casos')

g2 = ggplot(df, aes(x=Day, y=lnInfected))+
geom_line()+
geom_point()+
geom_smooth(method='lm', se=FALSE)+
labs(x='Dias', y='log(Casos)')

grid.arrange(g1, g2,
ncol=2, nrow=1,
top='Total de Infectados por Covid-19 no Brasil')

O modelo SIR é um dos modelos epidemiológicos mais simples, e muitos modelos são derivações do mesmo. O modelo consiste em três compartimentos: S para o número de pessoas suscetíveis à doença, I para o número de infectados e R para o número de indivíduos recuperados (ou imunes).

Para modelar a dinâmica de uma epidemia, precisamos de três equações diferenciais, uma para a mudança em cada compartimento, com o parâmetro \beta controlando a transição entre S e I e \gamma controlando a transição entre I e R:

(1)   \begin{align*} \frac{dS}{dI} &= \frac{\beta IS}{N} \nonumber \\ \frac{dI}{dt} &= \frac{\beta IS}{N} - \gamma I \nonumber \\ \frac{dR}{dt} &= \gamma I \nonumber \end{align*}

A seguir implementamos o código do blog Learning Machines para ajustar o modelo aos nossos dados:


SIR <- function(time, state, parameters) {
par <- as.list(c(state, parameters))
with(par, {
dS <- -beta/N * I * S
dI <- beta/N * I * S - gamma * I
dR <- gamma * I
list(c(dS, dI, dR))
})
}


init <- c(S = N-Infected[1], I = Infected[1], R = 0)

RSS <- function(parameters) {
names(parameters) <- c("beta", "gamma")
out <- ode(y = init, times = Day, func = SIR, parms = parameters)
fit <- out[ , 3]
sum((Infected - fit)^2)
}


Opt <- optim(c(0.5, 0.5), RSS,
method = "L-BFGS-B",
lower = c(0, 0), upper = c(1, 1))

Opt_par <- setNames(Opt$par, c("beta", "gamma"))


t <- 1:33 # time in days
fit <- data.frame(ode(y = init, times = t,
func = SIR, parms = Opt_par))

Com o modelo estimado, nós podemos ver o ajuste do mesmo abaixo.


df2 = tibble(time = data_br$time,
observado = data_br$cum_confirm,
modelo = round(fit$I[1:length(Infected)],0),
dias = Day)

ggplot(df2, aes(x=time))+
geom_point(aes(y=observado, colour='Casos Confirmados'),
stat='identity')+
geom_line(aes(y=modelo, colour='Modelo'))+
scale_colour_manual('',
values=c('Casos Confirmados'='black',
'Modelo'='red'))+
scale_x_date(breaks = date_breaks("1 day"),
labels = date_format("%d/%b"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=12, face='bold'),
legend.position = c(.3,.6))+
labs(x='', y='Casos Confirmados',
title='Modelando casos de Covid-19 no Brasil',
subtitle='Modelo SIR aplicado ao Brasil',
caption='analisemacro.com.br')

Na sequência nós visualizamos os casos previstos para os próximos dias.


dates = seq(data_br$time[1], length.out = length(t), by='1 days')
df3 = tibble(time = dates,
observado = c(data_br$cum_confirm,
rep(NA,
length(fit$I)-length(data_br$cum_confirm))),
modelo = round(fit$I,0))

ggplot(df3, aes(x=time))+
annotate("rect", fill = "orange", alpha = 0.3,
xmin = as.Date('2020-03-24'),
xmax = as.Date('2020-03-29'),
ymin = -Inf, ymax = Inf)+
annotate('text', x=as.Date('2020-03-26'), y=1000,
label='Previsão',
colour='black', size=4.5)+
geom_point(aes(y=observado, colour='Casos Confirmados'),
stat='identity', size=3)+
geom_line(aes(y=modelo, colour='Modelo'),
linetype='dashed', size=.8)+
scale_colour_manual('',
values=c('Casos Confirmados'='black',
'Modelo'='red'))+
scale_x_date(breaks = date_breaks("1 day"),
labels = date_format("%d/%b"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=12, face='bold'),
legend.position = c(.3,.6))+
labs(x='', y='Casos Confirmados',
title='Projetando casos de Covid-19 no Brasil',
subtitle='Modelo SIR aplicado ao Brasil',
caption='Fonte: analisemacro.com.br')

Mantida a trajetória de crescimento, teremos quase 9 mil casos no próximo dia 29/03. Obviamente que essa tendência não leva em consideração as medidas de distanciamento social que visam reduzir a taxa de reprodução, isto é, quantas pessoas saudáveis uma pessoa infectada contamina, em média. Ela é obtida pela razão entre os parâmetros \beta e \gamma. Para os dados disponibilizados até aqui, a taxa de reprodução está em 1,79 no Brasil, abaixo de 2 que tem sido a taxa obtida em outros países.

________________________

Kermack, William Ogilvy, and Anderson G. McKendrick. 1927. “A Contribution to the Mathematical Theory of Epidemics.” Proceedings of the Royal Society of London, Series A 115, no. 772: 700–721.

(*) Aprenda R nos nossos Cursos Aplicados de R.

(**) Um pdf com os códigos estará disponível amanhã no Clube do Código.


Evolução do coronavírus no Brasil

By | Comentário de Conjuntura

O Brasil chegou hoje aos 291 casos confirmados de Covid-19, o coronavírus. A evolução da doença no Brasil e a comparação com outros países, em particular com a Itália, mostra que o país precisa adotar medidas ainda mais restritivas de afastamento social. Para ilustrar, a seguir importo os dados disponibilizados pelo Ministério da Saúde.


library(tidyverse)
library(scales)

data = read_csv('data.csv') %>%
add_row(Data = '2020-03-17', pos = 291) %>%
mutate(incidence = pos - lag(pos,1)) %>%
mutate(dias = seq(1:length(pos)))

A seguir, nós coletamos os dados referentes à Itália.


italia = read_csv2('italia.csv',
col_types = list(col_date(format='%d/%m/%Y'),
col_double())) %>%
mutate(dias = seq(1:length(confirmados)))

O gráfico abaixo mostra o comportamento dos casos confirmados ao longo do tempo.


ggplot(data, aes(x=Data, y=pos))+
geom_line(size=.8, colour='darkblue')+
geom_point(colour='red', fill='red')+
scale_x_date(breaks = date_breaks("3 day"),
labels = date_format("%d/%b"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10, face='bold'))+
labs(x='', y='',
title='Casos de Covid-19 confirmados no Brasil',
caption='Fonte: Ministério da Saúde')

A seguir, plotamos a incidência diária.


ggplot(data, aes(x=Data, y=incidence))+
geom_bar(stat='identity', colour='darkblue', fill='darkblue',
width=.8)+
scale_x_date(breaks = date_breaks("2 day"),
labels = date_format("%d/%b"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10, face='bold'))+
labs(x='', y='',
title='Incidência de Casos de Covid-19 no Brasil',
caption='Fonte: Ministério da Saúde')

Para efeitos de comparação, colocamos abaixo a curva italiana a partir dos 150 casos.

filter(italia, confirmados > 150) %>%
ggplot(aes(x=date, y=confirmados/1000))+
geom_line(size=.8, colour='darkblue')+
geom_hline(yintercept=10, colour='black', linetype='dashed')+
geom_point(colour='red', fill='red')+
scale_x_date(breaks = date_breaks("1 day"),
labels = date_format("%d/%b"))+
theme(axis.text.x=element_text(angle=45, hjust=1),
plot.title = element_text(size=10, face='bold'))+
labs(x='', y='Mil Casos',
title='Casos de Covid-19 confirmados na Itália',
caption='Fonte: Johns Hopkins CSSE')

A Itália saiu de 155 para 10.149 casos em apenas 16 dias! Em outras palavras, o Brasil precisa urgentemente adotar medidas fortes de isolamento social para que não sigamos a mesma trajetória.

________________________

(*) Na próxima sexta-feira, publico um modelo de ajuste para a propagação do Covid-19 no âmbito do Clube do Código.

(**) Isso e muito mais você aprende nos nossos Cursos Aplicados de R.

(***) O código completo e os datasets estarão disponíveis amanhã no Clube do Código.

(****) Quem quiser reproduzir os códigos acima, pode baixar os datasets aqui e aqui.


Cadastre-se na newsletter
e receba nossas novidades em primeira mão!