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)
com a imposição da restrição de verticalidade de longo prazo:
(2)
onde é a inflação de preços livres do IPCA;
é a expectativa em t acerca da inflação do IPCA i trimestres à frente;
é a inflação do IPCA;
é uma medida da inflação importada;
é uma medida do hiato do produtos;
são Dummys de choques e
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.

