Representación de categorías conductuales a través del tiempo con R

 





Introducción

El presente código permite la representación de una serie de categorías que se desarrollan a través del tiempo. El código que se describe está apoyado en el paquete ggplot2. El código inicial corresponde a la representación de un Gráfico de Gantt. Este tipo de gráfico se emplea principalmente para representar el desarrollo de proyectos a través de varias etapas a lo largo de un periodo de tiempo (para una revisión histórica sobre esta herramienta, véase Wilson, 2003). La segunda parte del código describe una ligera modificación al código inicial para ilustrar su aplicación en la creación de representaciones de secuencias de categorías conductuales ocurriendo a lo largo de un periodo de registro, a la manera de una serie temporal categórica (para una revisión técnica breve sobre este tipo de series temporales, véase Weiß, 2018).

Ejemplo del Gráfico de Gantt

A continuación se ejemplifica la creación de un gráfico de Gantt para representar un cronograma de actividades para un caso ficticio. El caso supone la participación de un estudiante de la Licenciatura en Psicología en un Programa de Servicio Social que involucra la participación en la conducción de un experimento sobre conducta animal. El primer aspecto que se debe considerar es el número de actividades que se habrán de realizar durante el periodo de duración del Programa de Servicio Social (480 horas, normalmente repartidas en 4 horas diarias a lo largo de 6 meses). Estas actividades serían: 1) Planeación del experimento; 2) Diseño y programación del experimento en software especializado; 3) Manejo y preparación de sujetos experimentales; 4) Conducción del experimento; 5) Recolección de datos y preparación de bases de datos; 6) Análisis de resultados; y 7) Redacción de reporte de investigación. El segundo aspecto a considerar es que cada una de las actividades anteriores podría corresponder a una de varias etapas generales, por ejemplo: a) Preparación (Actividades 1, 2 y 3), b) Realización (Actividades 4 y 5) y c)Elaboración de reporte (Actividades 6 y 7). El tercer aspecto es el señalamiento de las fechas de inicio, así como las fechas de finalización de cada una de las actividades incluidas en el cronograma.

Preparación de datos

Primero se ilustra la creación de una tabla que contiene en las columnas cada uno de los campos mencionados anteriormente y en cada renglón los valores especificados para cada actividad.

Item<-c(1:7)
Actividades<-c("Planeación del Eperimento","Diseño y programación del experimento", "Preparación de sujetos experimentales","Conducción del experimento","Recolección de datos","Análisis de resultados","Redacción de reporte")
Etapas<-c("Preparación","Preparación","Preparación","Realización","Realización","Reporte","Reporte")
Inicio<- as.Date(c("01/07/2021","01/08/2021","01/08/2021","01/09/2021","01/09/2021","01/11/2021","01/12/2021"),format= '%d/%m/%Y')
Final<-as.Date(c("31/07/2021","31/08/2021","31/08/2021","30/11/2021","30/11/2021","30/11/2021","31/12/2021"),format= '%d/%m/%Y')
data.frame(Item,Actividades,Etapas,Inicio,Final)
##   Item                           Actividades      Etapas     Inicio      Final
## 1    1             Planeación del Eperimento Preparación 2021-07-01 2021-07-31
## 2    2 Diseño y programación del experimento Preparación 2021-08-01 2021-08-31
## 3    3 Preparación de sujetos experimentales Preparación 2021-08-01 2021-08-31
## 4    4            Conducción del experimento Realización 2021-09-01 2021-11-30
## 5    5                  Recolección de datos Realización 2021-09-01 2021-11-30
## 6    6                Análisis de resultados     Reporte 2021-11-01 2021-11-30
## 7    7                  Redacción de reporte     Reporte 2021-12-01 2021-12-31

En segundo lugar se transforma la base datos para poder crear la representación como un Gráfico de Gantt. La base requiere contener en una misma variable el inicio y final de cada actividad, por lo que hay de duplicar la información contenida en cada variable de la base original para que todas las columnas tengan la misma extensión, además de agregar una columna nueva que indique si la fecha de cada renglón es de inicio o final.

