Creando Objetos de series de tiempo en R

Objetos de series de tiempo en R

1 Introducción

En R podemos encontrar diferentes clases de objetos para trabajar con series de tiempo. Por ejemplo, existen los objetos ts que están asociados al paquete base de R; tal vez el tipo de objeto más común en los paquetes que emplean series de tiempo. Esta clase de objeto es bastante sencilla, pero no permite manipular las series de tiempo de alta frecuencia (minutos, segundos, etc.). También encontramos los objetos xts, asociados al paquete del mismo nombre que permiten trabajar mucho más cómodamente con series de tiempo de alta frecuencia. Otra clase de objetos que brinda mucha flexibilidad es el zoo. En la práctica, tendremos que aprender a usar diferentes clases de objetos de series de tiempo, dado que diferentes paquetes requieren diferentes clases de objeto.

2 Los datos para nuestro ejemplo

Ahora concentrémonos en cómo definir una serie de tiempo en R. Para este ejercicio emplearemos la información disponible en los archivos datosEmpleo.xlsx y base.csv.

En el primer archivo encontrarán la tasa de desempleo mensual de las 13 principales ciudades en Colombia (TD_13ciudades). El archivo también contiene series mensuales para las 13 principales ciudades de Colombia el número de ocupados en miles de personas (Ocupados), los desocupados (Desocupados) y los inactivos (Inactivos). Estos datos cubren el periodo enero de 2001 a abril de 2019. El segundo archivo contiene la información de la base monetaria (cantidad de dinero) mensual para el periodo enero de 1980 a febrero de 2019.

Pero antes, nuestra primera tarea será leer los archivos de Excel. Para el primer archivo podemos emplear el paquete readxl. Carguemos los datos en un objeto que denominaremos data.

library(readxl)
data <-read_excel("datosEmpleo.xlsx", 
          col_types = c("date", "numeric", "numeric", 
                        "numeric", "numeric") )
class(data)
## [1] "tbl_df"     "tbl"        "data.frame"
head(data)
## # A tibble: 6 x 5
##   mes                 TD_13ciudades Ocupados Desocupados Inactivos
##   <dttm>                      <dbl>    <dbl>       <dbl>     <dbl>
## 1 2001-01-01 00:00:00          20.9    6924.       1835.     4601.
## 2 2001-02-01 00:00:00          19.9    7038.       1748.     4597.
## 3 2001-03-01 00:00:00          19.2    6946.       1653.     4807.
## 4 2001-04-01 00:00:00          17.9    6973.       1519.     4937.
## 5 2001-05-01 00:00:00          17.9    6994.       1530.     4929.
## 6 2001-06-01 00:00:00          18.7    7014.       1608.     4854.
str(data)
## tibble [220 × 5] (S3: tbl_df/tbl/data.frame)
##  $ mes          : POSIXct[1:220], format: "2001-01-01" "2001-02-01" ...
##  $ TD_13ciudades: num [1:220] 20.9 19.9 19.2 17.9 17.9 ...
##  $ Ocupados     : num [1:220] 6924 7038 6946 6973 6994 ...
##  $ Desocupados  : num [1:220] 1835 1748 1653 1519 1530 ...
##  $ Inactivos    : num [1:220] 4601 4597 4807 4937 4929 ...

Los datos fueron leídos como un data frame. Pero la información correspondiente a la fecha no está indexando los datos. En otras palabras, aún no tenemos un objeto que sea reconocido por R como una serie de tiempo. En las siguientes dos secciones se presentan como crear objetos de series de tiempo.

3 Objeto ts

Empecemos creando un objeto de serie de tiempo de clase ts, empleando la función con el mismo nombre. Los argumentos de esta función son: un vector o matriz de datos y frecuency corresponde a la frecuencia de la serie de tiempo. Así, para datos mensuales frequency = 12 y para datos trimestrales frequency = 4. Para datos diarios, frequency = 7. Creemos un objeto de clase ts.

data.ts <- ts(data[,-1], start = c(2001,1), frequency = 12)
head(data.ts)
##      TD_13ciudades Ocupados Desocupados Inactivos
## [1,]      20.94638 6923.604    1834.507  4600.718
## [2,]      19.89421 7037.746    1747.820  4596.805
## [3,]      19.22157 6945.973    1652.823  4807.120
## [4,]      17.88858 6973.079    1519.137  4937.280
## [5,]      17.94565 6994.462    1529.720  4928.911
## [6,]      18.65389 7014.100    1608.439  4854.332
library(xts)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
periodicity(data.ts)
## Monthly periodicity from Jan 2001 to Apr 2019

Grafiquemos la tasa de desempleo usando la función ts.plot.

ts.plot(data.ts[,1], 
    main = "Tasa de desempleo mensual (13 ciudades)")

