Capítulo 2 Estructura de los datos
2.1 Disposición de los datos
Existen dos formas de disponer los datos:
De forma horizontal: una fila por individuo
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):
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
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
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)
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