Github

¿Que es la imputación de datos?

Consiste en la eliminación o sustitución de datos incompletos.

Métodos de Imputación

Existen varios métodos de imputación de datos, para la demostración de estos métodos se usará un dataset llamado airquality.

data(airquality)
head(airquality)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6

1. Eliminación de Casos

En la eliminación de casos existen 3 criterios para la justificación en la eliminación de datos.

  1. Menos del 5%: Se eliminan las filas con una pequeña justificación.

  2. Entre un 5% y 15%: Se puede documentar y eliminar los registro con alguna justificación moderada.

  3. Más de un 15%: Se debe validar si debemos mantener o eliminar la columna e investigar cuál es la causa que provoca que existan tantos datos nulos.

#Porcentaje de NA's
colSums(is.na(airquality))/nrow(airquality)
##      Ozone    Solar.R       Wind       Temp      Month        Day 
## 0.24183007 0.04575163 0.00000000 0.00000000 0.00000000 0.00000000

Se observa que la variable Solar.R tiene un porcentaje de NA’s de 4.57%, entonces es viable eliminar las filas que contienen NA’s.

#Eliminar NA's 
airquality <- airquality[!is.na(airquality$Solar.R),]
#Verificación porcentaje de NA's
colSums(is.na(airquality))/nrow(airquality)
##    Ozone  Solar.R     Wind     Temp    Month      Day 
## 0.239726 0.000000 0.000000 0.000000 0.000000 0.000000

Por último, se eliminaron los NA’s de la variable Solar.R.

2. Sustituir por la Media, Mediana o Moda

Para la realización de la sustitución usaremos la librería tidyverse para manipular los datos.

suppressMessages(library(tidyverse))

Moda

Imputa por la moda de los datos observados.

#Función para calcular moda
mode <- function(x) {
  return(as.numeric(names(which.max(table(x)))))
}

# Imputación por Moda
airqualityModa <- airquality %>% 
  mutate("Ozone" = ifelse(is.na(airquality$Ozone),mode(airquality$Ozone), airquality$Ozone))

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada,sin embargo se observa incosistencias en la imputación por moda pues no se ajusta a la data original.

#Grafica Imputación por media 
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Moda", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityModa$Ozone),col = "red") # Imputación

Mediana

Imputa por la mediana aritmética de los datos observados.

# Imputación por Mediana
airqualityMediana <- airquality %>% 
  mutate("Ozone" = ifelse(is.na(airquality$Ozone),median(airquality$Ozone, na.rm = T), airquality$Ozone))

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada,sin embargo se observa incosistencias en la imputación por mediana pues no se ajusta a la data original.

#Grafica Imputación por media 
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Mediana", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityMediana$Ozone),col = "red") # Imputación

Media

Imputa por la media aritmética de los datos observados.

# Imputación por Media
airqualityMedia <- airquality %>% 
  mutate("Ozone" = ifelse(is.na(airquality$Ozone),mean(airquality$Ozone, na.rm = T), airquality$Ozone))

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada,sin embargo se observa incosistencias en la imputación por media pues no se ajusta a la data original.

#Grafica Imputación por media 
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Media", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityMedia$Ozone),col = "red") # Imputación

3. Regresión Lineal

Imputa el “mejor valor” según el modelo de regresión lineal, también conocido como imputación de regresión. Para la realización de la imputación usaremos la librería mice.

suppressMessages(library(mice))
# Imputación por Regresión lineal
Regresionlineal = mice::complete(mice(airquality %>% select(Ozone,Solar.R), method = "norm.predict")) #Imputación por media
airqualityRegresionlineal <- airquality %>% 
  mutate("Ozone" = Regresionlineal$Ozone)

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada, sin embargo se observa que la imputación por Regresión Lineal se ajusta bien a la data original pero no del todo.

#Grafica Imputación por media 
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Regresión lineal", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityRegresionlineal$Ozone),col = "red") # Imputación

4. Regresión Lineal con Bootstrap

Imputa datos faltantes usando regresión lineal con bootstrap

# Regresión lineal con bootstrap
Regresionlinealbootstrap = mice::complete(mice(airquality %>% select(Ozone,Solar.R), method = "norm.boot", seed = 28))
airqualityRegresionlinealbootstrap <- airquality %>% 
  mutate("Ozone" = Regresionlinealbootstrap$Ozone)

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada, sin embargo se observa que la imputación por Regresión Lineal con Bootstrap se ajusta a la data original.

#Grafica Imputación por Regresión lineal con bootstrap
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Regresión Lineal con Bootstrap", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityRegresionlinealbootstrap$Ozone),col = "red") # Imputación

5. Regresión Estocástica

Imputa datos faltantes univariados mediante análisis de regresión lineal sin tener en cuenta la incertidumbre de los parámetros del modelo.

#Imputación por Regresión Estocástica
RegresionEstocastica = mice::complete(mice(airquality %>% select(Ozone,Solar.R),method = "norm.nob", seed = 290920))
airqualityRegresionEstocastica <- airquality %>% 
  mutate("Ozone" = RegresionEstocastica$Ozone)

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada, sin embargo se observa que la imputación por Regresión Estocástica se ajusta a la data original pero no del todo.

#Grafica Imputación por Regresión Estocástica
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Regresión Estocástica", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityRegresionEstocastica$Ozone),col = "red") # Imputación

6. Last Observation Carried Forward (LOCF)

El método de la última observación transferida es una forma de imputar valores para las observaciones que faltan. Para el enfoque de la última observación realizada (LOCF), los valores faltantes se reemplazan por el último valor observado de esa variable para cada individuo, independientemente de cuándo ocurrió. Para la realización de la imputación usaremos la librería dendextend.

suppressMessages(library(dendextend))
# Imputación por LOCF
airqualityLOCF <- airquality %>% 
  mutate("Ozone" = na_locf(airquality$Ozone))

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada,sin embargo se observa incosistencias en la imputación por LOCF pues no se ajusta a la data original.

#Grafica Imputación por LOCF
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación LOCF", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityLOCF$Ozone),col = "red") # Imputación

7. Random Forests

Imputa los datos faltantes mediante Random Forests.

#Imputación por Random Forests
RandomForests = mice::complete(mice(airquality %>% select(Ozone,Solar.R),method = "rf", seed = 290920))
airqualityRandomForests <- airquality %>% 
  mutate("Ozone" = RandomForests$Ozone)

El siguiente gráfico muestra la imputación de la variable Ozone, el color negro respresenta la data original y la roja es la data imputada, sin embargo se observa que la imputación por Random Forests se ajusta a la data original.

#Grafica Imputación por Random Forests
plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación Random Forests", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityRandomForests$Ozone),col = "red") # Imputación

Comparación

Por último, los métodos de imputación que más se parecen a la data original son Imputación por Random Forests y Regresión Lineal con Bootstrap.

plot(density(airquality$Ozone,na.rm = T),col = "black", main="Imputación", ylab = "Densidad", xlab = "Ozone") #Original 
lines(density(airqualityRandomForests$Ozone),col = "red") # Imputación Random Forests
lines(density(airqualityRegresionlinealbootstrap$Ozone),col = "blue") # Imputación Regresion lineal bootstrap
legend("topright",        
       legend = c("Original", "Random Forests","Regresion Lineal Bootstrap"), 
       col = c("black", "red", "blue"),         
       lwd = 2) 

Bibliografía