Feb 11 / Sebastián Garrido de Sierra

?R | #4 - NAs: Guía básica, parte 1

Es inevitable.

Más temprano que tarde, los NAs aparecen y complican nuestra vida al trabajar en R.

A veces están ahí, visibles y campantes, después de importar una base de datos.

Por ejemplo, si copias y ejecutas el siguiente bloque de código: 
... deberías ver algo como esto: 
Otras veces se esconden en los renglones que no ves, esperando la oportunidad para "contagiar" los resultado de las operación aritméticas que realices o impedirte ajustar un modelo.

Puedes confirmar lo que digo si copias y ejecutas los siguientes pedazos de código:
Ahh... Que especiales y (potencialmente) desquiciantes son los NAs en el mundo de R.

Y a pesar de esto, qué poco nos explican sobre cómo lidiar con ellos.

Al menos ese fue mi caso.

Tardé años, literalmente años, en entender cómo trabajar de forma adecuada con NAs.

Esto no debería ser así, por lo menos no para quienes formamos parte de la comunidad de Data Crunchers 🤓.

Por ello, durante los últimos días me puse a recopilar todos los consejos y recursos que conozco para entender y lidiar de forma productiva con los NAs.

Durante éste y (cuando menos) el siguiente número de ?R te compartiré lo que, por no encontrar un mejor nombre, llamaré la guía básica para trabajar con NAs en R (y no morir en el intento).

A darle.

💡 Tips

1) 🤌 ¿QUÉ SON LOS NAs?

En un mundo ideal, deberíamos trabajar con bases de datos integradas por variables en las que todos sus valores están claramente definidos.

Por desgracia, la realidad suele pensar diferente y nos ofrece bases de datos como esta:

Fuente: Extracto de la base de datos incluida en la hoja 7 del tabulado básico "Estructura organizacional y recursos" del Censo Nacional de Procuración de Justicia Estatal 2023 del INEGI. URL: https://tinyurl.com/5n99h35f

En las dos últimas columnas el valor de San Luis Potosí es "-".

En términos técnicos, esto se conoce como un valor faltante y es la forma en que registramos lo desconocido (*se puso filosófico el viejo Segasi*).

Existen diversas convenciones para representar los valores faltantes de una variable.

Mientras que en Python se utiliza None y en Stata el símbolo ".", en R usamos dos letras, NA, mismas que significan not available o no disponible.

Nota bene

Por favor nota que en R  NA es diferente a "NA"NaN y NULL.

El primero representa un
valor faltante. El segundo, una cadena de texto integrada por las letras mayúsculas N y A, el tercero es el valor not a number, y el cuarto el valor nulo.


2) 😠 ¿POR QUÉ EXISTES, NA?

Dados los retos y complejidades que suelen generarnos los NAs al analizar una base de datos, es inevitable preguntarse por qué existen.

Explicaciones hay muchas. Aquí me concentro en
tres.

1) Algunas bases de datos incluyen valores faltantes porque la persona o institución encargada de proporcionar un pedazo de información, se negó a hacerlo.

Por ejemplo, en la tabla que incluí en la sección anterior, los valores faltantes se deben a que las autoridades de San Luis Potosí consideraron que la información solicitada por el INEGI era de carácter reservado, y no se la proporcionaron.

2) También es común que una base de datos incluya valores faltantes porque el instrumento utilizado para medir un fenómeno se descompuso.

Por ejemplo, la siguiente imagen muestra las mediciones de partículas menores a 2.5 micrómetros (PM2.5) en la Zona Metropolitana del Valle de México el 1 de enero de 2025:

Fuente: Índice de AIRE Y SALUD por estaciones, Calidad del Aire, CDMX. URL: https://tinyurl.com/4yv6eukk

De acuerdo con la leyenda que está en la parte de abajo, todas las celdas en gris oscuro representan valores faltantes, ya que el instrumento que debía medir el nivel de este contaminante estaba en "mantenimiento".

3) En otras ocasiones los valores faltantes surgen después de unir dos bases de datos que si bien estaban "completas" de forma individual, al unirlas provocamos que a una o más variables les falten valores.

Por ejemplo, si copias y ejecutas los siguientes bloques de código:
... en el proceso primero deberías ver las dos bases que están en el primer renglón de la siguiente imagen, y al final la que está debajo:

3) 🤔 ¿POR QUÉ DEBERÍA IMPORTARTE APRENDER A LIDIAR CON NAs?

Parte de la respuesta tiene que ver con lo que comenté al comienzo de este correo:
  • Los NAs son "contagiosos" y provocarán que los resultados de las operaciones aritmética que hagas con una variable que incluye uno o más, también sea NA
  • La presencia de NAs en una o más variables de una base de datos puede provocar que R nos impida usar ciertas funciones (p. ej., kmeans())
En consecuencia, el primer motivo por el cual creo que debería interesarte aprender a lidiar con NAs es entender cómo enfrentar y resolver estos retos comunes.

El segundo motivo es más sutil.

Existen diversas estrategias para lidiar con NAs y no siempre es evidente cuál utilizar en cada caso.

El riesgo entonces es que al elegir el camino equivocado, termines generando un problema más grande que el que intentabas resolver.

Dedicaré el próximo número de ?R a explorar este tema.

Pero para llegar ahí, primero tenemos que hablar de cómo saber si una variable o base de datos tiene NAs.

Así que termino esta semana compartiéndote algunos recursos 👇 para detectar la presencia de valores faltantes y dimensionar la gravedad del problema.

¿Te gustaría recibir nuestro newsletter cada semana en tu correo?

Compártenos tu info y te lo mandamos 🤓.

Nos importa tu privacidad.
Averigua
aquí qué hacemos para protegerla.
Muchas gracias 🙂

En los próximos minutos recibirás un correo de Sebastián de Data Crunchers

Si no lo encuentras en la bandeja de entrada, por favor revisa las carpetas de Spam y Social (o equivalentes).

⚡️ Recursos

1) 🔍 DETECTANDO NAs CON FUNCIONES DE R BASE

Dada la importancia e implicaciones que tienen los valores faltantes al trabajar en R, por default éste incluye diversas funciones para detectarlos.

La primera es is.na().

Está diseñada para preguntarle a R qué valores de una variable en particular son NAs.

El siguiente snippet ilustra cómo utilizarla:
Si copias y ejecutas el código de arriba en R, notarás que is.na() genera un vector de la misma longitud que el vector original (en este caso, Ozone) cuyos valores son TRUE (si el respectivo valor en el vector original es NA) y FALSE (en caso contrario).

Una segunda alternativa útil es summary().

Además de ofrecernos los valores del famoso resumen de cinco números de John Tukey, esta función también calcula el número de valores faltantes en una variable (y la media, de pilón).
Como ilustra el código de arriba, summary() puede utilizarse tanto para variables individuales como data frames o tibbles completos. 

La tercer opción es anyNA().

Esta función nos permite preguntarle a si al menos uno de los valores de cualquier variable en un data frame o tibble es NA:

2) 📦 {visdat}

Las funciones de R Base son útiles para mostrarte los "árboles" de NA.

Pero si lo que te interesa es analizar el "bosque", entonces necesitamos las funciones de otros paquetes.

Uno de ellos es {visdat}.

En particular, la función vis_mis() nos permite visualizar qué tan grave es el problema de valores faltantes en una base de datos.

La gráfica de abajo se genera al ejecutar el código vis_miss(x = airquality):
Nota cómo la gráfica indica tanto el porcentaje de valores faltantes de cada variable (etiquetas en la parte superior), así como de la base de datos en su conjunto (leyenda en la parte de abajo).

3) 📦 {naniar}

Las funciones del paquete {naniar} están diseñadas para "resumir, visualizar y manejar" NAs.

Vale la pena clavarse un rato en su página para entender qué hace cada función.

Aquí te dejo el resultado de ejecutar el código gg_miss_upset(data = airquality):

Este tipo de visualización se conoce como UpSet.

Las dos barras horizontales ilustran el número de valores faltantes en las variables que contienen uno o más de estos (en este caso, Ozone y Solar).

Las barras verticales representan el número de observaciones que tienen un valor faltante en cada variable, por separado, así como aquellas observaciones que tienen valores faltantes en las dos variables de forma simultánea.

Chulada.

Nota bene

Dato curioso: tanto {visdat} como {naniar} fueron desarrollados por Nicholas Tierne.

Gracias, Nick 🙌.



Suficiente por hoy, creo yo 🙂.

Te mando un saludo y nos leemos pronto,

~ Sebastián

Empty space, drag to resize
Postdata

Este es el cuarto número de
?R y pensé que ya era hora de construirle una casita a ésta y las futuras entregas del newsletter dentro de la página de Data Crunchers.

Así que me puse a chambear y terminé una primera versión.

La casita parece en obra negra y por ahora sólo verás el primer número de ?R, pero pronto la enchularé y subiré el resto.

Aipromis.