Introducción

Una serie temporal se define como una colección de observaciones de una variable recogidas secuencialmente en el tiempo. Cuando nuestra intención es la de analizar unos datos, el primer paso a seguir es representarlos gráficamente. La visualización de series temporales nos permite obtener mucha información acerca de patrones, observaciones inusuales, cambios de una o más variables cuantitativas a través del tiempo y de las relaciones entre variables. El gráfico inicial o estándar de series temporales es aquel que muestra los valores de la serie en el eje vertical y los instantes temporales en el eje horizontal. Por otro lado, el tiempo puede ser concebido como una variable de agrupación o condicionante; lo que nos permite que se muestren varias variables en un diagrama de dispersión, usando diferentes paneles para subconjuntos de datos (tiempo como variable condicionante), o usando diferentes atributos para diferentes grupos de datos (tiempo como variable de agrupación). El tiempo también puede usarse como una variable complementaria que aporta información en un gráfico junto a diferentes variables.

Los siguientes apartados proporcionan una variedad de ejemplos, para mostrar un conjunto de técnicas útiles, trabajando con 3 bases de datos disponibles en una carpeta en el directorio.

Este documento ha sido preparado con contenido extraído y adaptado de la segunda edición del libro https://oscarperpinan.github.io/bookvis/ publicado con https://www.crcpress.com/Displaying-Time-Series-Spatial-and-Space-Time-Data-with-R-Second-Edition/Lamigueiro/p/book/9781138089983.

Algunos de los paquetes más importantes que utilizamos son: lattice, latticeExtra y el ggplot2 para la realización de los gráficos estáticos; zoo y xts para leer y organizar los datos como series temporales; RColorBrewer para definir paquetes de colores; y los paquetes dygraphs, highcharter y plotly, basados en el htmlwidgetsmarco para generar animaciones o gráficos interactivos.

Comencemos cargando los paquetes principales y estableciendo algunos parámetros gráficos de latticey latticeExtra.

library(lattice)
library(ggplot2)
# latticeExtra must be loaded after ggplot2 to prevent masking of `layer`
library(latticeExtra)
library(RColorBrewer)
# lattice and latticeExtra configuration
myTheme <- custom.theme.2(
  pch=19, cex=0.7, region=rev(brewer.pal(9, 'YlOrRd')),
  symbol=brewer.pal(n=8, name="Dark2"))
myTheme$strip.background$col = myTheme$strip.shingle$col =
  myTheme$strip.border$col = 'transparent'

myArgs <- list(
  as.table=TRUE, between=list(x=0.5, y=0.2),
  xscale.components = function(...)
    modifyList(xscale.components.default(...), list(top=FALSE)),
  yscale.components = function(...)
    modifyList(yscale.components.default(...), list(right=FALSE)))

lattice.options(default.theme=myTheme, default.args=modifyList(
  lattice.options()$default.args, myArgs))

library(zoo)

Y estos son los datos que utilizaremos:

Aranjuez.

CO2.

Navarra.

y los cargaremos asi:

setwd("C:/Users/Usuario/Desktop/Datos")
load("C:/Users/Usuario/Desktop/Datos/aranjuez.RData")
load("C:/Users/Usuario/Desktop/Datos/CO2.RData")
load("C:/Users/Usuario/Desktop/Datos/navarra.RData")

Tiempo en el eje horizontal

Como hemos dicho anteriormente el gráfico más común y frecuente para visualizar una serie temporal es el que utiliza el eje horizontal para representar los instantes temporales. En este apartado existen dos variantes diferentes para mostrar series de tiempo multivariadas: Series de tiempo múltiples con diferentes escalas y variables con la misma escala.

Gráfica de tiempo de variables con diferentes escalas.

Un enfoque adecuado para este apartado es mostrar la evolución temporal de todas las variables utilizando un panel para cada una de las variables. La superposición de variables con diferentes características no es muy útil por lo que lo estudiaremos en el siguiente apartado (variables con la misma escala). Para el primer ejemplo, utilizaremos los ocho años de datos diarios de una estación meteorológica ubicada en Aranjuez (Madrid). Utilizaremos el comando xyplot

## The layout argument arranges panels in rows
xyplot(aranjuez, layout = c(1, ncol(aranjuez)))  

