Capítulo 2 Estructura de los datos

2.1 Disposición de los datos

Existen dos formas de disponer los datos:

  1. De forma horizontal: una fila por individuo

  2. De forma vertical: una fila por registro

2.1.1 Formato horizontal

ind sexo edad coltot_1 coltot_2 coltot_3 bmi_1 bmi_2 bmi_3
1 1 44 213 220 199 33.3 30.9 28.3
2 0 45 196 238 218 31.1 29.1 30.1
3 1 55 195 218 216 28.5 30.0 27.9
4 0 51 201 194 201 32.5 31.4 24.5
5 1 46 234 185 189 30.1 31.9 27.7
6 0 51 213 183 214 30.4 28.8 28.3

La ventaja de esta estrategia es que tenemos una fila para cada individuo, como estamos acostumbrados.

Sin embargo, existen varios inconvenientes:

  • Si tenemos un missing en alguna medida hay que eliminar a todo el individuo

  • Debemos suponer que todas las medidas se han realizado en los mismos momentos para todos los individuos, y esto puede no ser cierto.

  • Las diferentes medidas de una misma variable predictora la debemos analizar como si fueran distintas variables

2.1.2 Formato vertical

Vamos a ver cómo se dispondrían estos mismos datos en formato vertical

ind sexo edad coltot bmi momento
1 1 44 213 33.3 1
1 1 44 220 30.9 2
1 1 44 199 28.3 3
2 0 45 196 31.1 1
2 0 45 238 29.1 2
2 0 45 218 30.1 3
3 1 55 195 28.5 1
3 1 55 218 30.0 2
3 1 55 216 27.9 3
4 0 51 201 32.5 1
4 0 51 194 31.4 2
4 0 51 201 24.5 3
5 1 46 234 30.1 1
5 1 46 185 31.9 2
5 1 46 189 27.7 3
6 0 51 213 30.4 1
6 0 51 183 28.8 2
6 0 51 214 28.3 3

2.2 Valores faltantes

Cuando hay valores faltantes en una medida y los datos se disponen de forma horizontal se descartan los demás valores ya que se elimina toda la fila.

ind sexo edad coltot_1 coltot_2 coltot_3 bmi_1 bmi_2 bmi_3
1 1 44 213 220 199 33.3 30.9 28.3
2 0 45 196 NA 218 31.1 29.1 30.1
3 1 55 195 218 216 28.5 30.0 27.9
4 0 51 201 194 201 32.5 31.4 24.5
5 1 46 234 185 NA 30.1 31.9 27.7
6 0 51 213 183 214 30.4 28.8 28.3

En cambio, en la disposición vertical sólo se pierden los valores de los tiempos en cuestión y no todas las medidas del individuo.

ind sexo edad coltot bmi momento
1 1 44 213 33.3 1
1 1 44 220 30.9 2
1 1 44 199 28.3 3
2 0 45 196 31.1 1
2 0 45 NA 29.1 2
2 0 45 218 30.1 3
3 1 55 195 28.5 1
3 1 55 218 30.0 2
3 1 55 216 27.9 3
4 0 51 201 32.5 1
4 0 51 194 31.4 2
4 0 51 201 24.5 3
5 1 46 234 30.1 1
5 1 46 185 31.9 2
5 1 46 NA 27.7 3
6 0 51 213 30.4 1
6 0 51 183 28.8 2
6 0 51 214 28.3 3

2.3 Tiempos de medidas diferentes

Al disponer los datos de forma vertical se puede especificar en qué momento se ha recogido cada medida. Para ello simplemente se indica en la variable tiempo. Por ejemplo si se trata de los días que han pasado desde el momento inicial del experimento.

ind sexo edad coltot bmi momento dias
1 1 44 213 33.3 1 1
1 1 44 220 30.9 2 4
1 1 44 199 28.3 3 5
2 0 45 196 31.1 1 3
2 0 45 238 29.1 2 7
2 0 45 218 30.1 3 10
3 1 55 195 28.5 1 2
3 1 55 218 30.0 2 7
3 1 55 216 27.9 3 8
4 0 51 201 32.5 1 2
4 0 51 194 31.4 2 8
4 0 51 201 24.5 3 9
5 1 46 234 30.1 1 1
5 1 46 185 31.9 2 9
5 1 46 189 27.7 3 10
6 0 51 213 30.4 1 3
6 0 51 183 28.8 2 6
6 0 51 214 28.3 3 10

