Consiste en la eliminación o sustitución de datos incompletos.
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
En la eliminación de casos existen 3 criterios para la justificación en la eliminación de datos.
Menos del 5%: Se eliminan las filas con una pequeña justificación.
Entre un 5% y 15%: Se puede documentar y eliminar los registro con alguna justificación moderada.
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.
Para la realización de la sustitución usaremos la librería
tidyverse para manipular los datos.
suppressMessages(library(tidyverse))
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
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
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
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
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
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
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
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
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)