R de Riksbank - Um experimento no R

Um dia desses conversando com o Vitor sobre inflação e taxa de juros ele comenta sobre os gráficos de previsão do banco central sueco, ou Riksbanken, como é conhecido por aqui. Comentamos como seria legal reproduzir gráficos como aqueles para as nossas próprias previsões. Aí pensei, porque não tentar?

Seria uma ótima oportunidade para treinar o uso do pacote \texttt{ggplot2}, que de primeira é literalmente um bicho de sete cabeças. Isto especialmente em se considerando o fato de que este pacote não aceita (pelo menos pelo que eu saiba) séries de tempo! Basicamente o que tem que ser feito é alocar todos os seus dados (e suas respectivas datas, em se tratando de séries de tempo) numa matriz (ou \texttt{data.frame}).

Aqui começa o problema, geralmente usando o bom e velho \texttt{plot} ele faz tudo pra gente. Avisa que o eixo horizontal deve ter todas as datas e extrai elas do nosso objeto \texttt{ts} e por aí vai. Logo pensei: já que vou tentar fazer este gráfico posso tentar fazer uma função para ele (especialmente tendo em mente o quão preguiçoso eu sou).

Dado que a função mais utilizada para previsões, creio eu, é a \texttt{forecast} (do pacote com o mesmo nome), eu decidi fazer uma função que usa justamente o objeto resultante desta função*. A minha função basicamente extrai as estimativas do objeto \texttt{forecast} e cria uma matriz com os dados e suas datas. Duas funções que eu uso aqui são a \texttt{unclass} e \texttt{as.Date}, isto porque o \texttt{ggplot}não aceita objetos \texttt{ts} e porque as datas devem estar no formato “AAAA-MM-DD”. Eu extraio as datas do objeto \texttt{ts} com a função \texttt{time}, porém este não nos fornece as datas no formato necessário, por isso o uso de \texttt{as.Date} para converter o formato. Segue alguns trechos da função.


plot.riksbank <- function(forecast.object,
                          main='', xlab='', ylab='', plot.start){

  forecast.limits <- cbind(forecast.object$mean,
                           forecast.object$lower,
                           forecast.object$upper)

  final <- rep(observed[length(observed)], ncol(forecast.limits))

  observed <- window(forecast.object$x, start=plot.start)

  observed.frame <- data.frame(Date=as.Date(time(observed)), observed)

  joint <- ts(rbind(final, forecast.limits),
              start=end(observed), freq=frequency(observed))

  frame <- data.frame(Date=as.Date(time(joint)), unclass(joint))

Em seguida começo com o gráfico, onde primeiro coloco as sombras dos intervalos de confiança, começando pelos maiores, para estes não se sobreporem. O \texttt{ggplot} aceita cores no formato RGB, isto possibilitou usar exatamente a mesma cor utilizada pelo Riksbank. Obviamente estas cores podem ser alteradas de maneira fácil dentro da função. Um trecho dessa parte vocês encontram abaixo.

...
geom_ribbon(data=frame, aes(x=Date, y=Mean, ymin=Lower3,  ymax=Upper3, fill=rgb(0,117,186, maxColorValue=255)),  alpha=1) +
geom_ribbon(data=frame, aes(x=Date, y=Mean, ymin=Lower2,  ymax=Upper2, fill=rgb(11,187,239, maxColorValue=255)),  alpha=1) +
geom_ribbon(data=frame, aes(x=Date, y=Mean, ymin=Lower1,  ymax=Upper1, fill=rgb(189,228,251, maxColorValue=255)),  alpha=1) +

geom_line(aes(x=Date, y=observed), color=rgb(170,61,67, maxColorValue=255)) +
geom_line(aes(x=Date, y=Mean), color=rgb(170,61,67, maxColorValue=255), lty='dashed')
...

Como exemplo, eu utilizei a inflação brasileira, calculada da mesma maneira que o Riksbank, isto é, peguei o índice do IPCA mensal contra o mesmo mês do ano anterior. Usei a função \texttt{auto.arima} para criar uma estimativa automática e usei minha função \texttt{plot.riksbank}. O código utilizado e o resultado vocês podem ver abaixo.


data <- ts(read.csv2('ipca.csv'),
           start=c(1981,1), freq=12)

data <- window(data, start=2002)

levels <- c(50, 75, 90)
periodos <- 24

auto <- auto.arima(data)

prev <- forecast(auto, h=periodos, level=levels)

plot.riksbank(prev, plot.start = 2009)

 

Gráfico do Riksbank.
Gráfico do Riksbank.
Gráfico da minha função.
Gráfico da minha função.

 

 

 

 

 

 

Não tá exatamente igual, mas deu pra enganar né ? Rs

Ah ! E para salvar numa resolução melhor (para não ficar como a visualização no R eu uso o pacote  Cairo . Abaixo segue o código para salvar na mesma resolução e tamanho que o banco central sueco.


Cairo(file="riksplot.png",
type="png",
units="in",
width=5,
height=3.61,
pointsize=6,
dpi=96)

plot.riksbank(prev, plot.start = c(2009,01))

dev.off()

* Obviamente a pessoa pode “inputar” os próprios dados para usar na minha função, porém deve ter a mesma estrutura e nomes que o objeto \texttt{forecast} (pelo menos as partes \texttt{mean}, \texttt{upper}e \texttt{lower}).

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print
Análise Macro © 2011 / 2026

comercial@analisemacro.com.br – Rua Visconde de Pirajá, 414, Sala 718
Ipanema, Rio de Janeiro – RJ – CEP: 22410-002

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp