logo

Introducción

Los datos faltantes se entienden como valores que debían haberse registrado, pero no lo hicieron. Es importante comprender cómo lidiar con ellos, ya que pueden tener efectos muy relevantes en los análisis que se realicen.

La pérdida de datos necesariamente conlleva a la pérdida de información y por lo tanto, a una menor precisión en la estimación de los parámetros de interés.

Algunos de los problemas causados por datos faltantes:

  • Limitar la capacidad para realizar importantes tareas de ciencia de datos (conversión de tipos de datos o visualización).
  • Reducir la validez estadística de los modelos, esto aumenta la probabilidad del Error de tipo II. (No rechazar una hipótesis nula cuando es falsa).
  • Distorsionar la validez de las conclusiones.

Clasificación de datos faltantes

  • Datos faltantes completamente aleatorios (MCAR): la existencia de valores perdidos es independiente de los datos, por ejemplo, cuando se toma una muestra aleatoria de una población donde cada individuo tiene la misma probabilidad de pertenecer a la muestra, los datos faltantes de los miembros de la muestra con MCAR. La frecuencia con la que esto acontece es casi nula.

  • Datos faltantes aleatorios(MAR): la probabilidad de ser un dato faltante es la misma dentro de los grupos definidos por los datos observados. Por ejemplo, cuando al tomar la muestra de la población se considera, la probabilidad de ser incluida depende de alguna propiedad conocida. Este tipo de datos faltantes es el más común y más usado.

  • Datos faltantes no aleatorios (MNAR): la probabilidad de ser un dato faltante se debe a razón desconocidas. Tomando como caso de la opinión pública donde las personas con argumentos débiles responden con una menor frecuencia creando espacios en blanco o dejando respuestas vacías.

Posibles tratamientos para datos faltantes

  1. Eliminar datos faltantes:
  • Se recomienda cuando un registro tiene más del 40%-50% de los datos faltantes, ya que la información restante puede no ser representativa.
  • También se justifica eliminar si los valores ausentes afectan directamente a la variable de interés.
  1. Ignorar datos faltantes:

    • Se puede ignorar si el porcentaje de datos faltantes en una variable es menor al 5% del total de observaciones.
    • En modelos estadísticos, si los datos faltan completamente al azar (MCAR, por sus siglas en inglés), muchos métodos pueden manejar la ausencia sin necesidad de imputación.
  2. Imputar datos faltantes:

  • Si los datos faltantes son entre 5% y 40%, la imputación puede ser una buena alternativa.
  • Métodos de imputación como la media, mediana, regresión, KNN o algoritmos más avanzados con la librería mice pueden usarse dependiendo de la estructura de los datos y el patrón de ausencia.

Imputación de datos faltantes

Existen diversos métodos para realizar imputación. Estos métodos consisten en estimar los valores faltantes por medio de la información del conjunto completo de variables o bien de algunas variables especialmente seleccionadas. Deben aplicarse con gran precaución porque pueden introducir relaciones inexistentes en los datos reales.

Los principales métodos de imputación de datos faltantes se pueden clasificar en las siguientes categorías:

1. Imputación univariada (basada en una sola variable)

  • Imputación por la media, mediana o moda: se reemplaza el valor faltante por la media (para datos continuos), la mediana (si hay sesgo) o la moda (para datos categóricos).
  • Imputación con un valor constante: se asigna un valor fijo predefinido. Por ejemplo, si la variable es continua se asigna “999” y si la variable es categórica, se acostumbra colocar “desconocido”.
  • Regresión simple: se ajusta una regresión simple con la variable faltante como dependiente y se predicen los valores.

2. Imputación multivariada (usando múltiples variables)

  • Regresión múltiple: se estima el valor faltante en función de otras variables explicativas mediante regresión lineal múltiple o logística.
  • k-vecinos más cercanos (KNN): se usa la media ponderada de los valores más cercanos en el espacio de características.
  • Análisis de Componentes Principales (PCA): Se utilizan técnicas de reducción de dimensión para estimar los valores faltantes.

3. Métodos basados en modelos probabilísticos

  • Imputación por máxima verosimilitud: se asumen distribuciones paramétricas para modelar los datos faltantes.
  • MICE (Multivariate Imputation by Chained Equations): Realiza imputaciones múltiples basadas en modelos de regresión iterativa para diferentes variables.

4. Imputación basada en aprendizaje automático

  • Árboles de Decisión: se construye un árbol de decisión donde la variable con datos faltantes es la variable objetivo y las demás variables sirven como predictores.
  • Random Forest: utiliza árboles de decisión para predecir los valores faltantes.
  • XGBoost Imputation: métodos de boosting pueden aplicarse para mejorar la imputación.
  • Autoencoders: redes neuronales profundas pueden aprender representaciones latentes para reconstruir datos faltantes.

Ejemplos en R

Ejemplificaremos los diferentes métodos de imputación con ayuda de la base de datos denominada Niveles_tratados.

Cargamos los datos:

Data <- read.csv("Niveles_tratados.csv",header=T,na.strings=" ")

Visualizaciones de datos faltantes

library(visdat)
vis_miss(Data)

# Datos faltantes por columna
library(naniar)
gg_miss_var(Data)

1. Imputación univariada

Imputación con la media y la moda

Realizaremos imputaciones para cada variable por separado.

