Page cover

Detección de datos perdidos

En este apartado vamos a ver cómo cuantificar y visualizar los datos ausentes para su detección, pero antes veamos cómo se representan los datos ausentes en R

Datos ausentes en R

NA

Es como se representa en R los datos ausentes o missing. Recuerda que en el Tema 1 vimos que los datos missing pueden estar representados de muchas formas ("99", "Missing", "Unknown", " ") y hay que detectarlos y convertirlos en NA

Versiones especiales de NA:

NULL

Es un valor especial que se utiliza para representar la ausencia de un valor o la falta de datos. Se trata de un objeto nulo, y se puede utilizar en diversas situaciones para indicar que una variable o expresión no tiene un valor asignado.

NaN

Son valores imposibles, por ejemplo cuando fuerzas a R a dividir 0 por 0.

Inf

Representa un valor infinito, como por ejemplo si fuerzas a R a dividir un número por 0

Ejemplo ilustrativo de como esto puede afectar a tus análisis:

z <- c(1,7, 22, NA, Inf, NaN, 5, 8, 10, 15, NA, 12)
max(z)                           # returns NA
max(z, na.rm=T)                  # returns Inf
max(z[is.finite(z)])             # returns 22

“NAs introduced by coercion” es un warning común en R. Por ejemplo, si intentas convertir en numérico un vector que tiene caracteres:

Funciones útiles en R

is.na() y !is.na()

Estas funciones devuelven un valor lógico (TRUE o FALSE)

na.omit()

Esta función quitará los datos missing, si lo aplicas a un vector quitará los datos NA y si es sobre un data frame quitará las filas donde haya un valor missing.

na.rm = TRUE

Cuando se utilizan funciones matemáticas como max(), min(), sum() or mean()si hay valores NA los eliminará para hacer el cálculo

Cuantificar y visualizar datos missing en una base de datos

Para ello vamos a usar una base de datos de una epidemia de Ébola.

y un paquete de R que se llama naniar

Este dataframe contiene 5888 observaciones y 20 variables, con númerosos NA's en muchas de sus variables. En este caso, se asume que no hay ni errores ni datos atípicos.

Cuantificación

El primer interés es saber cuántos datos missing tiene la base de datos, tanto por variable como global.

El número de datos missing por variable se puede ver con summary()

Para saber el número y porcentaje de valores que son missing a nivel global se pueden usar las funciones pct_miss() , n_miss() , pct_complete_case() y n_case_complete()

En este caso, vemos que el porcentaje de datos missing global no es demasiado (un 7.4%), pero si no se trata y solo se borran, nos quedaríamos con sólo el 35% de la base de datos, que corresponden a 2,083 observaciones de las 5,888 de las que se partía, por eso, tratar de forma adecuada los datos perdidos es muy importante para los análisis posteriores. Hay dos cosas que se pueden hacer:

  • Borrarlos

  • Imputarlos

La decisión muchas veces vendrá dada por el número de datos perdidos, los análisis posteriores que se quieran realizar, si queremos hacer análisis univariante o multivariante, etc.

La decisión de borrarlos puede tener mucho impacto en los análisis posteriores. Imagina que queremos ajustar una recta de regresión para predecir los días desde la aparición de síntomas hasta la hospitalización (days_onset_hosp) con la temperatura (fiebre) (temp) en el ejemplo de la epidemia de Ébola (linelist)

1) Si se borran todas aquellas filas que tienen al menos un missing (n=2083):

Usamos regresión de Poisson por como se distribuye la variable days_onset_hosp

En este caso, se ve como la variable temp no está asociada con la variable days_onset_hosp (p-valor = 0.111) y por tanto no se podría concluir que un aumento en la temperatura corporal (fiebre) provoca más días de hospitalización.

2) Si no se borra nada (n=5888)

En este caso, si se puede decir que la variable temp está asociada con la variable days_onset_hosp (p-valor = 5.36e-10) y por tanto se puede concluir que un aumento en la temperatura corporal (fiebre) provoca más días de hospitalización.

Por tanto es muy importante detectar y tratar de forma adecuada los datos faltantes sino quieres resultados sesgados o incluso falsos.

Para hacer un buen tratamiento es importante pensar en por qué tus datos podrían faltar, además de cuantificarlos. Hacer esto puede ayudarte a decidir qué tan importante podría ser imputar datos faltantes y también qué método de imputación de datos faltantes podría ser el mejor.

