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_missing
es 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