El paquete ggplot2 permite de manera sencilla crear gráficos complejos a partir de un conjunto de datos. Este paquete provee una estructura para que podamos especificar qué variables graficar, cómo deben ser presentadas y otras propiedades visuales generales. El paquete zoo proporciona un gráfico para la zoo clase con un resultado similar al obtenido con xyplot.

## facet_free allows each panel to have its own range
autoplot(aranjuez) + facet_free()   

Series temporales de variables con la misma escala

Como un ejemplo de series temporales de variables con la misma escala, utilizaremos mediciones de radiación solar de diferentes estaciones meteorológicas. El primer comando a utilizar es el método xyplot.zoo . El objetivo de este gráfico es explicar el comportamiento de las radiaciones solares como un mismo todo: las series se superponen en el mismo panel (superpose=TRUE) sin leyenda (auto.key=FALSE), utilizando líneas finas y transparencia parcial. El uso de la transparencia es debido a que modera los problemas de superposición y nos muestra mismos grupos de densidad ya que las regiones con más líneas superpuestas serán las más oscuras. El siguiente código muestra las variaciones alrededor del promedio de tiempo. (avRad).

avRad <- zoo(rowMeans(navarra, na.rm = 1), index(navarra))
pNavarra <- xyplot(navarra - avRad,
        superpose = TRUE, auto.key = FALSE,
        lwd = 0.5, alpha = 0.3, col = 'midnightblue') 
pNavarra   

Para poder analizar los resultados de forma más efectiva realizaremos el gráfico del horizonte. Éste es útil para examinar como un gran número de series temporales cambia a lo largo del tiempo, lo realiza de una forma que a la misma vez compara las series de tiempo entre ella y analiza independientemente cada serie. En este gráfico los comportamientos extraños y patrones se observan de forma muy sencilla.

  • Los valores positivos y negativos se trazan sobre el eje x. Los valores negativos se invierten y se colocan por encima de la línea de referencia. El color se usa para diferenciarlos (valores positivos en azul y valores negativos en rojo). Es como si dobláramos el papel horizontalmente en el centro, por lo que las partes positivas y negativas se superponen dentro de la mitad superior del papel.

  • Para diferenciar entre valores numéricos altos y bajos, se utiliza la saturación de color (colores más oscuros para mayores diferencias, habrá tres tonos de azul y 3 de rojo).

  • Las bandas de color comparten la misma línea de base y se superponen, con bandas más oscuras frente a las más claras.

El siguiente código muestra las variaciones de la radiación solar alrededor del promedio de tiempo con un gráfico de horizonte utilizando una fila para cada serie de tiempo. En el código elegimos origin=0 y dejamos el argumento horizonscale sin definir (predeterminado). Con esta combinación, cada panel tiene diferentes escalas y los colores en cada panel representan desviaciones del origen. Esto se representa en la clave de color con el símbolo  ( Delta_i ) , donde el subíndice i denota la existencia de múltiples paneles con diferentes escalas.

library(horizon)
horizonplot(navarra - avRad,
            layout = c(1, ncol(navarra)),
            origin = 0, ##Las desviaciones se han calculado en esta pantalla.
                        ##De este valor
            colorkey = TRUE,
            col.regions = brewer.pal(6, "RdBu"))  

El gráfico de horizonte también es útil para revelar las diferencias entre una serie de tiempo univariante y otra referencia. Vamos a ilustrar este enfoque con la serie temporal de temperaturas medias diarias medidas en la estación meteorológica de Aranjuez. La referencia es el promedio diario a largo plazo calculado con ave.

Ta <- aranjuez$TempAvg
timeIndex <- index(aranjuez)
longTa <- ave(Ta, format(timeIndex, '%j'))
diffTa <- (Ta - longTa)   

El siguiente código se usa horizonplot con el método de cortar y apilar para distinguir entre años.

years <- unique(format(timeIndex, '%Y'))
  
horizonplot(diffTa, cut = list(n = 8, overlap = 0),
            colorkey = TRUE, layout = c(1, 8),
            scales = list(draw = FALSE, y = list(relation = 'same')),
            origin = 0, strip.left = FALSE) +
    layer(grid.text(years[panel.number()], x  =  0, y  =  0.1, 
                    gp = gpar(cex = 0.8),
                    just = "left"))  

