10.8 Imputación múltiple.

La imputación múltiple consiste en crear múltiples copias del conjunto de datos, donde los valores faltantes en cada copia son imputados utilizando modelos estadísticos. Estos modelos se basan en las relaciones entre las variables en el conjunto de datos y se utilizan para estimar los valores faltantes de manera plausible. Luego de que se han creado múltiples copias completas del conjunto de datos, se realizan análisis separados en cada copia para generar resultados. Los resultados de cada análisis se combinan para obtener un único resultado final que refleje la incertidumbre causada por la imputación de los valores faltantes.

La imputación múltiple es una técnica poderosa para lidiar con los datos faltantes, ya que proporciona resultados más precisos y menos sesgados en comparación con otros métodos que simplemente eliminan las observaciones con valores faltantes. Sin embargo, la imputación múltiple es un proceso computacionalmente intensivo y requiere un conocimiento sólido de la teoría estadística para su implementación efectiva. Esta técnica de imputación fue propuesta por Rubin (1987) y consite en en generar \(M > 1\) conjuntos de valores para los datos faltantes.

En este sentido, suponga entonces que existe un conjunto de \(n\) datos que relaciona dos variables \(X\), \(Y\), a través del siguiente modelo de regresión simple:

\[y_i = \beta x_i + \varepsilon_i\]

Para todo individuo \(i = 1, \ldots, n.\), de tal manera que los errores tienen distribución normal con \(E(\varepsilon) = 0\) y \(Var(\varepsilon) = \sigma ^2\). Suponga que \(Y_{Obs}\) es un vector conteniendo los valores observados para un conjunto de individuos de tamaño \(n_1\), \(Y_{NoObs}\) es el vector de los valores no observados de tamaño \(n_0\), es decir, \(n_1 + n_0 = n\). Además, se asume que sí fue posible observar los valores de la covariable \(X\) para todos los individuos en la muestra.

Al final, el valor imputado corresponderá al promedio de esos \(M\) valores. Dado que el interés es la estimación de la pendiente de la regresión lineal simple \(\beta\), entonces la esperanza estimada al utilizar la metodología de imputación múltiple está dada por:

\[E(\hat{\beta} | Y_{obs}) = E(E(\hat{\beta} | Y_{obs}, Y_{mis}) | Y_{obs})\]

Esta expresión es estimada por el promedio de las \(M\) estimaciones puntuales de \(\hat{\beta}\) sobre las \(M\) imputaciones, dado por:

\[\bar{\hat{\beta}} = \frac{1}{M} \sum_{m = 1} ^ M \hat{\beta}_m\]

La varianza estimada al utilizar la metodología de imputación múltiple está dada por la siguiente expresión:

\[ V(\hat{\beta} | Y_{obs}) = E(V(\hat{\beta} | Y_{obs}, Y_{mis}) | Y_{obs}) + V(E(\hat{\beta} | Y_{obs}, Y_{mis}) | Y_{obs}) \]

La primera parte de la anterior expresión se estima como el promedio de las varianzas muestrales de \(\hat{\beta}\) sobre las \(M\) imputaciones, dado por:

\[\bar{U} = \frac{1}{M} \sum_{m = 1} ^ M Var(\beta)\]

El segundo término se estima como la varianza muestral de las \(M\) estimaciones puntuales de \(\hat{\beta}\) sobre las \(M\) imputaciones, dada por:

\[B = \frac{1}{M-1} \sum_{m = 1} ^ M (\hat{\beta}_m - \bar{\hat{\beta}})\]

Es necesario tener en cuenta un factor de corrección (puesto que \(M\) es finito). Por tanto, la estimación del segundo término viene dada por la siguiente expresión:

\[ (1 + \frac{1}{M}) B \]

Por tanto, la varianza estimada es igual a: \[\hat{V}(\hat{\beta} | Y_{obs}) = \bar{U} + (1 + \frac{1}{M}) B\]