Tipos de datos missing

En estadística y ciencia de datos hablamos de tres tipos de datos missing:

  1. Missing Completely at Random (MCAR): Son datos perdidos completamente aleatorios, es decir, la ausencia de valores en un conjunto de datos es independiente tanto de otras variables observadas como de las no observadas.

    Ejemplo: en una encuesta online, algunos participantes olvidan responder una pregunta sobre el color favorito porque el sistema falla en un 5% de los casos al guardar la respuesta. El error ocurre de manera aleatoria y no depende de ninguna variable como la edad, género, ni del propio color elegido.

  2. Missing at Random (MAR): Son datos perdidos aleatorios, es decir, la probabilidad de que un valor falte puede depender de otras variables observadas, pero no de las no observadas. El nombre puede confundir porque no son realmente aleatorios.

    Ejemplo: en un estudio psicológico, las personas más mayores son menos propensas a responder a preguntas sobre uso de redes sociales. Aquí, la ausencia está relacionada con la variable observada edad y como la conocemos, podemos modelar y compensar esta ausencia.

  3. Missing not at Random (MNAR): Datos perdidos de forma no aleatoria, es decir, la probabilidad de que falte un valor depende de una variable no observada. Esto puede introducir sesgos en los datos y es más complicado de manejar. En otras palabras, la falta de un valor está relacionada con la información que falta y no puede ser modelada únicamente en función de las variables observadas. Ejemplo: en una encuesta sobre ingresos anuales, los participantes con sueldos muy altos tienden a no contestar esa pregunta. La probabilidad de ausencia está directamente relacionada con el valor perdido (el ingreso), por lo que es mucho más difícil de corregir.

Tratar con datos MNAR (Missing not at Random) puede ser más complicado que tratar con datos MCAR (Missing Completely at Random) o MAR (Missing at Random) porque la falta de información está relacionada con la información que falta.

Visualización

Antes de imputar o eliminar, es esencial ver dónde y cómo faltan los datos. Con gg_miss_var() cuantificamos el porcentaje de NA por variable (y por subgrupos con facet =). Con vis_miss() inspeccionamos patrones fila–columna, y con geom_miss_point() detectamos relaciones entre dos cuantitativas cuando una falta. Las columnas sombra creadas con bind_shadow() permiten tratar la ausencia (NA/no_NA) como una variable más y estudiar su relación con covariables o con el tiempo.

1) Panorama global por variable

Aquí se ve que infector y date_infection tienen alrededor de un 35% de datos ausentes, outcome y date_outcome tienen entre 20–25% de datos ausentes y el resto de variables menos del 5%. Esto es importante porque si el número de datos ausentes supera el 5% en las variables, estas pueden ser muy problemáticas y, por tanto, habrá que ver como de relevantes son para el análisis.

En este caso, la ausencia no es uniforme: unas pocas variables concentran la mayoría de los NA. Esto ya descarta MCAR global (completamente aleatorio).

También se puede visualizar el dataframe como un heatmap donde se muestra en forma de matriz de datos si cada valor está ausente o no con vis_miss(). Se puede usar select() para elegir ciertas columnas del dataframe y proporcionar solo esas columnas a la función.

El orden en el que aparecen las observaciones es el mismo que en la base de datos, pero con la opción cluster = TRUE, se pueden identificar grupos de variables con patrones similares.

En este gráfico se ve una matriz de observaciones (filas) por variables (columnas):

  • Gris = dato presente.

  • Negro = valor perdido.

En este caso, se ve que algunos bloques verticales (columnas) concentran los NA.

Cuando se observan variables como puntos negros dispersos, normalmente se puede pensar que son MCAR, y cuando hay patrones muy claros, habrá que investigar si hay posibles MAR o MNAR.

Candidatos MCAR (huecos sueltos, sin patrón compartido y % pequeños):

  • gender (~5%), age (~1%) y temp (~3%). Los NA aparecen salpicados sin alinearse con otros campos (MCAR).

Candidatos MAR/MNAR (bloques alineados por filas, dependen de algo observado o no observado):

  • Síntomas fever, chills, cough, aches, vomit (~4% cada uno): faltan para los mismos individuos.

  • date_infection (~35%) y infector (~35%): grandes bloques y alineados entre sí, habrá que ver si es un periodo concreto.

  • date_outcome (~16%) y outcome (~22%), y también days_onset_hosp (~4%): patrones por bloques que coinciden con otros campos.