Item<-c(Item,Item)
Actividades<-factor(c(Actividades,Actividades),levels =c("Redacción de reporte","Análisis de resultados","Recolección de datos","Conducción del experimento","Preparación de sujetos experimentales","Diseño y programación del experimento","Planeación del Eperimento") )
Etapas<-factor(c(Etapas,Etapas))
Fechas<-c(Inicio,Final)
Estado<-factor(c(rep("Inicio",7),rep("Final",7)))
cronograma<-data.frame(Item,Actividades,Etapas,Fechas,Estado)
cronograma
##    Item                           Actividades      Etapas     Fechas Estado
## 1     1             Planeación del Eperimento Preparación 2021-07-01 Inicio
## 2     2 Diseño y programación del experimento Preparación 2021-08-01 Inicio
## 3     3 Preparación de sujetos experimentales Preparación 2021-08-01 Inicio
## 4     4            Conducción del experimento Realización 2021-09-01 Inicio
## 5     5                  Recolección de datos Realización 2021-09-01 Inicio
## 6     6                Análisis de resultados     Reporte 2021-11-01 Inicio
## 7     7                  Redacción de reporte     Reporte 2021-12-01 Inicio
## 8     1             Planeación del Eperimento Preparación 2021-07-31  Final
## 9     2 Diseño y programación del experimento Preparación 2021-08-31  Final
## 10    3 Preparación de sujetos experimentales Preparación 2021-08-31  Final
## 11    4            Conducción del experimento Realización 2021-11-30  Final
## 12    5                  Recolección de datos Realización 2021-11-30  Final
## 13    6                Análisis de resultados     Reporte 2021-11-30  Final
## 14    7                  Redacción de reporte     Reporte 2021-12-31  Final

Representación del cronograma como un Gráfico de Gantt

En el siguiente segmento de código se ilustra el uso de la función ggplot() para producir un gráfico que muestre en el eje vertical a cada una de las actividades contempladas en el cronograma y sobre le plano de la figura líneas horizontales de determinada longitud que correspondan a la duración de cada actividad a través del tiempo (eje horizontal). En la gráfica se incluye además una codificación de colores para las actividades dependiendo de la Etapa a la que corresponden. Para lograrlo, basta con introducir como primer argumento la base de datos (cronograma) y como parte del segundo argumento aes(), la especificación de la variable que corresponde al eje X (Fechas), la variable correspondiente al eje Y (Actividades), el código de colores para distinguir a las etapas (col=), y la variable de agrupación Item (group=) para señalar que para cada actividad hay una fecha de inicio y una fecha de finalización. La segunda línea indica que se usará precisamente una línea para conectar la fecha de inicio con la fecha final de cada actividad, en donde el argumento size=10 especifica el grosor de la línea (que en este caso se verá reflejado en la altura de cada línea horizontal). El usuario puede probar diferentes valores en este argumento para elegir el que considere adecuado para su representación. La tercera línea permite especificar los rótulos de los Ejes X y Y, así como el título del gráfico.

library(ggplot2)
gant.chart<- ggplot(cronograma, aes(Fechas, Actividades, color = Etapas, group=Item)) +
  geom_line(size = 10) +
  labs(x="Duración del Programa de Servicio Social", y=NULL, title="Actividades a realizar")

gant.chart

 

   

En caso de requerir algún señalamiento de fechas particulares, es posible dibujar líneas verticales en momentos específicos a través del tiempo. Para ello es necesario especificar las fechas en primer lugar y después agregarlas al código con el que se generó el Gráfico de Gantt con la función geom_vline(), en donde se señalan los valores del eje horizontal en los que se colocará cada línea (xintercept=fechas.importantes), el tipo de línea, el color y grosor.

# creación de una variable con fechas específicas
fechas.improtantes<-as.Date(c("31/07/2021","31/08/2021","30/09/2021","31/10/2021","30/11/2021","31/12/2021"),format= '%d/%m/%Y')

gant.chart +
 geom_vline(xintercept = fechas.improtantes, linetype=1, color = "red", size=1)

Ejemplo de series de tiempo categóricas

Para el desarrollo de este ejemplo se utilizarán los datos correspondientes a la ejecución de un participante en una tarea computarizada de estudio autoregulado en la que podía elegir entre tres modalidades en las que se presentaba información sobre el tema compuertas lógicas (Video, Audio, Texto) y entre tres modalidades para responder a preguntas relacionadas con el tema de estudio (Señalando, Hablando, Escribiendo). En la siguiente base de datos se muestra en la primera columna el modo língüístico en el que el participante reaccionó al material del estudio (Observando, Leyendo o Escuchando, codificados como O, L y E, respectivamente) y en el que respondió a la evaluación (señalando, escribiendo o hablando, codificados como s,e y h, respectivamente). En la segunda y tercera columna se muestra el segundo en el que inició y terminó cada courrencia de uno u otro modo lingüístico.

