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 , 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
).
Aqui começa o problema, geralmente usando o bom e velho ele faz tudo pra gente. Avisa que o eixo horizontal deve ter todas as datas e extrai elas do nosso objeto
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 (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
e cria uma matriz com os dados e suas datas. Duas funções que eu uso aqui são a
e
, isto porque o
não aceita objetos
e porque as datas devem estar no formato “AAAA-MM-DD”. Eu extraio as datas do objeto
com a função
, porém este não nos fornece as datas no formato necessário, por isso o uso de
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 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 para criar uma estimativa automática e usei minha função
. 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)


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 . 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 (pelo menos as partes
,
e
).