En esta lección trabajaremos con missing data o valores no disponibles. Estos tienen un papel fundamental en el analisis de datos y la estadistica. Muchas veces los valores no disponibles pueden ser ignorados, pero en otros casos deben ser cuidadosamente analizados para conocer si existe un patron o causa comun por la cual no estan disponibles.
Este material esta basado en la leccion de “Basic_building_blocks” de “R Programming”, paquete swirl.Author: Nick Carchedi, Organization: JHU Biostat, Version: 2.2.0.
Comencemos ahora!
En R, NA se usa para representar cualquier valor ‘no disponible’ u ‘olvidado’. Cualquier operación que se aplique sobre NAs, arroja como resultado NA. Para demostrarlo, crearemos un vector con valores no disponibles: c(44, NA, 5, NA) y se asignará a una variable x. Note que NA debe ser en mayusculas.
Luego, el vector x se multiplicará por 3. El resultado de multiplicar un NA por 3 es también NA. Lo mismo ocurre si sumamos 3 a x.
x <- c(44, NA, 5, NA)
x
## [1] 44 NA 5 NA
x * 3
## [1] 132 NA 15 NA
x + 3
## [1] 47 NA 8 NA
Para hacer el ejemplo un poco mas interesante, crearemos un vector con 100 valores aletorios de una distribución normal con y <- rnorm(100). Luego, crearemos un vector con 100 NAs con z <- rep(NA, 100). Finalmente, seleccionaremos aleatoriamente 50 elementos de esos 200 valores (combimando ‘y’ y ‘z’), de modo que no sabremos cuantos NA hay en el vector resultante, ni donde estan localizados. Esto lo haremos con my_data <- sample(c(y, z), 50).
y <- rnorm(100)
y
## [1] 0.145966329 0.321499634 -0.789502372 -0.848894233 0.489798302
## [6] 0.414893017 1.899668611 -0.407645630 -0.182975131 -2.125765943
## [11] 0.265942397 -1.009081214 -1.440362920 0.027933935 -0.001833213
## [16] -0.542181168 -0.012111648 -1.418045327 -0.285818127 0.716875295
## [21] 0.466777194 -0.189708373 -1.321870899 2.359758487 0.461312335
## [26] -1.481034857 0.035812105 1.450154964 0.602629050 -0.508852319
## [31] 1.514645069 0.121527902 0.395085383 -0.222269109 -1.198385588
## [36] -0.018251406 0.076575172 1.271535724 -0.137440920 -2.419109465
## [41] -1.050486749 -1.228649571 -1.632599136 0.569264050 -1.617708779
## [46] -2.571055590 -0.395345996 0.429833444 -1.680074174 0.442209548
## [51] -0.882859748 -0.609328560 -1.875074208 -0.894334661 -0.378196776
## [56] -1.180181375 0.588894609 -1.744573733 1.809499593 0.342967358
## [61] 0.157834323 1.005561490 0.947882377 1.745814010 -0.920057450
## [66] -0.269523347 1.158321974 0.277585121 2.275640322 -0.265825007
## [71] -1.704053576 -1.275795321 -0.025954164 -0.606730493 0.963001497
## [76] -1.032426424 -0.375755020 -0.465716390 0.194035251 -0.992781005
## [81] -0.331519094 -1.881630936 -1.507952425 0.979529277 1.961654925
## [86] 0.771239374 -1.381904583 0.158582457 0.541568556 -1.268022720
## [91] -2.066588656 -0.430549040 -0.375884276 -0.236820065 0.237922215
## [96] 0.879893772 1.390347210 -1.319958252 -1.281170970 -0.001845655
z <- rep(NA, 100)
z
## [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [24] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [47] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [70] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [93] NA NA NA NA NA NA NA NA
my_data <- sample(c(y, z), 50)
my_data
## [1] NA NA -0.137440920 -1.875074208 -1.050486749
## [6] 0.442209548 0.157834323 -0.331519094 NA NA
## [11] -0.609328560 -1.418045327 1.514645069 -1.319958252 NA
## [16] NA NA NA 0.395085383 NA
## [21] NA -1.281170970 0.194035251 0.541568556 -0.789502372
## [26] NA NA 0.414893017 0.771239374 0.979529277
## [31] 1.390347210 -0.606730493 NA -1.009081214 -0.001833213
## [36] -1.744573733 NA NA NA NA
## [41] NA -1.881630936 0.569264050 -0.222269109 -1.680074174
## [46] NA 1.961654925 NA -1.481034857 NA
Para conocer donde los NA estan localizados se utiliza la función is.na(), de la siguiente manera my_na <- is.na(my_data). Todos los valores TRUE corresponden con NA en la variable my_data is NA. De la misma manera, todos los valores FALSE corresponden con valores de la distribución normal.
my_na <- is.na(my_data)
my_na
## [1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
## [12] FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE
## [23] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
## [34] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
## [45] FALSE TRUE FALSE TRUE FALSE TRUE
Previamente vimos los operadores logicos, como es el caso del operador == para chequear la igualdad de dos objetos. Pruebe si la expresión my_data == NA arroja el mismo resultado que is.na().
El resulatado es un vector de 50 valores, todos ellos NA. La razon es que NA no es un valor en si mismo sino un marcador de posición para una cantidad que no está disponible. Por ello, la expresión logica es incompleta y R no tiene otra opción que devolver un vector de la misma longitud que my_data conteniendo todos NA.
El mensaje importante aqui es recordar que el usar expresiones lógicas con NA puede ser problematico.
my_data == NA
## [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [24] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [47] NA NA NA NA
Volvamos al vector my_na que tiene valores “TRUE’ para los NA y”FALSE" para cualquier otro valor numérico. Podemos calcular el valor total de NA. Esto es sabiendo que R representa TRUE como 1 y FALSE como 0, luego sumamos el total de TRUEs y Falses para poder conocer cuantos NA hay en los datos. Esto se realiza con la función sum(ny_na) que sumará solo los TRUE. También podemos utilizar la función table(my_na).
sum(my_na)
## [1] 21
table(my_na)
## my_na
## FALSE TRUE
## 29 21
Otro tipo de valor no disponible es NaN, que se utiliza para numeros no disponibles. Para ver un ejemplo calcule 0/0 o reste infinito a infinito (Inf - Inf)
0/0
## [1] NaN
Inf - Inf
## [1] NaN
Ha llegado al final de esta leccion!