Classes de objetos em Séries Temporais no R: diferenças entre xts, tibble e tsibble

Muitos iniciantes desejam trabalhar com Séries Temporais utilizando a linguagem R, mas acabam sempre com dificuldades devido a quantidade de classes diferentes que lidam com esse tipo de dados. Afinal, qual utilizar? No post de hoje, mostramos as principais diferenças entre as classes de Séries Temporais e vasculhamos os pacotes que fazem usos delas.

Séries Temporais no R

O R foi criado com a finalidade de ser uma ferramenta facilitadora de análise de dados, principalmente por métodos estatísticos, auxiliando portanto na análise de séries temporais. A linguagem, por padrão, possui objetos para armazenar dados de diversos tipos de classes, com seus respectivos propósitos, em cursos introdutórios, são conhecidos as classes:

  • matrix
  • data frame
  • list

Entretanto, existem classes especiais que se tornaram próprias para o uso de séries temporais. De certa forma, seguiram um processo evolutivo, entretanto, com cada uma possuindo suas propriedades únicas e conjuntos diferentes de pacotes e funções criados para o uso de cada classe. Começaremos com a classe padrão para Séries Temporais, contida no pacote {stats} do R, os objetos ts (Time Series).

Objetos ts

Os objetos ts são representados por vetores ou matrizes, e possuem atributos adicionais, principalmente as datas equiespaçadas em um índice, referenciando cada observação. É possível criar um objeto ts a partir da função ts(), usando como argumentos o vetor da série contendo os valores de cada observação, o ano/mês de inicio e a possibilidade de escolher a frequência (1 para anual, 4 para trimestral, 12 para mensal e 52 para semanal).

Vejamos a criação do objeto abaixo e o seu output.


# Objetos ts

y <- ts(c(123,39,78,52,110), start=2012)

y

# Time Series:
# Start = 2012
# End = 2016
# Frequency = 1
# [1] 123 39 78 52 110

O objeto possui diversos métodos que auxiliam na compreensão dos dados da série. Podemos extrair a frequência, a data de início, a data de fim, o vetor de tempo e criar uma janela de tempo. Para a manipulação dos dados utiliza-se as ferramentas proporcionados pelo R base.

frequency(y)
# [1] 1
start(y)
# [1] 2012 1
end(y)
# [1] 2016 1
time(y)
# Time Series:
# Start = 2012 
# End = 2016 
# Frequency = 1 
# [1] 2012 2013 2014 2015 2016
window(y, 2014)
# Time Series:
# Start = 2014 
# End = 2016 
# Frequency = 1 
# [1] 78 52 110

É possível criar um gráfico de Séries Temporais facilmente por meio da função padrão do R, plot. Veja que é necessário somente o objeto como input na função, sem a necessidade de escolher os eixos.

plot.ts(y)

xts

O objeto xts é considerado uma evolução do objeto ts , bem como das matrizes. É também considerado "irmã" dos objetos de classe zoo (também utilizado para manipulações de Séries Temporais). Se assemelha visualmente com os objetos data frame, entretanto, possui algumas diferenças: a data sempre estará no índice do objeto e o filtro sempre manterá o formato de matriz do objeto.

Vejamos abaixo como é possível alterar a classe de 'ts' para 'xts', bem como criar filtros por meio do índice de tempo.

</pre>
# Objeto xts

library(xts)

y.xts <- as.xts(y)

# [,1]
# 2012-01-01 123
# 2013-01-01 39
# 2014-01-01 78
# 2015-01-01 52
# 2016-01-01 110

y.xts['2014']

# [,1]
# 2014-01-01 78

y.xts['2014/']

# [,1]
# 2014-01-01 78
# 2015-01-01 52
# 2016-01-01 110
<pre>

Da mesma forma que o objeto de classe 'ts', o objeto 'xts' também possui um método próprio para criar gráficos com plot. Vemos que o resultado se difere do anterior, possuindo dois eixos e blocos para demarcar o espaço dos valores.

plot.xts(y.xts)

O interessante dos objetos da classe xts é a possibilidade de seu uso para dados financeiros, principalmente do tipo OHLC (Open, High, Low, Close). O famoso pacote quantmod, utilizado para importar séries financeiras e econômicas de diversas fontes, possui como padrão a classe xts. Vejamos um exemplo abaixo de dados coletados por meio do yahoo finance da empresa MGLU3 com a função getSymbols.

</pre>
library(quantmod)

getSymbols("MGLU3.SA")

head(MGLU3.SA)

