10.4 Imputación por Hot-Deck

Esta imputación consiste en reemplazar los valores faltantes de una o más variables para un no respondiente (llamado receptor) con valores observados de un respondiente (el donante) similar al no respondiente con respecto a las características observadas en ambos casos. La técnica se basa en la idea de que las unidades similares pueden tener valores similares en las variables de interés. En este enfoque, se selecciona una observación donante que sea similar a la observación receptora en términos de características relevantes (por ejemplo, edad, género, ubicación geográfica, etc.), y se utiliza su valor observado para imputar el valor faltante en la observación receptora.

El término Hot-Deck hace referencia a una tarjeta perforada que se utilizaba en los primeros sistemas informáticos para almacenar y recuperar datos. Esta es una técnica relativamente simple y eficaz para imputar valores faltantes en conjuntos de datos pequeños o medianos, y se utiliza comúnmente en encuestas y estudios de investigación social. Sin embargo, puede ser menos efectiva en conjuntos de datos grandes o complejos, donde puede ser difícil encontrar observaciones similares o donde las características relevantes son difíciles de definir o medir de manera confiable.

A continuación, se presenta un código computacional que ejemplifica, para los datos que estamos usando en el capítulo, el uso del método.

donante <- which(!is.na(encuesta$Income_missing))
receptor <- which(is.na(encuesta$Income_missing))
encuesta$Income_imp <- encuesta$Income_missing

set.seed(1234)
for (ii in receptor) {
  don_ii <- sample(x = donante, size = 1)
  encuesta$Income_imp[ii] <- encuesta$Income_missing[don_ii]
}

sum(is.na(encuesta$Income_imp))
## [1] 0

En el código mostrado anteriormente se describe a continuación, la primera línea del código selecciona las observaciones que no tienen valores faltantes en la variable Income_missing, la segunda línea selecciona las observaciones que tienen valores faltantes en la variable Income_missing; luego se crea una nueva variable Income_imp para almacenar los valores imputados. Finalmente, se utiliza un bucle for para iterar a través de cada observación receptora. Dentro del bucle, se utiliza la función sample para seleccionar una observación donante aleatoria de entre las observaciones que no tienen valores faltantes en la variable Income_missing.

Una vez realizada la imputación, se calcula la media y la desviación de los datos completos e imputados:

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 618.2937 528.2157

Como en los métodos anteriores, el sesgo relativo de la imputación fue de 2.3%. Haciendo el mismo ejercicio, pero esta vez desagregada por zona tenemos:

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 503.7127 368.9137
Urban 730.8793 609.0304 725.6691 623.9875

El sesgo relativo de la estimación en la zona rural es de 7.4% y en al zona urbana es de 0.7%. El mismo ejercicio se puede realizar por sexo:

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 602.8075 503.0951
Male 621.7771 522.9428 636.3699 555.8522

A continuación, se muestra la gráfica de la distribución de los datos, tanto los completos como los imputados, observándose que la distribución de los datos imputados es muy similar a la de los datos no imputados:

dat_plot6 <- tidyr::gather(
  encuesta %>% dplyr::select(Zone, Sex, Income, Income_imp),
  key = "Caso",
  value = "Income2",-Zone,-Sex
)

p1 <- ggplot(dat_plot6, 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