library(mice)
# Imputación con la media
Imput_mean <- mice(Data,method="mean",print=F) # variables continuas
Complete_mean <- mice::complete(Imput_mean)  
# Imputación con la moda 
Imput_mode <- mice(Data,method="cart",print=FALSE) # variables categóricas (Árboles de decisión)
Complete_mode <- mice::complete(Imput_mode)

Ahora comparamos el comportamiento de los datos originales y los datos imputados.

library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)

### 1. Para Variables Continuas
# Convertir los datos en formato largo
data_long <- bind_rows(
  Data %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Original"),
  Complete_mean %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Imputado")) %>%
  pivot_longer(cols = c(PM2.5, CN, SO2), names_to = "Variable", values_to = "Valor")

# Crear el gráfico de densidad
p1 <- ggplot(data_long, aes(x = Valor, color = Origen, fill = Origen, text = paste("Origen:", Origen))) +
  geom_density(alpha = 0.2) +
  facet_wrap(~Variable, scales = "free") + 
  labs(title = "Comportamiento de la Imputación", x = "Variables", y = "Densidad") +
  theme_minimal()

ggplotly(p1, tooltip = c("text", "x", "y"))
### 2. Para Variable Categórica
# Crear un data.frame con los conteos antes y después de la imputación
data_cat <- bind_rows(
  Data %>% select(Nivel_Contaminacion) %>% mutate(Origen = "Original"),
  Complete_mode %>% select(Nivel_Contaminacion) %>% mutate(Origen = "Imputado")) %>%
  filter(!is.na(Nivel_Contaminacion))  # Eliminar NA de los datos originales para comparación justa

# Crear el gráfico de barras corregido
p2 <- ggplot(data_cat, aes(x = Nivel_Contaminacion, fill = Origen, text = paste("Origen:", Origen))) +
  geom_bar(position = "dodge") +
  labs(title = "", x = "Nivel de Contaminación",y = "Frecuencia") +
  theme_minimal()


ggplotly(p2,tooltip = c("text", "x", "y"))
Imputación con regresión simple y boostrap
# Imputación con regresión predictiva (sin variabilidad)
Imput_reg1 <- mice(Data, method = "norm.predict", print = FALSE)
Complete_reg1 <- mice::complete(Imput_reg1)

# Imputación con regresión y bootstrap (con variabilidad)
Imput_reg2 <- mice(Data, method = "norm.boot", print = FALSE)
Complete_reg2 <- mice::complete(Imput_reg2)

Ahora comparamos el comportamiento de los datos originales y los datos imputados.

library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)

# Convertir los datos en formato largo
data_long <- bind_rows(
  Data %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Original"),
  Complete_reg1 %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Regresión Predictiva"),
  Complete_reg2 %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Regresión Bootstrap")) %>%
  pivot_longer(cols = c(PM2.5, CN, SO2), names_to = "Variable", values_to = "Valor")

# Crear gráfico de densidad 
p <- ggplot(data_long, aes(x = Valor, color = Origen, fill = Origen, text = paste("Origen:", Origen))) +
  geom_density(alpha = 0.2) +
  facet_wrap(~Variable, scales = "free") + 
  labs(title = "Comportamiento de la Imputación", x = "Variables", y = "Densidad") +
  theme_minimal()

# Convertir a gráfico interactivo sin duplicaciones en el tooltip
ggplotly(p, tooltip = c("text", "x", "y"))

1. Imputación multivariada

En este ejemplo, se aplicaron tres métodos de imputación multivariada para estimar los valores faltantes en los datos. Se utilizó regresión múltiple (norm.predict), que predice valores basándose en una ecuación lineal, MICE (pmm), que genera imputaciones iterativas para cada variable considerando la relación con las demás, y Random Forest (rf), que utiliza múltiples árboles de decisión para estimar los valores ausentes.

library(ranger)
# Imputación con Regresión Múltiple 
Imput_reg_mult <- mice(Data, method = "norm.predict", m = 5, print = FALSE)
Complete_reg_mult <- mice::complete(Imput_reg_mult)

# Imputación con MICE
Imput_mice <- mice(Data, method = "pmm", m = 5, print = FALSE)  
Complete_mice <- mice::complete(Imput_mice)

# Imputación con Random Forest
Imput_rf <- mice(Data, method = "rf", m = 5, print = FALSE)
Complete_rf <- mice::complete(Imput_rf)

Ahora comparamos el comportamiento de los datos originales y los datos imputados.

# Convertir los datos imputados a formato largo 
data_long <- bind_rows(
  Data %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Original"),
  Complete_reg_mult %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Regresión Múltiple"),
  Complete_mice %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "MICE"),
  Complete_rf %>% select(PM2.5, CN, SO2) %>% mutate(Origen = "Random Forest")) %>%
  pivot_longer(cols = c(PM2.5, CN, SO2), names_to = "Variable", values_to = "Valor")

# Crear gráfico de densidad 
p <- ggplot(data_long, aes(x = Valor, color = Origen, fill = Origen, text = paste("Método:", Origen))) +
  geom_density(alpha = 0.2) +
  facet_wrap(~Variable, scales = "free") + 
  labs(title = "Comparación de Imputación Multivariada", x = "Variables", y = "Densidad") +
  theme_minimal()

# Convertir a gráfico interactivo 
ggplotly(p, tooltip = c("text", "x", "y"))