#                          MGLU3.SA.Open MGLU3.SA.High MGLU3.SA.Low MGLU3.SA.Close MGLU3.SA.Volume MGLU3.SA.Adjusted
# 2011-05-02  0.503125                       0.518750                   0.503125             0.514062                280003200                       0.463173
# 2011-05-03  0.515625                       0.521562                    0.506250            0.509375               33670400                           0.458950
# 2011-05-04  0.510000                      0.515000                   0.510000            0.515000               39203200                           0.464018
# 2011-05-05  0.512812                       0.512812                    0.510000             0.511875                35097600                           0.461202
# 2011-05-06  0.510937                      0.511875                     0.500000            0.508125               38672000                           0.457824
# 2011-05-09  0.506562                     0.507812                     0.501250             0.503125                   667680                            0.453319
<pre>

O resultado possui o formato padrão dos objetos xts, entretanto, com diversas colunas.

Com as possibilidade do uso do xts para séries financeiras, criou-se diversos pacotes que auxiliam na manipulação, criação de indicadores e também no uso de otimização portfólio e cálculos econométricos, sendo algum deles os:

  • TTR
  • PortfolioAnalytics
  • PerformanceAnalytics

Vejamos abaixo a utilização do {quantmod} para a manipulação de dados financeiros com o xts. A partir do método to.monthly é possível alterar o período dos dados de diário para mensal. Essa função é usada para obter a última cotação do dia de um mês.

Outra possibilidade é a utilização da função chartSeries para criar um gráfico contendo todas as informações dos dados OHLC de uma série financeira.

</pre>
head(to.monthly(MGLU3.SA))

# MGLU3.SA.Open MGLU3.SA.High MGLU3.SA.Low MGLU3.SA.Close MGLU3.SA.Volume MGLU3.SA.Adjusted
# mai 2011 0.503125 0.521562 0.474375 0.500000 630386080 0.450503
# jun 2011 0.495937 0.555000 0.493125 0.507812 296041600 0.457542
# jul 2011 0.509062 0.528125 0.426250 0.429687 293266592 0.387150
# ago 2011 0.437500 0.445312 0.325937 0.401562 338796800 0.361810
# set 2011 0.429687 0.474375 0.359375 0.366875 424745600 0.330557
# out 2011 0.364062 0.420312 0.345625 0.418750 360428800 0.377296

chartSeries(MGLU3.SA)
<pre>


tibble

O tibble é uma classe de objetos da família de pacotes {tidyverse}. O objetivo da classe é trabalhar com a análise de dados, não sendo específico o seu uso para séries temporais, entretanto, devido a usabilidade do tidyverse, se tornou útil para manipulações e cálculos das séries.

Vejamos abaixo a facilidade de transformar um objeto do tipo xts para tibble, por meio da função tk_tbl do pacote {timetk}. É necessário relembrar que funções seguem o uso com determinadas classes, portanto, objetos de classe xts não funcionam nas funções do tidyverse e vice-versa.

</pre>
library(timetk)

mglu <- MGLU3.SA |>
tk_tbl(preserve_index = TRUE,
rename_index = "date")

head(mglu)

# A tibble: 6 × 7
# date MGLU3.SA.Open MGLU3.SA.High MGLU3.SA.Low MGLU3.SA.Close MGLU3.SA.Volume MGLU3.SA.Adjusted
# <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2011-05-02 0.503 0.519 0.503 0.514 280003200 0.463
# 2 2011-05-03 0.516 0.522 0.506 0.509 33670400 0.459
# 3 2011-05-04 0.51 0.515 0.51 0.515 39203200 0.464
# 4 2011-05-05 0.513 0.513 0.51 0.512 35097600 0.461
# 5 2011-05-06 0.511 0.512 0.5 0.508 38672000 0.458
# 6 2011-05-09 0.507 0.508 0.501 0.503 667680 0.453
<pre>

Com o confronto entre o crescimento do tidyverse e a necessidade de utilizar funções que só podem ser usadas em um objeto xts, criou-se o pacote {tidyquant}, que funciona com um wrapper das funções que utilizam o xts, porém, para objetos da classe tibble/dataframe.

Vejamos o uso da função tq_get (wrapper do getSymbols do {quantmod}) para capturar os dados da MGLU3 do yahoo finance. O resultado será um objeto tibble do tipo OHLC. A partir das funções tq_transmute ou tq_mutate, utiliza-se as funções dos pacotes xts para aplicar as manipulações no objeto de classe tibble.

</pre>
library(tidyquant)

mglu <- tq_get("MGLU3.SA")

mglu_monthly <- mglu |>
tq_transmute(mutate_fun = periodReturn,
period = "monthly") # função do quantmod

head(mglu_monthly)