Una alternativa es un gráfico de nivel que muestra la serie temporal utilizando partes de su índice de tiempo tanto como variable independiente como condicionante. El siguiente código muestra las diferencias con el día del mes en el eje horizontal y el año en el eje vertical, con un panel diferente para cada número de mes. Por lo tanto, cada celda de la siguiente figura corresponde a un determinado día de la serie temporal.

year <- function(x)as.numeric(format(x, '%Y'))
day <- function(x)as.numeric(format(x, '%d'))
month <- function(x)as.numeric(format(x, '%m')) 
myTheme <- modifyList(custom.theme(region = brewer.pal(9, 'RdBu')),
                      list(
                          strip.background = list(col = 'gray'),
                          panel.background = list(col = 'gray')))

maxZ <- max(abs(diffTa))

levelplot(diffTa ~ day(timeIndex) * year(timeIndex) | factor(month(timeIndex)),
          at = pretty(c(-maxZ, maxZ), n = 8),
          colorkey = list(height = 0.3),
          layout = c(1, 12), strip = FALSE, strip.left = TRUE,
          xlab = 'Día', ylab = 'Mes', 
          par.settings = myTheme)  

La ggplotversión requiere un data.framedía, año y mes organizados en diferentes columnas.

df <- data.frame(Vals = diffTa,
                 Day = day(timeIndex),
                 Year = year(timeIndex),
                 Month = month(timeIndex)) 

Los valores ( Valscolumna de este data.frame) se muestran como un gráfico de nivel gracias a la geom_rasterfunción.

library(scales) 
## The packages scales is needed for the pretty_breaks function.
ggplot(data = df,
       aes(fill = Vals,
           x = Day,
           y = Year)) +
    facet_wrap(~ Month, ncol = 1, strip.position = 'left') +
    scale_y_continuous(breaks = pretty_breaks()) + 
    scale_fill_distiller(palette = 'RdBu', direction = 1) + 
    geom_raster() +
    theme(panel.grid.major = element_blank(),
          panel.grid.minor = element_blank())  

Gráficos interactivos

Esta sección describe las alternativas interactivas de las figuras incluidas en los apartados anteriores con varios paquetes: dygraphs , highcharter, y plotly.

Diagramas

Proporciona facilidades para trazar series temporales. Funciona automáticamente con series temporales, o con objetos que pueden ser forzados a esta clase. El resultado es un gráfico interactivo, donde los valores se muestran de acuerdo con la posición del ratón sobre las series de tiempo. Las regiones se pueden seleccionar para ampliar un período de tiempo.

library(dygraphs)

dyTemp <- dygraph(aranjuez[, c("TempMin", "TempAvg", "TempMax")],
       main = "Temperature in Aranjuez",
       ylab = "ºC")

widgetframe::frameWidget(dyTemp)  

Podemos personalizar los diagramas aplicando comandos adicionales en el gráfico original. La función dyOptions proporciona varias opciones para el gráfico y la función dyHighlight configura las opciones para resaltar el mouse sobre la serie de datos.

dyTemp %>%
  dyHighlight(highlightSeriesBackgroundAlpha = 0.2,
    highlightSeriesOpts = list(strokeWidth = 2)) %>%
  widgetframe::frameWidget()  

Un enfoque alternativo para representar las variables superior e inferior de esta serie de tiempo es con una región sombreada. Esto lo podemos realizar con la función dySeries.

dygraph(aranjuez[, c("TempMin", "TempAvg", "TempMax")],
 main = "Temperatura en Aranjuez",
 ylab = "ºC") %>%
   dySeries(c("TempMin", "TempAvg", "TempMax"),
      label = "Temperatura") %>%
  widgetframe::frameWidget()  

Highcharter

Este paquete dispone un amplio abanico de soluciones gráficas. Permite la visualización de series temporales con capacidades de selección y zoom.

library(highcharter)
library(xts)

aranjuezXTS <- as.xts(aranjuez)

highchart() %>%
   hc_add_series(name = 'TempMax',
           aranjuezXTS[, "TempMax"]) %>%
   hc_add_series(name = 'TempMin',
           aranjuezXTS[, "TempMin"]) %>%
   hc_add_series(name = 'TempAvg',
           aranjuezXTS[, "TempAvg"]) %>%
  widgetframe::frameWidget()  

Plotly