Se ejemplificará la técnica de imputación múltiple para los datos de la encuesta que se utiliza de ejemplo en este texto:

encuesta$Income_imp <- encuesta$Income_missing
encuesta$Employment_imp <- encuesta$Employment_missin
encuesta_obs <- filter(encuesta,!is.na(Income_missing))
encuesta_no_obs <- filter(encuesta, is.na(Income_missing))
n0 <- nrow(encuesta_no_obs)
n1 <- nrow(encuesta_obs)

Inicialmente, se extraen los datos a imputar y se calculan los tamaños de los datos observados y no observados.

M <- 10
set.seed(1234)

for (ii in 1:M) {
  vp <- paste0("Income_vp_", ii)
  vp2 <- paste0("Employment_vp_", ii)
  
  encuesta_temp <-
    encuesta_obs %>% 
    sample_n(size = n1, replace = TRUE)
  
  mod <- lm(Income ~ Zone + Sex + Expenditure, data = encuesta_temp)
  
  encuesta_no_obs[[vp]] <- predict(mod, encuesta_no_obs)
  encuesta_obs[[vp]] <- encuesta_obs$Income
}

El código anterior ajusta un modelo de regresión lineal con la variable Income como respuesta y las variables Zone, Sex y Expenditure como covariables. Este modelo se utiliza para predecir los valores de la variable Income en la base de datos encuesta_no_obs. Una vez corrido el código anterior, se seleccionan las variables de ingresos y sus valores plausibles (diferentes conjuntos de imputaciones) como se muestra a continuación:

dplyr::select(encuesta_no_obs,
              Income,
              matches("Income_vp_"))[1:10, 1:4]
Income Income_vp_1 Income_vp_2 Income_vp_3
409.87 550.2195 566.0432 567.8296
409.87 561.1194 529.3457 541.8310
90.92 210.5682 225.7715 163.9913
90.92 221.4682 189.0739 137.9927
90.92 210.5682 225.7715 163.9913
135.33 222.6937 237.9191 178.4083
135.33 222.6937 237.9191 178.4083
1539.75 784.8579 801.1103 846.8098
336.00 507.8955 472.7913 439.7467
685.48 593.0111 558.0623 540.9473

A continuación, se grafica la distribución de los ingresos y los valores plausibles, observándose que las distribuciones son muy similares:

encuesta <- bind_rows(encuesta_obs, encuesta_no_obs)

dat_plot10 <- tidyr::gather(
  encuesta %>%
    dplyr::select(Zone, Sex, matches("Income_vp_")),
  key = "Caso",
  value = "Income2",-Zone,-Sex
)

p1 <- ggplot(dat_plot10, aes(x = Income2, col = Caso)) +
  geom_density(alpha = 0.2) +
  theme_bw() +
  theme(legend.position = "bottom") + geom_density(data = encuesta ,
                                                   aes(x = Income),
                                                   col =  "black",
                                                   size = 1.2)

p1

Con los valores plausibles enocntrados anteriormente, se procede a definir el diseño muestral utilizado en este ejemplo y así poder hacer la estimación de los parámetros. A continuación, se define el diseño muestral:

library(srvyr)

diseno <- encuesta %>%
  as_survey_design(
    strata = Stratum,
    ids = PSU,
    weights = wk,
    nest = T
  )

Con el diseño anterior, se estiman los ingresos medios para cada valor plausible junto ocn su varianza, como se muestra a continuación:

estimacion_vp <-  diseno %>%
  summarise(
    vp1 = survey_mean(Income_vp_1, vartype = c("var")),
    vp2 = survey_mean(Income_vp_2, vartype = c("var")),
    vp3 = survey_mean(Income_vp_3, vartype = c("var")),
    vp4 = survey_mean(Income_vp_4, vartype = c("var")),
    vp5 = survey_mean(Income_vp_5, vartype = c("var")),
    vp6 = survey_mean(Income_vp_6, vartype = c("var")),
    vp7 = survey_mean(Income_vp_7, vartype = c("var")),
    vp8 = survey_mean(Income_vp_8, vartype = c("var")),
    vp9 = survey_mean(Income_vp_9, vartype = c("var")),
    vp10 = survey_mean(Income_vp_10, vartype = c("var"))
  )

