11.2 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 al calcular la media.

La imputación por la media condicional 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.

Por ejemplo, si se tiene una variable numérica llamada “Ingreso” y una variable categórica llamada “Educación”, se podría utilizar la media de ingresos para cada nivel de educación para imputar los valores faltantes en la variable “Ingreso”. De esta manera, se tiene en cuenta la relación entre la educación y el ingreso al realizar la imputación.

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. Sin embargo, también puede ser más complicado y requiere más tiempo y recursos computacionales para implementar. A continuación, se ejemplifica la técnica de imputación utilizando la variable estrato (Stratum en la base de datos) 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_missin),
     mean(Income_missin, na.rm = TRUE),
     Income_missin)) %>% 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

A continuación, se decribe el código computacional utilizado:

  • encuesta %<>% group_by(Stratum) %>%: este código utiliza la función group_by de dplyr para agrupar las observaciones de la base de datos encuesta por los niveles de la variable Stratum. El operador %>% se utiliza para concatenar este código con el siguiente código en una sola cadena de operaciones.

  • mutate: esta función de dplyr se utiliza para crear una nueva columna en la base de datos encuesta con la imputación de los valores faltantes.

  • Income_imp = ifelse(is.na(Income_missin), mean(Income_missin, na.rm = TRUE), Income_missin)): esta línea utiliza la función ifelse para asignar el valor imputado a la columna Income_imp en la base de datos encuesta. Si un valor en la columna Income_missin es NA (es decir, faltante), se reemplaza con la media aritmética de los valores no faltantes en Income_missin dentro del grupo correspondiente. Si no es NA, se mantiene el valor original.

  • sum(is.na(encuesta$Income_imp)): esta línea cuenta el número de valores faltantes en la nueva columna Income_imp de la base de datos encuesta utilizando la función sum y is.na.

  • encuesta %<>% mutate( Income_imp = ifelse(is.na(Income_imp), promedio, Income_imp)): este código utiliza la función mutate para crear una nueva columna en la base de datos encuesta y reemplazar cualquier valor faltante en la columna Income_imp con la media aritmética de los valores no faltantes en Income_missin. El valor de la media aritmética se almacena en una variable llamada promedio. Si un valor en la columna Income_imp no es NA, se mantiene el valor original.

  • sum(is.na(encuesta$Income_imp)): esta línea cuenta el número de valores faltantes en la nueva columna Income_imp de la base de datos encuesta utilizando la función sum y is.na.

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

Para poder comparar los resultados, calculemos el sesgo relativo de la imputación el cual se calcula como sigue:

\[ BR=\frac{Income-Income_{imp}}{Income}\times100\% \]

100*(604.2494- 611.545)/604.2494
## [1] -1.207382

Como se puede observar, el sesgo relativo para el primedio de los ingresos es menor al 1.5%. Ahora bien, siguiendo la misma idea, el sesgo relativo para la desviación es:

100*(513.1078- 488.7209)/513.1078
## [1] 4.752783

Lo que generó un sesgo relativo para la desviación estándar inferior al 5%. Ahora bien, 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%:

100*(469.1217- 477.9042)/469.1217
## [1] -1.872115

y para la zona urbana de 0.8%.:

100*(730.8793- 736.7815)/730.8793
## [1] -0.8075478

En ambos casos se observa una buena imputación de los ingresos. Ejercicio similar se puede realizar para sexo (Se le deja al lector realizar el cálculo del sesgo relativo).

encuesta %>%group_by(Sex) %>%  summarise(
  Income_ = mean(Income),
  Income_sd = sd(Income),
  Income_imp_ = mean(Income_imp),
  Income_imp_sd = sd(Income_imp))
Sex Income_ Income_sd Income_imp_ Income_imp_sd
Female 589.2330 504.3041 600.3235 486.5818
Male 621.7771 522.9428 624.6431 491.1625

Ahora bien, para observar la distribución de los datos imputados en comparación con los no imputado 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 distribunció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