O incluso podemos tener mas medidas para unos individuos que para otros. Como sería el caso que tuviéramos algún missing en alguna medida. Como en este ejemplo, para el individuo 2 y el 5 tenemos sólo 2 medidas, mientras que para el resto tenemos 3.

ind sexo edad coltot bmi momento dias
1 1 44 213 33.3 1 1
1 1 44 220 30.9 2 4
1 1 44 199 28.3 3 5
2 0 45 196 31.1 1 3
2 0 45 218 30.1 3 10
3 1 55 195 28.5 1 2
3 1 55 218 30.0 2 7
3 1 55 216 27.9 3 8
4 0 51 201 32.5 1 2
4 0 51 194 31.4 2 8
4 0 51 201 24.5 3 9
5 1 46 234 30.1 1 1
5 1 46 185 31.9 2 9
6 0 51 213 30.4 1 3
6 0 51 183 28.8 2 6
6 0 51 214 28.3 3 10

2.4 Transformación

2.4.1 Vertical <> horizontal

En esta sección veremos instrucciones útiles en R para pasar de la disposición vertical de los datos a la horizontal y al revés.

Si tenemos la base de datos en horizontal (una fila por individuo) y la queremos pasar a vertical (un registro por fila i varias filas por individuo):

tablahorizontal <- read.csv2("./datos/tablahorizontal.csv")
tablahorizontal
  ind sexo edad coltot_1 coltot_2 coltot_3 bmi_1 bmi_2 bmi_3
1   1    1   44      213      220      199  33.3  30.9  28.3
2   2    0   45      196      238      218  31.1  29.1  30.1
3   3    1   55      195      218      216  28.5  30.0  27.9
4   4    0   51      201      194      201  32.5  31.4  24.5
5   5    1   46      234      185      189  30.1  31.9  27.7
6   6    0   51      213      183      214  30.4  28.8  28.3
tablong <- reshape(data=tablahorizontal, 
                   direction="long", 
                   varying=list(c("coltot_1","coltot_2","coltot_3"),
                                c("bmi_1","bmi_2","bmi_3")), 
                   times=1:3, 
                   timevar="momento", 
                   idvar="ind",
                   v.names=c("coltot","bmi"))
tablong
    ind sexo edad momento coltot  bmi
1.1   1    1   44       1    213 33.3
2.1   2    0   45       1    196 31.1
3.1   3    1   55       1    195 28.5
4.1   4    0   51       1    201 32.5
5.1   5    1   46       1    234 30.1
6.1   6    0   51       1    213 30.4
1.2   1    1   44       2    220 30.9
2.2   2    0   45       2    238 29.1
3.2   3    1   55       2    218 30.0
4.2   4    0   51       2    194 31.4
5.2   5    1   46       2    185 31.9
6.2   6    0   51       2    183 28.8
1.3   1    1   44       3    199 28.3
2.3   2    0   45       3    218 30.1
3.3   3    1   55       3    216 27.9
4.3   4    0   51       3    201 24.5
5.3   5    1   46       3    189 27.7
6.3   6    0   51       3    214 28.3

Ordeno la tabla por id y dentro de cada id por tiempo

tablong <- tablong[order(tablong$ind,tablong$momento),]
tablong
    ind sexo edad momento coltot  bmi
1.1   1    1   44       1    213 33.3
1.2   1    1   44       2    220 30.9
1.3   1    1   44       3    199 28.3
2.1   2    0   45       1    196 31.1
2.2   2    0   45       2    238 29.1
2.3   2    0   45       3    218 30.1
3.1   3    1   55       1    195 28.5
3.2   3    1   55       2    218 30.0
3.3   3    1   55       3    216 27.9
4.1   4    0   51       1    201 32.5
4.2   4    0   51       2    194 31.4
4.3   4    0   51       3    201 24.5
5.1   5    1   46       1    234 30.1
5.2   5    1   46       2    185 31.9
5.3   5    1   46       3    189 27.7
6.1   6    0   51       1    213 30.4
6.2   6    0   51       2    183 28.8
6.3   6    0   51       3    214 28.3