Si la frecuencia de los datos fuese días laborales, esta función no podría graficar esta serie. En esos casos es mejor emplear un objeto de clase xts.

4 Objeto xts

Ahora creemos un objeto xts. Para crear un objeto de esta clase, requerimos el vector o matriz de datos y un vector con las fechas que permita ordenar los datos. En la columna del data frame teníamos las fechas y las leímos como tal. Entonces empleando la función xts del paquete del mismo nombre podemos crear el objeto de series de tiempo de esta clase.

library(xts)
data.xts <- xts(data[,-1], order.by = data$mes)
class(data.xts)
## [1] "xts" "zoo"
head(data.xts)
## Warning: timezone of object (UTC) is different than current timezone ().
##            TD_13ciudades Ocupados Desocupados Inactivos
## 2001-01-01      20.94638 6923.604    1834.507  4600.718
## 2001-02-01      19.89421 7037.746    1747.820  4596.805
## 2001-03-01      19.22157 6945.973    1652.823  4807.120
## 2001-04-01      17.88858 6973.079    1519.137  4937.280
## 2001-05-01      17.94565 6994.462    1529.720  4928.911
## 2001-06-01      18.65389 7014.100    1608.439  4854.332
str(data.xts)
## An 'xts' object on 2001-01-01/2019-04-01 containing:
##   Data: num [1:220, 1:4] 20.9 19.9 19.2 17.9 17.9 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:4] "TD_13ciudades" "Ocupados" "Desocupados" "Inactivos"
##   Indexed by objects of class: [POSIXct,POSIXt] TZ: UTC
##   xts Attributes:  
##  NULL
periodicity(data.xts)
## Monthly periodicity from 2001-01-01 to 2019-04-01

Noten que ahora todas las filas están indexadas con una fecha. Si la columna mes no hubiese sido leída como una fecha, está se puede convertir a fecha empleando la función as.Date.

data$mes <- as.Date(data$mes)

Grafiquemos rápidamente la tasa de desempleo usando la función plot.xts de paquete xts.

plot.xts(data.xts$TD_13ciudades, main = "Tasa de desempleo mensual (13 ciudades)")

5 Otro ejemplo

Ahora carguemos la serie mensual de la base monetaria primero como un objeto ts.

Base <- read.csv("base.csv", sep=",") 
Base.ts <- ts(Base, start = c(1980, 1), frequency = 12)
class(Base)
## [1] "data.frame"

Ahora creemos un objeto xts a partir de una serie diaria creada aleatoriamente

# Creando un objeto con números aleatorios.
data.aleatoria <- rnorm(60)
class(data.aleatoria)
## [1] "numeric"
# Creando las fechas empezando el 2021-02-01
fechas <- seq(as.Date("2020-02-01"), length = 60, by = "days")

# creando el objeto
data.aleatoria.xts <- xts(x = data.aleatoria, order.by = fechas)

class(data.aleatoria.xts)
## [1] "xts" "zoo"
periodicity(data.aleatoria.xts)
## Daily periodicity from 2020-02-01 to 2020-03-31

6 Pasando de ts a xts

También podemos pasar de un tipo de clase a otro, por ejemplo podemos emplear la función as.xts() del paquete xts. El único argumento que se necesita es el objeto de clase ts.

Base.xts <- as.xts(Base.ts)
class(Base.xts)
## [1] "xts" "zoo"

7 Comentarios finales

Como se mencionó, hay muchos tipos diferentes de objetos en R. Cada clase tiene un propósito único. el paquete xts extiende la clase que era muy popular que se conoce como zoo. De hecho los objetos xts son objetos matriciales internamente así como los objetos zoo y ts. Así mismo, los objetos xts están indexados por un objeto formal de tiempo como los otros dos tipos mencionados. Y finalmente, la mayoría de las funciones que emplean objetos zoo funcionan para xts.

En todo caso, de necesitarse un objeto de clase zoo puede ser empleada la función as.zoo del paquete zoo. Este funciona tanto para objetos ts y xts.

Base.zoo <- as.xts(Base.ts)
class(Base.zoo)
## [1] "xts" "zoo"
periodicity(Base.zoo)
## Monthly periodicity from Jan 1980 to Feb 2019
data.aleatoria.zoo <- as.zoo(data.aleatoria.xts)
class(data.aleatoria.zoo)
## [1] "zoo"
periodicity(data.aleatoria.zoo)
## Daily periodicity from 2020-02-01 to 2020-03-31

En general, el tipo de objeto de serie de tiempo que necesites dependerá del paquete y respectiva función que emplearás. Y por tanto deberás estar preparada para construir cualquiera de estas clases de objetos.

Comentarios

Entradas más populares de este blog

Mejorando la apariencia de histogramas en ggplot2 de R

Descargando e instalando a R y Rstudio