También dispone de un amplio abanico de soluciones gráficas. Este paquete no proporciona ninguna función enfocada a series de tiempo. Pero utilizando el data.frame con una columna que incluya el índice de tiempo. Si data.frame está en formato ancho (una columna por variable), cada variable se representará con una llamada al add_lines. Sin embargo, si data.Frame está en formato largo(una columna para valores y una columna para nombres de variables), solo se requiere una llamada a add_lines. Con el siguiente código podemos ver su funcionamiento.

aranjuezDF <- fortify(aranjuez[,
            c("TempMax",
              "TempAvg",
              "TempMin")],
           melt = TRUE)

summary(aranjuezDF)  
##      Index                Series         Value        
##  Min.   :2004-01-01   TempMax:2898   Min.   :-12.980  
##  1st Qu.:2005-12-29   TempAvg:2898   1st Qu.:  7.107  
##  Median :2008-01-09   TempMin:2898   Median : 13.560  
##  Mean   :2008-01-03                  Mean   : 14.617  
##  3rd Qu.:2010-01-03                  3rd Qu.: 21.670  
##  Max.   :2011-12-31                  Max.   : 41.910  
##                                      NA's   :10

Código siguiente produce un gráfico interactivo con la función genérica plot_lyrelacionada con add_linesa través del operador de la tubería, %>%.

library(plotly)

plot_ly(aranjuezDF) %>%
   add_lines(x = ~ Index,
       y = ~ Value,
       color = ~ Series) %>%
  widgetframe::frameWidget()  

El timepo como condicionante o variable de agrupación

Anteriormente aprendimos a mostrar la evolución temporal de múltiples series de tiempo con diferentes escalas. Pero ¿Y si queremos representar la relación entre las variables?, en este caso utilizaremos el tiempo como una variable de agrupación.

Scatterplot matrix: el tiempo como una variable de agrupación

Un diagrama de dispersión es un tipo de diagrama matemático que utiliza las coordenadas cartesianas para mostrar los valores de dos variables para un conjunto de datos.Por lo tanto, las matrices de diagrama de dispersión, mostrará representaciones de los diagramas de dispersión bivariados, en forma de matriz. Cabe destacar que, en la intersección de la fila y columna, se encuentran los nombres de las variables de la base de datos que se esté trabajando. Así, será más sencilla la visualización gráfica y comparación de la relación existente entre las variables de un conjunto de datos. Para realizar dicho gráfico en RStudio, se utilizará la función grafica splom. Para que la apariencia de dicha matriz sea más sencilla de explicar, se cuenta con una paleta de colores denominado ColorBrewer. Se caracteriza porque, selecciona los colores mas intensos para señalizar los meses de verano, azul para invierno, y así con el resto de las estaciones durante el año.

aranjuezDF <- as.data.frame(aranjuez)
aranjuezDF$Month <- format(index(aranjuez), '%m') 
## Red-Blue palette with black added (12 colors)
colors <- c(brewer.pal(n = 11, 'RdBu'), '#000000')
## Rearrange according to months (darkest for summer)
colors <- colors[c(6:1, 12:7)] 
splom(~ aranjuezDF[1:10], ## Do not include "Month"
     groups = aranjuezDF$Month,
     auto.key = list(space = 'right', 
         title = 'Month', cex.title = 1),
     pscale = 0, varname.cex = 0.7, xlab = '',
     par.settings = custom.theme(symbol = colors,
             pch = 19),
     cex = 0.3, alpha = 0.1)  

La ggplot2versión de este gráfico se produce gracias a la ggpairsfunción proporcionada por el GGallypaquete.

library(GGally)

ggpairs(aranjuezDF,
 columns = 1:10, ## Do not include "Month"
 upper = list(continuous = "points"),
 mapping = aes(colour = Month, alpha = 0.1))

Diagrama de dispersión con el tiempo como variable condicionante

Anteriormente se han visto un gráfico el cual mostraba en una misma matriz, todos los meses del año, pero también se puede realizar el gráfico para cada mes. Además de mostrarnos el promedio, máximo y mínimo también incluye una variable de acondicionamiento adicional. Se comienza cambiando el formato que determina a una columna por variable, a un nuevo formato, que mostrará una columna para valores con filas para cada observación. Para ello, se utilizara la función en rstudio reshape2package.

library(reshape2)

aranjuezRshp <- melt(aranjuezDF,
                     measure.vars = c('TempMax',
                                      'TempAvg',
                                      'TempMin'),
                     variable.name = 'Statistic',
                     value.name = 'Temperature')  