library(readxl) 
base <- read_excel("C:/Users/Jorge Ruiz/Dropbox/Serie_ML.xlsx")
base
## # A tibble: 35 x 3
##    Serie Inicio Final
##    <chr>  <dbl> <dbl>
##  1 L          1    59
##  2 E         60   128
##  3 s        129   190
##  4 h        191   200
##  5 e        201   214
##  6 L        215   220
##  7 s        221   221
##  8 e        222   243
##  9 L        244   249
## 10 e        250   269
## # ... with 25 more rows

Creación de base de datos

Como en el ejemplo del Gráfico de Gantt, en este caso también debe conformarse una base de datos que permita su fácil representación con el código descrito. Para ello, además de modificar la conformación original de la base, también hay que modificar el formato de las variables que indican el segundo de inicio y final de cada instancia de los modos lingüísticos (ML), para convertir los números en variables con formato de tiempo. La función que permite esta conversión es as.POSIXct() en la que se debe incluir como primer argumento la variable que contiene al tiempo en formato numérico y como segundo argumento un punto de referencia como origen a partir del cual se compara el paso del tiempo (origin=). Cuando la variable temporal con la que se cuenta ya tiene un formato de fecha y hora, no hace falta aplicar la función as.POSIXct() y es posible leer tal variable usando la función as.Date() para integrarla a la base de datos.

id<-rep(c(1:35),2)
ML<-factor(c(base$Serie,base$Serie),levels=c("O","s","E","h","L","e"))
inicio.seg<-as.POSIXct(base$Inicio,origin = "2020-10-14 12:00:00")
final.seg<-as.POSIXct(base$Final,origin = "2020-10-14 12:00:00")
estado<-factor(c(rep("Inicio",35),rep("Final",35)))

base.TS<-data.frame(id,ML,c(inicio.seg,final.seg))
colnames(base.TS)<-c("id","ML","tiempo")
base.TS
##    id ML              tiempo
## 1   1  L 2020-10-14 07:00:01
## 2   2  E 2020-10-14 07:01:00
## 3   3  s 2020-10-14 07:02:09
## 4   4  h 2020-10-14 07:03:11
## 5   5  e 2020-10-14 07:03:21
## 6   6  L 2020-10-14 07:03:35
## 7   7  s 2020-10-14 07:03:41
## 8   8  e 2020-10-14 07:03:42
## 9   9  L 2020-10-14 07:04:04
## 10 10  e 2020-10-14 07:04:10
## 11 11  L 2020-10-14 07:04:30
## 12 12  e 2020-10-14 07:04:33
## 13 13  L 2020-10-14 07:04:52
## 14 14  e 2020-10-14 07:04:59
## 15 15  L 2020-10-14 07:05:23
## 16 16  e 2020-10-14 07:05:44
## 17 17  L 2020-10-14 07:05:47
## 18 18  e 2020-10-14 07:05:56
## 19 19  L 2020-10-14 07:05:59
## 20 20  e 2020-10-14 07:06:05
## 21 21  L 2020-10-14 07:06:32
## 22 22  e 2020-10-14 07:06:39
## 23 23  h 2020-10-14 07:06:50
## 24 24  h 2020-10-14 07:07:12
## 25 25  h 2020-10-14 07:07:51
## 26 26  L 2020-10-14 07:07:57
## 27 27  h 2020-10-14 07:08:00
## 28 28  h 2020-10-14 07:08:21
## 29 29  h 2020-10-14 07:09:04
## 30 30  h 2020-10-14 07:09:05
## 31 31  h 2020-10-14 07:09:08
## 32 32  h 2020-10-14 07:09:09
## 33 33  h 2020-10-14 07:09:10
## 34 34  e 2020-10-14 07:09:12
## 35 35  s 2020-10-14 07:09:14
## 36  1  L 2020-10-14 07:00:59
## 37  2  E 2020-10-14 07:02:08
## 38  3  s 2020-10-14 07:03:10
## 39  4  h 2020-10-14 07:03:20
## 40  5  e 2020-10-14 07:03:34
## 41  6  L 2020-10-14 07:03:40
## 42  7  s 2020-10-14 07:03:41
## 43  8  e 2020-10-14 07:04:03
## 44  9  L 2020-10-14 07:04:09
## 45 10  e 2020-10-14 07:04:29
## 46 11  L 2020-10-14 07:04:32
## 47 12  e 2020-10-14 07:04:51
## 48 13  L 2020-10-14 07:04:58
## 49 14  e 2020-10-14 07:05:22
## 50 15  L 2020-10-14 07:05:43
## 51 16  e 2020-10-14 07:05:46
## 52 17  L 2020-10-14 07:05:55
## 53 18  e 2020-10-14 07:05:58
## 54 19  L 2020-10-14 07:06:04
## 55 20  e 2020-10-14 07:06:31
## 56 21  L 2020-10-14 07:06:38
## 57 22  e 2020-10-14 07:06:49
## 58 23  h 2020-10-14 07:07:11
## 59 24  h 2020-10-14 07:07:50
## 60 25  h 2020-10-14 07:07:56
## 61 26  L 2020-10-14 07:07:59
## 62 27  h 2020-10-14 07:08:20
## 63 28  h 2020-10-14 07:09:03
## 64 29  h 2020-10-14 07:09:04
## 65 30  h 2020-10-14 07:09:07
## 66 31  h 2020-10-14 07:09:08
## 67 32  h 2020-10-14 07:09:09
## 68 33  h 2020-10-14 07:09:11
## 69 34  e 2020-10-14 07:09:13
## 70 35  s 2020-10-14 07:13:28