Y si queremos pasar del formato vertical al horizontal

tablavertical <- read.csv2("./datos/tablavertical.csv")
tablavertical
   ind sexo edad coltot  bmi momento dias
1    1    1   44    213 33.3       1    1
2    1    1   44    220 30.9       2    4
3    1    1   44    199 28.3       3    5
4    2    0   45    196 31.1       1    3
5    2    0   45    238 29.1       2    7
6    2    0   45    218 30.1       3   10
7    3    1   55    195 28.5       1    2
8    3    1   55    218 30.0       2    7
9    3    1   55    216 27.9       3    8
10   4    0   51    201 32.5       1    2
11   4    0   51    194 31.4       2    8
12   4    0   51    201 24.5       3    9
13   5    1   46    234 30.1       1    1
14   5    1   46    185 31.9       2    9
15   5    1   46    189 27.7       3   10
16   6    0   51    213 30.4       1    3
17   6    0   51    183 28.8       2    6
18   6    0   51    214 28.3       3   10
tabwide <- reshape(data=tablavertical, 
                   direction="wide", 
                   v.names=c("coltot","bmi"), 
                   times=1:3, 
                   timevar="momento", 
                   idvar="ind")
tabwide
   ind sexo edad dias coltot.1 bmi.1 coltot.2 bmi.2 coltot.3 bmi.3
1    1    1   44    1      213  33.3      220  30.9      199  28.3
4    2    0   45    3      196  31.1      238  29.1      218  30.1
7    3    1   55    2      195  28.5      218  30.0      216  27.9
10   4    0   51    2      201  32.5      194  31.4      201  24.5
13   5    1   46    1      234  30.1      185  31.9      189  27.7
16   6    0   51    3      213  30.4      183  28.8      214  28.3

¿Y si tenemos algun individuo con menos medidas? Por ejemplo, tenemos la tabla en formato vertical y para el individuo id=1 tenemos dos medidas en lugar de 3 (quitamos la tercera medida)

tablaverticalmiss <- tablavertical[-3,]
tablaverticalmiss
   ind sexo edad coltot  bmi momento dias
1    1    1   44    213 33.3       1    1
2    1    1   44    220 30.9       2    4
4    2    0   45    196 31.1       1    3
5    2    0   45    238 29.1       2    7
6    2    0   45    218 30.1       3   10
7    3    1   55    195 28.5       1    2
8    3    1   55    218 30.0       2    7
9    3    1   55    216 27.9       3    8
10   4    0   51    201 32.5       1    2
11   4    0   51    194 31.4       2    8
12   4    0   51    201 24.5       3    9
13   5    1   46    234 30.1       1    1
14   5    1   46    185 31.9       2    9
15   5    1   46    189 27.7       3   10
16   6    0   51    213 30.4       1    3
17   6    0   51    183 28.8       2    6
18   6    0   51    214 28.3       3   10
tabwidemiss <- reshape(data=tablaverticalmiss, 
                       direction="wide", 
                       v.names=c("coltot","bmi"), 
                       times=1:3, 
                       timevar="momento", 
                       idvar="ind")
tabwidemiss
   ind sexo edad dias coltot.1 bmi.1 coltot.2 bmi.2 coltot.3 bmi.3
1    1    1   44    1      213  33.3      220  30.9       NA    NA
4    2    0   45    3      196  31.1      238  29.1      218  30.1
7    3    1   55    2      195  28.5      218  30.0      216  27.9
10   4    0   51    2      201  32.5      194  31.4      201  24.5
13   5    1   46    1      234  30.1      185  31.9      189  27.7
16   6    0   51    3      213  30.4      183  28.8      214  28.3

2.4.2 Colapsar

Si tenemos los datos en vertical y queremos colapsar o resumir los distintos datos de cada individuo en un único valor, como por ejemplo la media.

library(dplyr) 
library(magrittr)

group_by(tablavertical, ind) %>%
  summarise_at(vars(coltot, bmi), list(media = mean))
# A tibble: 6 x 3
    ind coltot_media bmi_media
  <int>        <dbl>     <dbl>
1     1         211.      30.8
2     2         217.      30.1
3     3         210.      28.8
4     4         199.      29.5
5     5         203.      29.9
6     6         203.      29.2