Una situación a la que se enfrenta frecuentemente cualquier científico de datos es el tratamiento de los valores perdidos.
Los datos faltantes se definen como valores no disponibles que serían útiles o significativos para el análisis de los resultados. Hay muchos tipos de datos faltantes y muchas razones por las cuales pueden ocurrir. Estos dos factores son decisivos al enfrentar la ausencia de datos en el momento de analizar los resultados, donde lo principal es decidir si la pérdida es aleatoria, es decir, afecta por igual a todos los individuos, o bien puede ser debida a una razón o razones específicas que pueden introducir sesgos que invaliden los resultados.
Por todo ello,
Los datos faltantes son un problema frecuente en los estudios médicos; habitualmente no son reportados y, si se menciona el hecho, no se explicita la manera en que fueron enfrentados.
Los programas computacionales los manejan en forma variable, lo que puede conducir a errores en los resultados y su interpretación.
No hay ninguna forma totalmente satisfactoria para el manejo de los datos faltantes, por lo que se debe ser estricto en optimizar la recolección y registro de datos en la etapa de diseño y ejecución.
El sesgo que introduce o puede introducir la falta de datos es proporcional al número de pérdidas: más de un 10% es inaceptable.
Alternativas para mitigar los datos faltantes: 1) Omitir variables con datos faltantes. 2) Omitir individuos en quienes hay datos faltantes. 3) Estimar (imputar) los datos faltantes donde estos son reemplazados con valores predichos desde los datos presentes.
Por lo antes mencionado, damos una lista de verificación para que el lector crítico pueda estimar si hay o no sesgos importantes o si no se pueden eliminar del todo:
Todo estudio debiera mencionar si hubo o no datos faltantes.
Informar su magnitud. Mientras más grande sea el estudio, mayor el número de variables medidas, más largo en el tiempo, mayor número de participantes, individuos o instituciones, mayor es la probabilidad de tener datos faltantes.
Explicar las razones por las cuales faltan los datos y determinar el tipo de datos faltantes.
Explicar el método usado para lidiar con el problema: omitir variables, casos o imputación.
Explicar el raciocinio, las presunciones del modelo usado para la imputación y sus posibles sesgos.
Explicar si se hizo o no un análisis de sensibilidad.
La data consta de tres variables: peso, altura y genero, para efectos de ejemplo, de como tratar datos faltantes se tienen varios casos con NA que deben ser tratados dependiendo del tipo de variable que son.
library(readxl)
datos <- read_excel("C:/Users/UNICA/Desktop/PRESENTACIONES FITH/DATOS FALTANTES/datos faltantes.xlsx")
head(datos,20)
## # A tibble: 20 x 3
## peso altura genero
## <dbl> <dbl> <chr>
## 1 68.8 1.7 Masculino
## 2 68.8 1.6 Masculino
## 3 69.9 1.58 Masculino
## 4 57.9 1.61 Masculino
## 5 60 1.64 Masculino
## 6 87.5 1.66 Masculino
## 7 80.6 1.71 Masculino
## 8 66.5 1.56 <NA>
## 9 65.3 1.61 <NA>
## 10 74.7 1.64 Masculino
## 11 80 1.65 Masculino
## 12 72.5 1.58 Masculino
## 13 71.5 1.63 Masculino
## 14 75.6 1.69 Masculino
## 15 57 1.55 Masculino
## 16 67 1.48 Masculino
## 17 67.6 1.56 Masculino
## 18 66.1 1.64 Masculino
## 19 66.9 1.65 Masculino
## 20 96.4 1.67 Masculino
Si la variable a tratar es cualitativa lo reemplazaremos por la moda.
Si la variable a tratar es cuantitativa la reemplazaremos por la media.
Función de la moda
moda=getmode=function(v){
uniqv=unique(v)
uniqv[which.max(tabulate(match(v,uniqv)))]
}
Existen multitud de procedimientos para aplicar cuando tenemos valores perdidos. Aunque básicamente existen dos aproximaciones posibles:
Eliminar muestras o variables que tienen datos faltantes.
Imputar los valores perdidos, es decir, sustituirlos por estimaciones.
Para explicar los procedimientos, a modo de ejemplo, partiremos del siguiente conjunto de datos que hemos cargado con el nombre de \(datos\)
sum(is.na(datos$peso))
## [1] 4
sum(is.na(datos$altura))
## [1] 3
sum(is.na(datos$genero))
## [1] 6
Podemos ver que en la variable \(peso\) tenemos 4 valores faltantes, en la variable \(altura\) tenemos 3 y en la variable \(genero\) 6 valores faltantes.
sum(complete.cases(datos))
## [1] 198
De los 210 casos que tenemos en nuestra data solamente 198 están completos.
Ahora bien, dado que en las variables cuantitativas como lo son \(altura\) y \(peso\) no podemos calcular de manera simple su media, debido a que tenemos datos faltante en nuestra \(data\). Por ejemplo:
mean(datos$altura)
## [1] NA
mean(datos$peso)
## [1] NA
Si observamos, nos arroja NA en ambos casos, por lo que mencionamos anteriormente, para poder solucionarlo debemos de utilizar el argumento na.rm de la siguiente forma:
mean(datos$peso,na.rm = T)
## [1] 75.82621
mean(datos$altura,na.rm = T)
## [1] 1.601353
Una vez ya identificados nuestros datos perdidos o faltantes, el siguiente paso es excluirlos de nuestro análisis.
Para llevar a cabo este procedimiento tenemos dos opciones:
Opción 1. Crear una nueva base de datos, es decir, crear una data donde tengamos todos los casos completos. Pero, tenemos un problema, y es que, al eliminar casos lo que obtendremos al final son menos información para trabajar, y cuando estamos analizando por ejemplo estadística inferencial tenemos menos información, y sabemos que en el análisis inferencial el tamaño de la muestra es muy importante, reducir el tamaño de la muestra también le quita fuerza a la inferencia.
Pero hagamos un ejemplo, para ver como funciona este comando.
datoslimpios=na.omit(datos)
datoslimpios
## # A tibble: 198 x 3
## peso altura genero
## <dbl> <dbl> <chr>
## 1 68.8 1.7 Masculino
## 2 68.8 1.6 Masculino
## 3 69.9 1.58 Masculino
## 4 57.9 1.61 Masculino
## 5 60 1.64 Masculino
## 6 87.5 1.66 Masculino
## 7 80.6 1.71 Masculino
## 8 74.7 1.64 Masculino
## 9 80 1.65 Masculino
## 10 72.5 1.58 Masculino
## # ... with 188 more rows
Con la ejecución de este comando lo que estamos haciendo es generar una nueva data donde solo me muestre los datos completos.
Opción 2. Consiste en sustituir nuestros datos faltantes ya sea por la media o por la moda, según el tipo de variable que lo necesite.
mediapeso=round(mean(datoslimpios$peso))
datos$peso[is.na(datos$peso)]=mediapeso
mediapeso
## [1] 76
mediaaltura=round(mean(datoslimpios$altura))
datos$altura[is.na(datos$altura)]=mediaaltura
mediaaltura
## [1] 2
modagenero=moda(datoslimpios$genero)
datos$genero[is.na(datos$genero)]=modagenero
modagenero
## [1] "Femenino"
Lo que nos está ejecutando son aquellos valores que sustituirán a los valores faltantes de cada casilla vacía, y así nos evitamos eliminar casos como ocurrió anteriormente.
sum(complete.cases(datos))
## [1] 210
head(datos,20)
## # A tibble: 20 x 3
## peso altura genero
## <dbl> <dbl> <chr>
## 1 68.8 1.7 Masculino
## 2 68.8 1.6 Masculino
## 3 69.9 1.58 Masculino
## 4 57.9 1.61 Masculino
## 5 60 1.64 Masculino
## 6 87.5 1.66 Masculino
## 7 80.6 1.71 Masculino
## 8 66.5 1.56 Femenino
## 9 65.3 1.61 Femenino
## 10 74.7 1.64 Masculino
## 11 80 1.65 Masculino
## 12 72.5 1.58 Masculino
## 13 71.5 1.63 Masculino
## 14 75.6 1.69 Masculino
## 15 57 1.55 Masculino
## 16 67 1.48 Masculino
## 17 67.6 1.56 Masculino
## 18 66.1 1.64 Masculino
## 19 66.9 1.65 Masculino
## 20 96.4 1.67 Masculino
En conclusión, estas opciones lo que nos permiten es librarnos del problema de los NA´s, pero es peligroso reducir el tamaño de la muestra con la que estamos trabajando. Recordemos, que es muy importante tener una fuerza estadística en nuestros procesos de inferencia estadística.
Estos pasos sencillos, son muy útiles a la hora que nosotros estamos realizando un análisis estadístico, lo que nos permite es sacarnos del camino los NA´s y poder seguir con nuestro análisis.
Por lo tanto, hay un tema dentro de la estadística denominado Imputación de datos, que lo que nos permite es el de evitar ese recorte de información, sino que también nosotros podemos completar aquellas casillas o celdas en blanco con una serie de mecanismos, para seguir el mismo tamaño de muestra solucionando los NA´s.