Estimando uma Curva de Phillips para o Brasil

O objetivo do post de hoje será criar um código em R para uma forma reduzida da Curva de Phillips com a imposição da restrição de verticalidade de longo prazo estimada com instrumentos para o Brasil. O modelo segue uma versão simplificada do apresentado pelo Boxe do RI 2018/09.

A Curva de Phillips para a inflação de preços livres do Brasil é representada por:

(1)    \begin{align*} \pi_t^{livres} = \sum_{i>0} \beta_{1i} E_t \pi^{total}_{t+i} +\sum_{j>0} \beta_{2j} \pi^{total}_{t-j} +\sum_{k \geq 0} \beta_{3k} \pi^{importada}_{t-k} + \sum_{l>0} \beta_{4l} hiato_{t-l} + \sum_{m = 1}^4 D_m + \epsilon_t  \end{align*}

com a imposição da restrição de verticalidade de longo prazo:

(2)    \begin{align*} \sum_{i>0} \beta_{1i} +\sum_{j>0} \beta_{2j} +\sum_{k \geq 0} \beta_{3k} = 1 \end{align*}

onde $\pi_t^{livres}$ é a inflação de preços livres do IPCA; $ E_t \pi^{total}_{t+i}$ é a expectativa em t acerca da inflação do IPCA i trimestres à frente; $ \pi^{total}_{t-j}$ é a inflação do IPCA; $\pi^{importada}_{t-k} $é uma medida da inflação importada;$ hiato_{t-l} $é uma medida do hiato do produtos; $D_m $ são Dummys de choques e $\epsilon_t $ um termo de erro.

Basicamente, a inflação dos preços livres é uma função linear da inflação passada, das expectativas de inflação, do hiato do produto e da inflação importada. Os dados são trimestrais.

Para estimarmos a Curva de Phillips iremos passar por todas as etapas do processo de análise de dados utilizando o R, iremos coletar os dados, realizar os devidos tratamentos, e por fim iremos estimar a equação por meio de uma regressão em dois estágios.

Coleta e tratamento de dados

Expectativas de Inflação

Vamos começar importando os dados da expectativas de inflação do Banco de dados do Banco Central, referente ao Boletim Focus, utilizando o pacote {rbcb}. Como estamos trabalhando com variáveis trimestrais, teremos que realizar a mudança dos valores importados de mensais para a frequência menor.


# Coleta expectativa acumulada em 12 meses do IPCA - FOCUS
exp_ipca <- rbcb::get_twelve_months_inflation_expectations(
indic
= "IPCA",
end_date = Sys.Date()
)
# Trimestraliza expectativa (média)
exp_ipca_aux <- exp_ipca %>%
dplyr::filter(
base == 0,
# base 0
smoothed == "S" # estatística suavizada
) %>%
dplyr::group_by(
date_y = lubridate::year(date),
date_m = lubridate::month(date)
) %>%
dplyr::summarise(
mean_month = mean(median), # média mensal
.groups = "drop"
) %>%
dplyr::group_by(
date_quarter = lubridate::make_date(year = date_y, month = date_m) %>%
lubridate::quarter(with_year = TRUE)
) %>%
dplyr::summarise(
ipca_exp_12m = mean(mean_month), # média trimestral
.groups = "drop"
)

Inflação Total e de Preços Livres

A inflação total e de preços livres são importadas por meio do pacote {GetBCBData} e acumulada em 12 meses por meio da função acum_quarter criada manualmente. Além disso, há também a criação do IPCA Livres ajustados sazonalmente por meio do X 13ARIMA SEATS.


