11.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:
$Income_imp <- encuesta$Income_missin
encuesta$Employment_imp <- encuesta$Employment_missin
encuesta<- filter(encuesta, !is.na(Income_missin))
encuesta_obs <- filter(encuesta, is.na(Income_missin))
encuesta_no_obs <- lm(Income ~ Zone + Sex + Expenditure, data = encuesta_obs) mod
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:
<- predict(mod, encuesta_obs)
pred_Obs <- predict(mod, encuesta_no_obs)
pred_no_Obs
for(ii in 1:nrow(encuesta_no_obs)){
<- which.min(abs(pred_no_Obs[ii] - pred_Obs))
don_ii $Income_imp[[ii]] <- encuesta_obs$Income_missin[[don_ii]]
encuesta_no_obs$Employment_imp[[ii]] <- encuesta_obs$Employment_missin[[don_ii]]
encuesta_no_obs
}
<- bind_rows(encuesta_obs,encuesta_no_obs) encuesta
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:
kable(
prop.table(table(encuesta$Employment_missin, useNA = "a"))
)
Var1 | Freq |
---|---|
Unemployed | 0.0340607 |
Inactive | 0.2990953 |
Employed | 0.4667376 |
NA | 0.2001064 |
kable(
prop.table(table(encuesta$Employment_imp, useNA = "a"))
)
Var1 | Freq |
---|---|
Unemployed | 0.0399148 |
Inactive | 0.3730708 |
Employed | 0.5870144 |
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 |
kable(
prop.table( table(encuesta$Zone, encuesta$Employment_imp,useNA = "a")) %>% addmargins()
)
Unemployed | Inactive | Employed | NA | Sum | |
---|---|---|---|---|---|
Rural | 0.0138371 | 0.1905269 | 0.2794039 | 0 | 0.483768 |
Urban | 0.0260777 | 0.1825439 | 0.3076104 | 0 | 0.516232 |
NA | 0.0000000 | 0.0000000 | 0.0000000 | 0 | 0.000000 |
Sum | 0.0399148 | 0.3730708 | 0.5870144 | 0 | 1.000000 |
Y por sexo:
kable(
prop.table( table(encuesta$Sex, encuesta$Employment_missin, useNA = "a")) %>% addmargins()
)
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 |
kable(
prop.table( table(encuesta$Sex, encuesta$Employment_imp,useNA = "a")) %>% addmargins()
)
Unemployed | Inactive | Employed | NA | Sum | |
---|---|---|---|---|---|
Female | 0.0122406 | 0.2724854 | 0.2538584 | 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.3730708 | 0.5870144 | 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:
%>% 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 | 608.0657 | 515.5472 |
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:
%>%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 | 476.0558 | 342.6870 |
Urban | 730.8793 | 609.0304 | 731.7739 | 611.0741 |
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:
%>%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 | 592.6043 | 508.3581 |
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.
<- tidyr::gather(
dat_plot9 %>% dplyr::select(Zone,Sex,Income, Income_imp),
encuesta key = "Caso", value = "Income2", -Zone,-Sex)
<- ggplot(dat_plot9, 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
Realizando ahora unos boxplot por sexo y zona para la variable ingreso tanto la completa como la imputada se tiene:
<- ggplot(dat_plot9, aes(x= Caso, y = Income2)) +
p1 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.