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

Estimando a volatilidade da taxa de câmbio

O que é Volatilidade? Como podemos calcular essa métrica? Este artigo apresenta uma breve introdução à volatilidade, descreve como podemos calcular a volatilidade utilizando Modelos de Volatilidade Condicional e demonstra a aplicação prática dessa abordagem para estimar a volatilidade da taxa de câmbio BRL/USD por meio da linguagem de programação Python.

Como analisar o Núcleo de Inflação no Brasil usando Python?

O Python se destaca como uma ferramenta robusta para análise de dados, permitindo a aplicação de uma ampla gama de técnicas em dados econômico-financeiros. Neste exercício, destacamos como a linguagem oferece uma facilidade muito grande na coleta de dados dos núcleos do IPCA diretamente do site do Banco Central, na manipulação eficiente desses dados e na construção de gráficos que facilitam a compreensão dos indicadores.

Propensity Score com Múltiplas Variáveis no R

O escore de propensão é provavelmente a maneira mais comum de agregar múltiplas variáveis de correspondência em um único valor que pode ser correspondido, ou seja, muito útil para a realização de pareamento.

O escore de propensão é a probabilidade estimada de que uma determinada observação teria sido tratada. A correspondência de escore de propensão muitas vezes significa selecionar um conjunto de observações de controle correspondidas com valores semelhantes do escore de propensão.

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.