acum_quarter <- function(x){
x_fac <- 1+(x/100)
x_cum <- RcppRoll::roll_prodr(x_fac, n = 3)
x_qr <- dplyr::last((x_cum-1)*100)
return(x_qr)
}
# Coleta de dados do IPCA (cheio e livres)
dados_ipca <- GetBCBData::gbcbd_get_series(
id = c(
"ipca_total"
= 433,
# códigos do SGS/BCB
"ipca_livres" = 11428
),
first.date
= "1998-01-01",
format.data = "wide",
use.memoise = FALSE
) %>%
dplyr::mutate(date_quarter = lubridate::quarter(`ref.date`, with_year = TRUE)) %>%
dplyr::group_by(date_quarter) %>%
dplyr::summarise(
dplyr::across(
c(ipca_total, ipca_livres),
~acum_quarter(.x)
),
.groups = "drop"
)
# Ajustar sazonalmente IPCA Livres
ipca_livres_sa <- dados_ipca %>%
tidyr::drop_na() %>%
dplyr::select(date_quarter, ipca_livres) %>%
dplyr::filter(date_quarter >= 1999.4) %>%
dplyr::mutate(
date = lubridate::yq(date_quarter) %>%
tsibble::yearquarter()
) %>%
tsibble::as_tsibble(index = "date") %>%
fabletools::model(x11 = feasts::X_13ARIMA_SEATS(ipca_livres ~ x11())) %>%
fabletools::components() %>%
dplyr::as_tibble() %>%
dplyr::mutate(
date_quarter = lubridate::quarter(date, with_year = TRUE),
ipca_livres_sa = season_adjust
) %>%
dplyr::select(date_quarter, ipca_livres_sa)
# Juntar com dados do IPCA
dados_ipca <- dplyr::left_join(dados_ipca, ipca_livres_sa, by = "date_quarter")

IC-Br

O Indicador IC-Br é utilizado como medida da inflação importada. É importado através do banco de dados do Banco Central por meio do pacote {GetBCBData}.


acum_ic <- function(x){

x_diff <- log(x/dplyr::first(x))*100

x_acum <- dplyr::last(x_diff)

return(x_acum)

}

dados_ic <- GetBCBData::gbcbd_get_series(
id = c("ic_br" = 27574), # códigos do SGS/BCB
first.date = "1998-01-01",
format.data = "wide",
use.memoise = FALSE
) %>%
dplyr::mutate(date_quarter = lubridate::quarter(`ref.date`, with_year = TRUE)) %>%
dplyr::group_by(date_quarter) %>%
dplyr::summarise(ic_br = acum_ic(ic_br), .groups = "drop")

Hiato do Produto

Para o Hiato do produto, é utilizado os dados criados pela IFI - Instituição Fiscal Independente. Realiza-se o download e a importação da planilha com seus devidos tratamentos.


hiato <- rio::import(
file = paste0(
"https://www12.senado.leg.br/ifi/dados/arquivos/",
"estimativas-do-hiato-do-produto-ifi/at_download/file"
),
format = "xlsx",
sheet = "Hiato do Produto",
skip = 1
) %>%
dplyr::mutate(
date_quarter = lubridate::quarter(`Trim-Ano`, with_year = TRUE),
hiato = `Hiato` * 100
) %>%
dplyr::select(date_quarter, hiato)

