10.3 Imputación por la media condicional

El método de imputación por la media condicional es una técnica utilizada en el análisis de datos para tratar valores faltantes o perdidos en una variable numérica. A diferencia del método de imputación por la media no condicional, el método de imputación por la media condicional tiene en cuenta otras variables en el conjunto de datos. Esta técnica se basa en la idea de que la media de una variable puede variar en función de los valores de otras variables. Por lo tanto, en lugar de simplemente reemplazar los valores faltantes con la media aritmética de la variable completa, se utiliza la media de la variable para grupos de observaciones que tienen valores similares en otras variables. El método de imputación por la media condicional puede ser más preciso que el método de imputación por la media no condicional en situaciones en las que las variables están correlacionadas o cuando hay patrones de valores faltantes en los datos.

A continuación, se ejemplifica la técnica de imputación utilizando la variable estrato para hacer el cálculo de los promedios por cada uno de los estratos y así poder imputar los datos faltantes, asumiendo que hay una relación directa entre los estratos y los ingresos de los hogares:

encuesta %<>% group_by(Stratum) %>%
  mutate(Income_imp = ifelse(
    is.na(Income_missing),
    mean(Income_missing, na.rm = TRUE),
    Income_missing
  )) %>%
  data.frame()

sum(is.na(encuesta$Income_imp))
## [1] 0
encuesta %<>%
  mutate(Income_imp = ifelse(is.na(Income_imp),
                             promedio, Income_imp))

sum(is.na(encuesta$Income_imp))
## [1] 0

El anterior código utiliza la función group_by para agrupar las observaciones de la base de datos de la encuesta por los niveles de la variable Stratum. Luego, se asigna el valor imputado a la columna Income_imp en la base de datos encuesta. Si un valor en la columna Income_missinges faltante, se reemplaza con la media aritmética de los valores no faltantes en Income_missing dentro del estrato correspondiente. Si no es NA, se mantiene el valor original. A continuación, se calculan las medias y desviaciones estándar tanto para los datos imputados como los originales y así poder comparar le efecto de la imputación realizada:

encuesta %>%
  summarise(
    Income_ = mean(Income),
    Income_sd = sd(Income),
    Income_imp_ = mean(Income_imp),
    Income_imp_sd = sd(Income_imp)
  )
Income_ Income_sd Income_imp_ Income_imp_sd
604.2494 513.1078 611.545 488.7209

En este escenario, el sesgo relativo para el promedio de los ingresos es menor al 1.5%. Ahora bien, siguiendo la misma idea, el sesgo relativo para la desviación es cercano al 5%. Si se realiza la imputación utilizando la media condicional, agrupando por la variable zona, se tienen los siguientes resultados:

encuesta %>%
  group_by(Zone) %>%
  summarise(
    Income_ = mean(Income),
    Income_sd = sd(Income),
    Income_imp_ = mean(Income_imp),
    Income_imp_sd = sd(Income_imp)
  )
Zone Income_ Income_sd Income_imp_ Income_imp_sd
Rural 469.1217 336.5861 477.9042 305.5101
Urban 730.8793 609.0304 736.7815 585.6550

Realizando el mismo ejercicio anterior, se obtienen sesgos relativos para la media de los ingresos para la zona rural de 1.87% y para la zona urbana de 0.8%. En ambos casos se observa una buena imputación de los ingresos. Ahora bien, para observar la distribución de los datos imputados en comparación con los no imputados se realizan las siguientes gráficas:

dat_plot5 <- tidyr::gather(
  encuesta %>%
    dplyr::select(Zone, Sex, Income, Income_imp),
  key = "Caso",
  value = "Income2",
  -Zone,
  -Sex
)

p1 <- ggplot(dat_plot5, aes(x = Income2, fill = Caso)) +
  geom_density(alpha = 0.2) +
  theme_bw() +
  theme(legend.position = "bottom") +
  geom_vline(xintercept = mean(encuesta$Income),
             col = "red") +
  geom_vline(xintercept = mean(encuesta$Income_imp),
             col = "blue")

p1

Se puede observar que, de manera general, la distribución de las observaciones imputadas y originales tienen un comportamiento mejor que con la media no condicional. Si se observa ahora la distribución de los datos por zona y sexo, se puede observar también una buena imputación de las observaciones.

p1 <- ggplot(dat_plot5, aes(x = Caso, y = Income2)) +
  geom_hline(yintercept = mean(encuesta$Income),
             col = "red") +
  geom_boxplot() +
  facet_grid(Zone ~ Sex) +
  theme_bw()

p1