Representación de la secuencia de conductas a través del tiempo (Versión A)

A continuación se representa la ocurrencia de uno u otro ML reactivo (O, L, E) o activo (s, e, h) a través del tiempo que el participante dedicó al estudio sobre el tema de las compuertas lógicas.

categorical.TS<- ggplot(base.TS, aes(tiempo, ML, color = ML, group=id)) +
  geom_line(size = 10) +
  labs(x="Duración del periodo de estudio", y=NULL, title="Modos lingüísticos empleados")
categorical.TS 

Representación de la secuencia de conductas a través del tiempo (Versión B)

A continuación se hace la misma representación que en la figura anterior, con la diferencia de que en ésta se incluye una categorización de los ML como reactivos o activos, añadiendo una codificación delcolor de acuerdo con estas categorías. Para ello primero se crea una nueva variable (modo) a partir del ML, para incluirlo en la base de datos generada en el segmento anterios.

modo<-NA
for (i in 1:70){
  if (ML[i]=="O"|ML[i]=="E"|ML[i]=="L"){
    modo[i]<-"Modo reactivo"
  }
    if (ML[i]=="s"|ML[i]=="h"|ML[i]=="e"){
    modo[i]<-"Modo activo"
  }
}


base.TS<-cbind(base.TS,modo)

categorical.TS.2<-ggplot(base.TS, aes(tiempo, ML, color = modo, group=id)) +
  geom_line(size = 10) +
  labs(x="Duración del periodo de estudio", y=NULL, title="Modos lingüísticos empleados")

categorical.TS.2

Finalmente, se ilustra la inlcusión de líneas verticales en momentos específicos de manera semejante a como se ejemplificó en el Gráfico de Gantt. También se ilustra la inclusión de una paleta de colores particular (de entre varias posibilidades) para establecer arbitrariamente los colores de cada categoría del modo reactivo o activo.

momento<-as.POSIXct("2020-10-14 07:01:40", format = "%Y-%m-%d %H:%M:%S")

categorical.TS.2 + geom_vline(xintercept = momento, linetype=2, 
             color = "blue", size=1) +
  scale_color_brewer(palette="Dark2",name="Categorias de Registro")

 

Referencias

Weiß, C. H. (2018). Categorical Time Series Analysis. Wiley StatsRef: Statistics Reference Online, 1-8. http://doi.org/10.1002/9781118445112.stat08132

Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. New York: Springer-Verlag.

Wickham, H. & Bryan, J. (2019). readxl: Read Excel Files. R package version 1.3.1. https://CRAN.R-project.org/package=readxl

Wilson, J.M. (2003). Gantt charts: A centenary appreciation. European Journal of Operational Research, 149, 430–437. http://doi.org/10.1016/S0377-2217(02)00769-5


Publicado en Páginas