10.6 Imputación por el vecino más cercano con regresión
An las secciones anteriores se realizaron las descripciones delas técnicas: vecino más cercano e imputación vía regresión, a continuación, se presentan los pasos que se deben tener en cuenta para realizar la imputación utilizando el vecino más cernado mediante una regresión:
- Paso 1: Ajustar un modelo de regresión.
- Paso 2: Realizar la predicción de los valores observados y no observados.
- Paso 3: Comparar las predicciones obtenidas para los valores observados y no observados.
- Paso 4: Para la \(i\)-ésima observación identificar el donante con la menor distancia al receptor.
- Paso 5: Reemplazar el valor faltante con la información proveniente del donante.
NOTA Se toma es la información observada en el donante.
A continuación, se ejemplifica la técnica imputando los ingresos en los hogares realizando un modelo en el cual se toman como covariables el sexo, la zona y los gastos:
encuesta$Income_imp <- encuesta$Income_missin
encuesta$Employment_imp <- encuesta$Employment_missin
encuesta_obs <- filter(encuesta, !is.na(Income_missin))
encuesta_no_obs <- filter(encuesta, is.na(Income_missin))
mod <- lm(Income ~ Zone + Sex + Expenditure, data = encuesta_obs)Luego, se predicen los valores observados y no observados con el modelo ajustado anteriormente y se imputa el valor faltante calculando las diferencias entre las predicciones de los datos observados y no observados:
pred_Obs <- predict(mod, encuesta_obs)
pred_no_Obs <- predict(mod, encuesta_no_obs)
for(ii in 1:nrow(encuesta_no_obs)){
don_ii <- which.min(abs(pred_no_Obs[ii] - pred_Obs))
encuesta_no_obs$Income_imp[[ii]] <- encuesta_obs$Income_missin[[don_ii]]
encuesta_no_obs$Employment_imp[[ii]] <- encuesta_obs$Employment_missin[[don_ii]]
}
encuesta <- bind_rows(encuesta_obs,encuesta_no_obs)Una vez imputada la información, se puede chequear el pocentaje de datos faltantes que habían y una vez impuatado, cómo cambia la distribución:
| Var1 | Freq |
|---|---|
| Unemployed | 0.0340607 |
| Inactive | 0.2990953 |
| Employed | 0.4667376 |
| NA | 0.2001064 |
| Var1 | Freq |
|---|---|
| Unemployed | 0.0399148 |
| Inactive | 0.3736030 |
| Employed | 0.5864822 |
| NA | 0.0000000 |
El mismo ejercicio se puede realizar por zona:
kable(
prop.table( table(encuesta$Zone, encuesta$Employment_missin, useNA = "a")) %>% addmargins()
)| Unemployed | Inactive | Employed | NA | Sum | |
|---|---|---|---|---|---|
| Rural | 0.0117084 | 0.1506120 | 0.2208622 | 0.1005854 | 0.483768 |
| Urban | 0.0223523 | 0.1484832 | 0.2458755 | 0.0995210 | 0.516232 |
| NA | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.000000 |
| Sum | 0.0340607 | 0.2990953 | 0.4667376 | 0.2001064 | 1.000000 |
| Unemployed | Inactive | Employed | NA | Sum | |
|---|---|---|---|---|---|
| Rural | 0.0138371 | 0.1905269 | 0.2794039 | 0 | 0.483768 |
| Urban | 0.0260777 | 0.1830761 | 0.3070782 | 0 | 0.516232 |
| NA | 0.0000000 | 0.0000000 | 0.0000000 | 0 | 0.000000 |
| Sum | 0.0399148 | 0.3736030 | 0.5864822 | 0 | 1.000000 |
Y por sexo:
| Unemployed | Inactive | Employed | NA | Sum | |
|---|---|---|---|---|---|
| Female | 0.0106440 | 0.2277807 | 0.2011708 | 0.0989888 | 0.5385844 |
| Male | 0.0234167 | 0.0713145 | 0.2655668 | 0.1011176 | 0.4614156 |
| NA | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
| Sum | 0.0340607 | 0.2990953 | 0.4667376 | 0.2001064 | 1.0000000 |
| Unemployed | Inactive | Employed | NA | Sum | |
|---|---|---|---|---|---|
| Female | 0.0122406 | 0.2730176 | 0.2533262 | 0 | 0.5385844 |
| Male | 0.0276743 | 0.1005854 | 0.3331559 | 0 | 0.4614156 |
| NA | 0.0000000 | 0.0000000 | 0.0000000 | 0 | 0.0000000 |
| Sum | 0.0399148 | 0.3736030 | 0.5864822 | 0 | 1.0000000 |
Por último, se calcula la media de los ingresos y su desviación estándar para los datos completos e imputado como se ha realizado anteriormente:
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 | 608.2746 | 515.5829 |
De la anterior imputación se puede observar que, la diferencia entre los datos reales y los imputados es cercano a 4 unidades monetarias.
El mismo ejercicio realizado por zona arroja 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 | 476.0558 | 342.6870 |
| Urban | 730.8793 | 609.0304 | 732.1786 | 611.0504 |
y se puede observar también que la diferencia entre los ingresos reales y los estimados en las dos zonas con inferiores a 6 unidades monetarias.
Por sexo, los resultados son los siguientes:
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 | 592.9922 | 508.4371 |
| Male | 621.7771 | 522.9428 | 626.1128 | 523.5303 |
Teniendo como diferencia máxima para la variable ingreso de 5 unidades monetarias. A continuación, se presentan la gráfica distribucional del ingreso real y del ingreso imputado por el método del vecino más cercano mediante un modelo. Se puede observar que, las dos distribuciones con muy similares.
dat_plot9 <- tidyr::gather(
encuesta %>% dplyr::select(Zone,Sex,Income, Income_imp),
key = "Caso", value = "Income2", -Zone,-Sex)
p1 <- ggplot(dat_plot9, 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")
p1Realizando ahora unos boxplot por sexo y zona para la variable ingreso tanto la completa como la imputada se tiene:
p1 <- ggplot(dat_plot9, aes(x= Caso, y = Income2)) +
geom_hline(yintercept = mean(encuesta$Income),
col = "red") + geom_boxplot() +
facet_grid(Zone~Sex) + theme_bw()
p1
Se puede observar que los boxplot son muy similares.