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 treinar e selecionar os melhores modelos de previsão no Python?

Em previsão, há uma infinidade de modelos que podem ser usados. O processo de escolha do(s) modelo(s) deve ser empírico-científico, usando métodos que visem avaliar a generalização dos algoritmos para dados novos. Neste artigo, mostramos como implementar a metodologia de validação cruzada com algoritmos de machine learning no Python, exemplificando para a previsão do IPCA.

Como selecionar variáveis para modelos de previsão no Python?

Em oposição à crença popular, grande parte dos modelos de machine learning não produzem previsões magicamente. É papel do cientista de dados executar uma boa engenharia de variáveis para não cair no clássico problema de “garbage in, garbage out” (GIGO) em aprendizado de máquina. Neste sentido, aprender a fazer uma boa seleção de variáveis é fundamental e neste artigo exploramos algumas possibilidades práticas usando o Python.

Resultado IPCA-15 - Novembro/2024

A Análise Macro apresenta os resultados do IPCA-15 de Novembro de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

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.