Con la función de ggplot facet_grid se creará un gráfico donde se podrá observar la densidad de puntos de las variables y por otro lado, una línea suavizada por cada mes.

ggplot(data = aranjuezRshp, aes(Radiation, Temperature)) +
   facet_grid(Statistic ~ Month) +
   geom_point(col = 'skyblue4', pch = 19, cex = 0.5, alpha = 0.3) +
   geom_rug() +
   stat_smooth(se = FALSE, method = 'loess',
     col = 'indianred1', lwd = 1.2) +
   theme_bw()   

Además, si añadimos la versión useOuterStrips del paquete latticeExtra, se podrán mostrar los nombres de los condicionantes de las variables utilizadas en los márgenes superior de la gráfica.

useOuterStrips(
   xyplot(Temperature ~ Radiation | Month * Statistic,
    data = aranjuezRshp,
    between = list(x = 0),
    col = 'skyblue4', pch = 19,
    cex = 0.5, alpha = 0.3)) +
   layer({
 panel.rug(..., col.line = 'indianred1',
       end = 0.05, alpha = 0.6)
 panel.loess(..., col = 'indianred1',
         lwd = 1.5, alpha = 1)
   })   

El tiempo como variable complementaria

Ahora, se va a usar la variable tiempo, como una variable complementaria, con respecto a otras variables, las cuales van a ser las estudiadas. Para ello, vamos a utilizar como ejemplo el estudio de la relación entre el ingreso nacional bruto y las emisiones de dióxido de carbono durante una cantidad de años.

Polilíneas

Comenzamos con un gráfico donde se van a representar los datos en un mismo espacio, donde el eje de la x, se muestran las emisiones de dióxido de carbono y en el eje de la y, el ingreso nacional bruto. Los datos se encuentran representados por puntos conectados por polilíneas las cuales, nos ayudarán a ver la evolución temporal.

## lattice version
xyplot(GNI.capita  ~ CO2.capita, data = CO2data,
xlab = "Carbon dioxide emissions (metric tons per capita)",
ylab = "GNI per capita, PPP (current international $)",
groups = Country.Name, type = 'b')  

Podemos mejorar el gráfico de diversas maneras:

1.Definir diferentes colores para visualizar de mejor manera el resultado.

2.Dar información del tiempo con etiquetas.

3.Definir cada polilínea con el nombre del país de donde son los datos que representan.

Elegir colores

En la base de datos CO2, la cual se está utilizando como ejemplo, aparece una variable, Country, que es categórica, por ello, el programa Rstudio asocia los primeros 5 colores de la paleta del paquete RcolorBrewer, pero como en dicha variable existen más de 5 países, la interfaz repetirá colores en algunos países. A pesar de que no es un problema, puesto que hay bastante separaciones entre las polilíneas de cada país, se puede mejorar definiendo en el programa que orden deben de seguir dichos colores.

nCountries <- nlevels(CO2data$Country.Name)
pal <- brewer.pal(n = 5, 'Set1')
pal <- rep(pal, length = nCountries)  

La relación existente entre los países y los colores debe de ser aquella en la que las líneas que mas cercanas se encuentren se codifique con colores contiguos. Un enfoque simple es calcular el promedio anual de la variable que se representará a lo largo del eje x y seleccionar los colores de la paleta siguiendo un orden con respecto a este valor.

## Rank of average values of CO2 per capita
CO2mean <- aggregate(CO2.capita ~ Country.Name,
          data = CO2data, FUN = mean)
palOrdered <- pal[rank(CO2mean$CO2.capita)]  

## simpleTheme encapsulates the palette in a new theme for xyplot
myTheme <- simpleTheme(pch = 19, cex = 0.6, col = palOrdered) 
## lattice version
pCO2.capita <- xyplot(GNI.capita  ~ CO2.capita,
           data = CO2data,
           xlab = "Carbon dioxide emissions (metric tons per capita)",
           ylab = "GNI per capita, PPP (current international $)",
           groups = Country.Name,
           par.settings = myTheme,
           type = 'b')

pCO2.capita

