Quem trabalha com séries de tempo acaba tendo que enfrentar a rotina de ajustar sazonalmente uma série ou então deflacionar para elaborar alguma análise mais robusta e segura. É comum utilizarmos softwares como Excel ou Eviews para esse tipo de transformação, mas o R também oferece essa ferramenta.
Vamos inciar com o ajuste sazonal da série de produção industrial brasileira calculada mensalmente pelo IBGE. Vamos aproveitar e baixar a base de dados do IPEA disponível no API, através do package ipeaData.
require(ipeaData)
require(forecast)
require(seasonal)
require(readxl)
require(httr)
require(deflateBR)
g<-ipeadata('PIMPFN12_QIIGN12')
## [1] "Instituto Brasileiro de Geografia e Estatística, Pesquisa Industrial Mensal - Produção Física (IBGE/PIM-PF). 01/2002 a 09/2018. Acesso em: 25/11/2018"
pim<-ts(g$VALVALOR,start=2002,frequency = 12)
plot(pim,xlab='Anos',ylab='',col='red',main="Produção Industrial Brasileira")
Apenas para mostrar como essa série tem uma sazonalidade bem forte, vamos usar o package forecast para evidenciar o comportamento sazonal, ainda que não exatamente na forma como o IBGE trata.
plot(decompose(pim)$seasonal,xlab='anos',ylab='',main='Componente sazonal da Produção Industrial Brasileira')
A série exibe uma sazonalidade negativa de dezembro até abril, quando começa a mostrar força sazonal positiva e atinge o pico em outubro.
Munido dessa série, nos usaremos o package seasonal e as instruções divulgadas pelo IBGE em https://goo.gl/Xy3EXD para elaborar o ajuste sazonal da série de produção industrial brasileira.
seas<-read.table('https://raw.githubusercontent.com/arthurlula/Econometrics/master/pimsa.txt') #são séries com dummies dos feríados de carnaval e corpus christi
carn<-ts(seas$V1,start=2001,frequency=12)
corpch<-ts(seas$V2,start=2001,frequency=12)
x<-cbind(carn,corpch)
#aqui começa o ajuste sazonal
pim2<-seas(x = pim,
regression.variables = c("td", "easter[1]"),xreg=x,
arima.model = "(1 1 0)(0 1 1)",
regression.aictest = NULL,
outlier = NULL,
transform.function = "none",series.span=",2018.9") #essa de fato é a função que elabora o ajuste sazonal
Agora vamos comparar as série que ajustamos pela sazonalidade, chamada de pim.sa, e a série que já é ajustada sazonalmente e que o IBGE divulga mensalmente.
pim3<-data.frame(pim2$data)$final
pim.sa<-ts(pim3,start=2002,frequency = 12)#série que ajustamos
f<-ipeadata('PIMPFN12_QIIGSNAS12') #série ajustada pelo IBGE
## [1] "Instituto Brasileiro de Geografia e Estatística, Pesquisa Industrial Mensal - Produção Física (IBGE/PIM-PF). 01/2002 a 09/2018. Acesso em: 25/11/2018"
pimsa<-ts(f$VALVALOR,start=2002,frequency = 12)
plot(pimsa,xlab='anos',ylab='',main='Comparação entre ajuste sazonal\nIBGE e pacote seasonal')
lines(pim.sa,type='l',col='red')
Perceba que a série mudou bastante em relação aquela primeira, dado a extração de fatores sazonais. O ajuste ficou muito próximo daquele divulgado pelo IBGE.
E o que acontece quando vamos extrair a sazonalidade de uma série que não é dessazonalizada por nenhuma instituição? vamos ver um exemplo.
A Associação Brasileira de Concessionárias de Rodovias (ABCR) divulga mensalmente um índice que representa o fluxo de veículos nas estradas pedagiadas. A varíavel que mensura o fluxo de veículos pesados (caminhões) são amplamente usadas pelo mercado como covariável para a projeção da produção industrial mensal.
A ABCR não faz ajuste sazonal, então vale a pena tentarmos algo próximo disso. Existem formas mais robustas de estudar a série e extrair sua sazonalidade, mas vamos mostrar uma forma ingênua, mas poderosa e que pode ajudar muito em diversas situações.
Primeiramente vamos baixara a série e deixar a função auto.arima achar qual o melhor modelo para ela.
url1<-'http://www.abcr.org.br/Download.ashx?arquivo=IndiceABCR.xls'
GET(url1, write_disk(tf <- tempfile(fileext = ".xls")))
## Response [http://www.abcr.org.br/Download.ashx?arquivo=IndiceABCR.xls]
## Date: 2018-11-25 21:23
## Status: 200
## Content-Type: application/octet-stream
## Size: 724 kB
## <ON DISK> C:\Users\arthu\AppData\Local\Temp\RtmpqwuAFV\file14f45cc52578.xls
df <- read_excel(tf, 3L)
abcr<-ts(as.numeric(df$X__2[-c(1:38)]),start=2002,frequency=12) # a série já foi baixada
plot(abcr,xlab='anos',ylab='',main='Fluxo de veículos pesados em estradas pedagiadas')
auto.arima(abcr)
## Series: abcr
## ARIMA(1,1,2)(0,1,1)[12]
##
## Coefficients:
## ar1 ma1 ma2 sma1
## 0.2143 -1.0657 0.3892 -0.8282
## s.e. 0.3794 0.3567 0.2344 0.0919
##
## sigma^2 estimated as 27.25: log likelihood=-585.81
## AIC=1181.62 AICc=1181.95 BIC=1197.83
Agora que sabemos que temos um modelo ARIMA(1,1,2)(0,1,1) proposto, podemos seguir com o ajuste sazonal.
abcr.sa<-seas(x = abcr,
regression.variables = c("td", "easter[1]"),
arima.model = "(1 1 2)(0 1 1)",
regression.aictest = NULL,
outlier = NULL,
transform.function = "auto",series.span=",2018.10")
Por fim, cabe comparar como ficou a série e como ela era.
plot(abcr.sa,xlab='anos',ylab='',
main="Fluxo de veículos pesados em estradas pedagiadas\nCom ajuste sazonal")
legend('topleft', 95, legend=c("Original", "Com ajuste sazonal"),
col=c("black", "red"), lty=1, cex=0.8,box.lty=1)
É importante ressaltar que se você precisa de um ajuste muito bom mês a mês (tipo quem precisa acertar a variação mensal de alguma série, como é o caso de quem faz projeção), esse método ingênuo não é o melhor, sendo ideal estudar com mais calma cada série.
Manipular séries com valores monetários exige um certo conhecimento do impacto da inflação ao longo do tempo. Por exemplo, se você quer saber o quanto uma economia cresceu (PIB) num dado período de tempo, é super importante extrair a influência do crescimento dos preços nesse período estudado, do contrário você estará computando a inflação junto e inflando o desempenho daquela economia.
Em outras palavras, o que importa é o crescimento real e não o nominal.
Vamos supor que estamos avaliando a vendas mensais de automóveis no Brasil, divulgados pela ANFAVEA, desde 2000. O problema é que as vendas estão em valores monetários (R$). Desta forma, é necessário tirar a influência da inflação (sobretudo num país que enfrentou hiperinflação) dessa série.
Como é muito grande (começa em 1957), precisamos cortá-la para trabalhar apenas de 2000 para frente.
anf<-ipeadata('ANFAVE12_LICVEN12') #baixando a série
## [1] "Associação Nacional dos Fabricantes de Veículos Automotores, Anuário Estatístico da Indústria Automobilística Brasileira ou Carta Mensal (Anfavea). 01/1957 a 10/2018. Acesso em: 25/11/2018"
anfavea<-ts(anf$VALVALOR,start=1957,frequency = 12)
anfavea<-anfavea[-c(1:516)]# retirando valores anteriores a 2000
times <- seq(as.Date('2000-01-01'), as.Date('2018-10-01'),
by='1 month') # criando o vetor do tempo, para elaborar a deflação
plot(anfavea,type='l',xlab='',ylab='',main='Volume de vendas de automóveis (Em R$)')
Pois bem, agora para iniciar a deflação, vamos usar o pacote deflateBR para deflacionar a série pelo IGP-M (arbitrariamente) e deixando tudo a preços de janeiro de 2018, além de comparar com a série original.
anfaveareal<-deflate(anfavea,times,"01/2018", index = "igpm")
anfaveareal1<-ts(anfaveareal,start=2000,frequency=12)
anfavea1<-ts(anfavea,start=2000,frequency=12)
plot(anfaveareal1,xlab='anos',ylab='',main='Volume de vendas de automóveis (Em R$)\nPreços correntes e de janeiro de 2018',
ylim=c(90000,503419.6))
legend('topright', 95, legend=c("Real", "Nominal"),
col=c("black", "red"), lty=1, cex=0.6,box.lty=1)
lines(anfavea1,type='l',col='red')
Tentamos mostrar aqui funcionalidades de como ajustar sazonalmente uma série tempo ou então como tirar a influência da inflação. Espero que tenham aproveitando alguma coisa e que acessem meu outro artigo. Baixando cotações diárias de Ações da Bovespa no R com o pacote BatchGetSymbols
```