estimacion_vp
vp1 vp1_var vp2 vp2_var vp3 vp3_var vp4 vp4_var vp5 vp5_var vp6 vp6_var vp7 vp7_var vp8 vp8_var vp9 vp9_var vp10 vp10_var
619.3525 845.706 617.6058 844.5521 617.4322 867.5133 617.748 856.7732 619.9729 857.805 617.1098 852.6605 618.3378 860.7981 619.2779 867.9485 616.9401 850.131 615.7853 870.0434

A continuación se presentan los datos anteriores discriminado por promedio y varianza:

require(tidyr)
(
  estimacion_vp %<>%
    tidyr::gather() %>%
    separate(key, c("vp", "estimacion")) %>%
    mutate(estimacion = ifelse(is.na(estimacion), "promedio", "var")) %>%
    spread(estimacion, value) %>%
    mutate(vp = 1:10)
)
vp promedio var
1 619.3525 845.7060
2 615.7853 870.0434
3 617.6058 844.5521
4 617.4322 867.5133
5 617.7480 856.7732
6 619.9729 857.8050
7 617.1098 852.6605
8 618.3378 860.7981
9 619.2779 867.9485
10 616.9401 850.1310

Por último, para obtener la estimación de la media y su varianza utilizando la imputación múltiple, se realizan los siguientes cálculos que se derivan de las expresiones matemáticas antes mostradas:

Media_vp <- mean(estimacion_vp$promedio)
(Ubar <- mean(estimacion_vp$var))
## [1] 857.3931
(B <- var(estimacion_vp$promedio))
## [1] 1.645758
var_vp <- Ubar + (1 + 1 / M)
(resultado <- data.frame(Media_vp,
                         Media_vp_se = sqrt(var_vp)))
Media_vp Media_vp_se
617.9562 29.30005
estimacion_var_vp <-  diseno %>%
  summarise_at(vars(matches("Income_vp")),
               survey_var,  vartype = "var")

Por otro lado, otro parámetro de interés es la varianza de los ingresos. Este parámetro permite medir la variabilidad de los ingresos de los ciudadanos de la base de datos de ejemplo. La forma de estimarla es la misma que para el promedio de los ingresos y se utilizarán los mismo códigos mostrados anteriormente, cambiando el parámetro a estimar:

(
  estimacion_var_vp %<>%
    tidyr::gather() %>%
    separate(key, c("A", "B", "vp", "estimacion")) %>%
    mutate(
      estimacion = ifelse(is.na(estimacion), "promedio", "var"),
      A = NULL,
      B = NULL,
      vp = as.numeric(vp)
    ) %>%
    spread(estimacion, value)
)
vp promedio var
1 262689.8 3074674460
2 263092.0 3079895581
3 274370.1 3237991671
4 269127.4 3164842634
5 270450.0 3165285304
6 264992.6 3106582542
7 270916.0 3175865575
8 276069.5 3251836316
9 265060.8 3111426636
10 275462.0 3258214990

Por último, se utilizan las ecuaciones mostradas anteriormente:

Media_var_vp <- mean(estimacion_var_vp$promedio)
Ubar <- mean(estimacion_var_vp$var)
B <- var(estimacion_var_vp$promedio)
var_var_vp <- Ubar + (1 + 1 / M) * B
resultado$var_vp <- Media_var_vp
resultado$var_vp_se <- sqrt(var_var_vp)
cbind(Media_var_vp, var_var_vp)
Media_var_vp var_var_vp
269223 3191037330

References

Rubin, Donald B. 1987. «Multiple imputation for survey nonresponse». Journal of the American Statistical Association 82 (398): 63-70.