## ggplot2 version
gCO2.capita <- ggplot(data = CO2data,
           aes(x = CO2.capita,
           y = GNI.capita,
           color = Country.Name)) +
   geom_point() + geom_path() +
   scale_color_manual(values = palOrdered, guide = FALSE) +
   xlab('CO2 emissions (metric tons per capita)') +
   ylab('GNI per capita, PPP (current international $)') +
   theme_bw()  

Etiquetas para mostrar información de tiempo

Como se ha mencionado anteriormente, el gráfico de polilíneas puede mejorarse, que muestren unas etiquetas con los años a los que pertenece los datos, para ver una evolución temporal de cada país, y poder tener así mayor facilidad de comparar los datos. Para ello, utilizaremos la función panel.text, que será la que imprima las etiquetas con los nombres, y por otro lado, también utilizaremos, + glayer_, que nos asegurara de que las etiquetas se impriman en la posición correcta, es decir debajo de cada polilinea.

## lattice version
pCO2.capita <- pCO2.capita +
   glayer_(panel.text(...,
        labels = CO2data$Year[subscripts],
          pos = 2, cex = 0.5, col = 'gray'))
pCO2.capita

## ggplot2 version
gCO2.capita <- gCO2.capita + geom_text(aes(label = Year),
                colour = 'gray',
                size = 2.5,
                hjust = 0, vjust = 0)

Nombres de países: etiquetas de posicionamiento

A continuación, queremos añadir los nombres de los países a cada polilínea, y para ello, existen dos maneras. En primer lugar, basta con agregar una leyenda al gráfico. El problema, es el siguiente, es menos visual que la segunda opción, ya que debemos aprender el color y buscarlo en la leyenda. La segunda forma, y la más cómoda para el lector, consiste en asociar una etiqueta lo más cercana posible a cada polilínea, con el nombre del país al que pertenecen los datos. Para ello, utilizamos el paquete directlabel. Dicho paquete contiene diversos métodos de posicionamiento, así que será más fácil para poder personalizar el suyo propio.

library(directlabels)

## lattice version
direct.label(pCO2.capita,
      method = 'extreme.grid') 

## ggplot2 version
direct.label(gCO2.capita, method = 'extreme.grid') 

Gráficos interactivos: animación

También se pueden mostrar los datos a través de animaciones o funcionalidades interactivas siguiendo el diagrama de movimiento publicado por Gapminder.

Gapminder tiene como finalidad desacreditar los mitos y facilitar el acceso gratuito a visualizar la realidad basada en hechos. Cede herramientas gratuitas para poder comprobar el suceso de las cosas. El desarrollo inicial de Gapminder fue el software Trendalyzer.

Con la técnica de Trendalyzer, se puede visualizar un gráfico interactivo de burbujas, que de manera predeterminada, cuenta con dos variables numéricas y una variable de tiempo, la cual se moverá con el ratón sobre el gráfico.

Utilizaremos el paquete plot_ly, usado con anterioridad, para crear dicho gráfico con animación, en el cual aparecerá la variable tiempo representada en el eje de la x.

p <- plot_ly(CO2data,
      x = ~CO2.capita,
      y = ~GNI.capita,
      sizes = c(10, 100),
      marker = list(opacity = 0.7,
            sizemode = 'diameter'))

CO2.PPP se ajusta con los tamaños de los círculos, mientras que Country.Namese representa con colores y con etiquetas.

p <- add_markers(p,
      size = ~CO2.PPP,
      color = ~Country.Name,
      text = ~Country.Name, hoverinfo = "texto",
      ids = ~Country.Name,
      frame = ~Year,
      showlegend = FALSE)

Finalmente la animación se creará con el paquete animation_opts, donde se personalizará el marco y tiempos de transición y con animation_slider, se definirá el control deslizante.

library(plotly)
p <- animation_opts(p,
         frame = 1000,
         transition = 800,
         redraw = FALSE)

p <- animation_slider(p,
           currentvalue = list(prefix = "Año"))

widgetframe::frameWidget(p)

Agradecimientos

Le agradecemos al autor Oscar Perpiñán Lamigueiro. Le agradecemos también https://rpubs.com/ramanraja/horizon Y http://halweb.uc3m.es/esp/Personal/personas/jmmarin/esp/EDescrip/tema7.pdf Adaptado por Juan Rodolfo García Torres, Alicia Díaz Martínez, Cristina Sotos Serrano y Cristian Ledesma Mejías y Alejandro Giménez Buitrago.