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:
%<>% group_by(Stratum) %>%
encuesta mutate( Income_imp = ifelse(is.na(Income_missin),
mean(Income_missin, na.rm = TRUE),
%>% data.frame()
Income_missin)) 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:
%>% summarise(
encuesta 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:
%>%group_by(Zone) %>% summarise(
encuesta 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).
%>%group_by(Sex) %>% summarise(
encuesta 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:
<- tidyr::gather(
dat_plot5 %>% dplyr::select(Zone,Sex,Income, Income_imp),
encuesta key = "Caso", value = "Income2", -Zone,-Sex)
<- ggplot(dat_plot5, aes(x = Income2, fill = Caso)) +
p1 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.
<- ggplot(dat_plot5, aes(x= Caso, y = Income2)) +
p1 geom_hline(yintercept = mean(encuesta$Income),
col = "red") + geom_boxplot() +
facet_grid(Zone~Sex) + theme_bw()
p1