Ahora que tenemos una idea más adecuada, podemos hacer análisis por subgrupos buscando posibles asociaciones.

2) Visualizar por subgrupos de una variable cualitativa

Si queremos visualizar los datos missing por los subgrupos de una variable cualitativa, ejemplo: gender o outcome haríamos uso del argumento facet =

Una cosa interesante que vemos al clasificar los datos por la variable gender, es que para age también falta en ≈30% de esos casos, por tanto hay dependencia entre la falta de género y de edad.

3) Visulizar dos variables cuantitativas

¿Cómo visualizamos algo que está perdido? ggplot()por ejemplo elimina las observaciones con valores missing.

Si creas un gráfico de dispersión entre dos variables cuantitativas, por ejemplo age y temp con ggplot()

Se ve cómo los valores missing de ambas variables no están representados en el gráfico, pero si queremos ver dependencias entre variables, podemos usar la función geom_miss_point(). Al crear un gráfico de dispersión de dos columnas, los registros con uno de los valores faltantes y el otro valor presente se muestran configurando los valores faltantes en un 10% menos que el valor más bajo en la columna, y se les asigna un color distintivo.

En este gráfico de dispersión, los puntos rojos representan registros donde el valor de una columna está presente, pero el valor de la otra columna falta. Esto permite visualizar la distribución de los valores faltantes en relación con los valores no faltantes. En este caso, se puede percibir que hay más valores faltantes en la variable age para aquellos que tienen temp alta, pero también habría que ver si es simplemente debido a que hay más datos cuando la variable temp es alta y es simplemente por probabilidad. Usaremos las variables sombra para esto.

4) Estratificado por una variable sombra

Para evaluar la ausencia de datos estratificados por otra variable, podemos usar la funciónbind_shadow() para ver la proporción de missing de una variable respecto a la distribución de otra variable. Esta función crea una columna binaria NA/no_NA para cada columna existente y une todas estas nuevas columnas al conjunto de datos original con el apéndice "_NA".

Estas variables shadow se pueden utilizar para representar la proporción de valores que faltan en relación con otra columna y luego se pueden utilizar para ver dependencias de los valores missing con variables tanto cuantitativas como cualitativas. Esto nos ayudará a diferenciar entre MCAR y MAR/MNAR:

Variables Cuantitativas

Ejemplo 1

Si queremos ver si los síntomas están relacionados con alguna de las variables observadas, se puede representar la variable chills_NA con temp.

En este caso se observa que los NA de la variable chills, corresponden a aquellos individuos que tienen una temperatura corporal por debajo de 38. Lo mismo pasa con el resto de síntomas, ya que todos los NA corresponden a los mismos individuos, por tanto se puede decir que hay una relación entre los NA de los síntomas con temperatura baja. Por lo tanto podríamos decir que los NA de los síntomas son MAR/MNAR. Es difícil saber si son MAR o MNAR sin saber la realidad, muchas veces lo podemos pensar por el contexto o por si hay o no datos además de los NA. En este caso, la mayoría de NAs es en aquellos que no tuvieron fiebre, se podría pensar que no fueron anotados aquellos síntomas de los individuos que no tenían fiebre, pero quizás la relación es más compleja porque algunos individuos que no tenían fiebre, si se les anotaron los síntomas. Por tanto, puede que haya algo no observado (MNAR) o una combinación más compleja de lo observado (MAR)

Ejemplo 2

Si se quiere ver la proporción de pacientes a los que les falta la variable age según el valor del registro del día de hospitalización date_hospitalisation podemos estratificarla usando la variable shadow en la opción: color =.

En este caso observamos que los datos missing de la variable edad se corresponde a fechas más recientes, por lo tanto podríamos sospechar de una relación del tipo que en fechas más tardías (con más desborde hospitalario), no se apuntaba la edad de algunas personas por falta de medios. En este caso el hecho de que no todos los valores faltantes correspondan a esa dependecia, nos hace pensar que podría ser un MNAR.

Variables Categóricas

Ejemplo 3

También se pueden usar variables categóricas para esta representación, por ejemplo para ver si los missing de los síntomas fever_NA están relacionados con la variable outcome.

En este caso, no observamos ninguna relación por tanto podríamos decir que los missing de outcome podrían ser MCAR.

Last updated