Por fim, realiza-se a junção de todos os data frames criados anteriormente em um só, bem como cria-se as defasagens e o dummys.

 
dados_reg <- purrr::reduce(
  .x = list(dados_ipca, dados_ic, hiato, exp_ipca_aux), 
  .f = dplyr::left_join,
  by = "date_quarter"
  ) %>%
  dplyr::mutate(
    ipca_total_lag1      = dplyr::lag(ipca_total, 1),
    ipca_total_lag2      = dplyr::lag(ipca_total, 2),
    ipca_livres_lag1     = dplyr::lag(ipca_livres, 1),
    ipca_livres_lag2     = dplyr::lag(ipca_livres, 2),
    ipca_livres_sa_lag1  = dplyr::lag(ipca_livres_sa, 1),
    ic_lag1              = dplyr::lag(ic_br, 1),
    ic_lag2              = dplyr::lag(ic_br, 2),
    hiato_lag1           = dplyr::lag(hiato, 1),
    hiato_lag2           = dplyr::lag(hiato, 2),
    hiato_lag3           = dplyr::lag(hiato, 3),
    hiato_lag4           = dplyr::lag(hiato, 4),
    ipca_exp_12m_lag1    = dplyr::lag(ipca_exp_12m, 1),
    ipca_exp_12m_lag2    = dplyr::lag(ipca_exp_12m, 2),
    ipca_exp_12m_lag3    = dplyr::lag(ipca_exp_12m, 3),
    ipca_exp_12m_lag4    = dplyr::lag(ipca_exp_12m, 4),
    ipca_exp_12m_lead1   = dplyr::lead(ipca_exp_12m, 1),
    ipca_exp_12m_lead2   = dplyr::lead(ipca_exp_12m, 2),
    ipca_exp_12m_lead3   = dplyr::lead(ipca_exp_12m, 3),
    quarter              = stringr::str_sub(date_quarter, start = 6, end = 6) %>% as.numeric(),
    quarter_1            = dplyr::if_else(quarter == 1, 1, 0),
    quarter_2            = dplyr::if_else(quarter == 2, 1, 0),
    quarter_3            = dplyr::if_else(quarter == 3, 1, 0),
    quarter_4            = dplyr::if_else(quarter == 4, 1, 0),
    d_lula               = dplyr::if_else(date_quarter %in% c(2002.3, 2003.1, 2003.2), 1, 0),
    d_subprime           = dplyr::if_else(date_quarter == 2008.2, 1, 0),
    d_dilma              = dplyr::if_else(date_quarter == 2015.2, 1, 0),
    d_covid              = dplyr::if_else(date_quarter %in% c(2020.3, 2020.4), 1, 0)
    ) %>% 
  dplyr::filter(date_quarter >= 2002.1) %>%
  tidyr::drop_na() %>% 
  as.data.frame()

Modelagem

Para estimar o modelo, utiliza-se o pacote {systemfit} para aplicar uma Regressão Linear em dois estágios.


# Instrumentos (expressão de fórmula)
instrumentos <- ~ ipca_livres_lag1 + ipca_exp_12m_lead2 + ipca_total_lag1 + ic_lag1 + hiato_lag1 + d_lula + d_dilma + d_covid + quarter_1 + quarter_2 + quarter_3
# Restrição de longo prazo
restricao <- "eq1_ipca_exp_12m + eq1_ipca_total_lag1 + eq1_ic_lag1 = 1"
# Estimação
eq_phillips <- systemfit::systemfit(
formula = ipca_livres ~ -1 + ipca_exp_12m + ipca_total_lag1 + ic_lag1 + hiato_lag1 + d_lula + d_dilma + d_covid + quarter_1 + quarter_2 + quarter_3,
method
= "2SLS",
data
= dados_reg,
inst
= instrumentos,
restrict.matrix = restricao
)

O resultado do modelo apresentado no atual momento é dado pela seguinte imagem:

_____________________________________

Quer saber mais?

Veja a nossa trilha de Macroeconomia Aplicada.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como Construir um Monitor de Política Monetária Automatizado com Python?

Descubra como transformar dados do Banco Central em inteligência de mercado com um Monitor de Política Monetária Automatizado. Neste artigo, exploramos o desenvolvimento de uma solução híbrida (Python + R) que integra análise de sentimento das atas do COPOM, cálculo da Regra de Taylor e monitoramento da taxa Selic. Aprenda a estruturar pipelines ETL eficientes e a visualizar insights econômicos em tempo real através de um dashboard interativo criado com Shiny, elevando o nível das suas decisões de investimento.

Qual o efeito de um choque de juros sobre a inadimplência?

Neste exercício, exploramos a relação dinâmica entre o custo do crédito (juros na ponta) e o risco realizado (taxa de inadimplência) através de uma análise exploratória de dados e modelagem econométrica utilizando a linguagem de programação R.

Qual a relação entre benefícios sociais e a taxa de participação do mercado de trabalho?

Este exercício apresenta uma investigação econométrica sobre a persistente estagnação da taxa de participação no mercado de trabalho brasileiro no período pós-pandemia. Utilizando a linguagem R e dados públicos do IBGE e Banco Central, construímos um modelo de regressão linear múltipla com correção de erros robustos (Newey-West). A análise testa a hipótese de que o aumento real das transferências de renda (Bolsa Família/Auxílio Brasil) elevou o salário de reserva, desincentivando o retorno à força de trabalho.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.