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

Coletando dados regionais do CAGED no Python

Os dados regionais do CAGED permitem analisar o mercado de trabalho de forma detalhada, em termos de setores, educação, rendimento e características pessoais dos trabalhadores brasileiros. Neste exercício mostramos como acessar estas informações online via Python.

Coletando dados de Setores Censitários do Censo 2022 no Python

Dados sobre a demografia e o território são primordiais para definir e implementar políticas públicas, áreas de atuação comercial e/ou estratégias de marketing. Sendo assim, saber usar os dados do Censo 2022 pode trazer vantagens competitivas. Neste exercício mostramos como obter os dados da Malha de Setores Censitários no formato vetorial (GeoJson) usando o Python.

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.