# A tibble: 6 × 2
# date monthly.returns
# <mth> <dbl>
# 1 2012 jan 0.0559
# 2 2012 fev 0.183
# 3 2012 mar 0.00928
# 4 2012 abr -0.0485
# 5 2012 mai -0.180
# 6 2012 jun 0.00750
<pre>

tsibble

Por fim, como uma evolução do tibble, porém, para uso definido para séries temporais, existe o objeto tsibble, utilizado principalmente para o Forecast (previsão) de séries temporais. É a classe padrão para objetos da família de pacotes tidyverts e a ferramenta usada por Hyndman e Athanasopoulos (2011).

Vejamos abaixo o código, utilizamos a função as_tibble para transformar o objeto de classe tibble em tsibble. Há apenas uma correção que deve ser feita antes de utilizada, como pode ser vista em seu uso em conjunto com a função gg_tsdisplay, que demonstra o erro dessa transformação.

</pre>
# Tsibble

library(tsibble)

mglu_tsibble <- as_tsibble(mglu_monthly)

gg_tsdisplay(mglu_tsibble, y = monthly.returns)

# Error in `check_gaps()`:
# ! .data contains implicit gaps in time. You should check your data and convert implicit gaps into explicit missing values using `tsibble::fill_gaps()` if required.
# Run `rlang::last_error()` to see where the error occurred.
<pre>

Para evitar esse problema, o ideal é que seja alterado o tipo de dado da coluna de data por meio de funções do próprio pacote. Veja que no caso do exemplo, utiliza-se a função yearmonth. Há diversas funções para cada frequência, sendo necessário a leitura da documentação do pacote.

</pre>
library(dplyr)

mglu_monthly <- mglu_monthly |>
mutate(date = yearmonth(date))

mglu_tsibble <- as_tsibble(mglu_monthly, index = date)

head(mglu_tsibble)

# A tsibble: 6 x 2 [1M]
# date monthly.returns
# <mth> <dbl>
# 1 2012 jan 0.0559
# 2 2012 fev 0.183
# 3 2012 mar 0.00928
# 4 2012 abr -0.0485
# 5 2012 mai -0.180
# 6 2012 jun 0.00750
<pre>

Com a classe definida como tsibble no objeto, é possível utilizar as funções da família do tidyverse/tidyverts. Veja abaixo a geração de um gráfico de séries temporais por meio do autoplot, isso somente é possível com classes que possuem a data bem definida como chave ou índice, como é o caso de objetos ts, xts e tsibble.

</pre>
library(feasts)

autoplot(mglu_tsibble)
<pre>

Os pacotes do tidyverts também possibilitam o uso de outras funções para a geração de gráficos para análise de séries temporais, como é o caso da função gg_tsdisplay, que gera três gráficos diferentes, um de linha com pontos, outro de autocorrelação e outro de sazonalidade.

gg_tsdisplay(mglu_tsibble, y = monthly.returns)

Por fim, como dito, os pacotes possibilitam o uso de dados para o Forecast, como no caso abaixo, em é seguido o Workflow do tidyverts para a criação de três modelos de séries temporais univariados de previsão.

</pre>
library(fable)

mglu_tsibble |>
model(
ets = ETS(monthly.returns),
arima = ARIMA(monthly.returns),
snaive = SNAIVE(monthly.returns)
) |>
forecast(h = '2 months') |>
autoplot(filter(mglu_tsibble, year(date) > 2020))
<pre>

Quer saber mais?

Veja nossa trilha de cursos Ciência de Dados para Economia e Finanças.

Referências

Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: principles and practice. OTexts. 3º ed.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Criando Tabelas com o Python: mostrando o poder da linguagem sobre o Excel

Nos dias atuais, pessoas que trabalham com dados estão constantemente confrontados com um dilema: criar uma tabela não tão genial no Excel ou manter em um formato ainda pior, como um dataframe, mas mantendo a flexibilidade de obtenção dos dados. Podemos resolver esse grande problema, unindo a flexibilidade e beleza ao usar a biblioteca great_tables do Python.

Análise do Censo Demográfico com o R

Como podemos analisar dados do Censo Demográfico para produzir pesquisas e implementar políticas públicas? Mostramos nesta postagem o resultado de uma breve análise dos dados preliminares do Censo Demográfico de 2022 usando o R.

Deploy de modelos com Python + Shinylive + GitHub gastando ZERO reais

Colocar modelos em produção pode ser um grande desafio. Lidar com custos monetários, infraestrutura operacional e complexidades de códigos e ferramentas pode acabar matando potenciais projetos. Uma solução que elimina todos estes obstáculos é a recém lançada Shinylive. Neste artigo mostramos um exemplo com um modelo de previsão para o preço do petróleo Brent.

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.