Introducción

Suponga 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\). Bajo esta perspectiva, suponga que la variable dependiente \(Y\) sólo pudo ser observada para un conjunto de individuos de tamaño \(n_1\), mientras que para los \(n_0\) individuos restantes, no existen datos para la variable respuesta. 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.

Vamos a simular un conjunto de \(n = 500\) datos con una pendiente \(\beta = 10\) y con una dispersión de \(\sigma = 2\). A su vez, el conjunto de datos tendrá \(n_0 = 200\) valores faltantes en la variable respuesta. La siguiente función genera la estructura de los datos

generar <- function(n = 500, n_0 = 200, beta = 10, sigma = 2){
  x <- runif(n)
  mu <- beta * x
  y <- mu + rnorm(n, mean = 0, sd = sigma)
  datos <- data.frame(x = x, y = y)
  faltantes <- sample(n, n_0)
  datos$faltantes <- "No"
  datos$faltantes[faltantes] <- "Si"
  datos$y.per <- y
  datos$y.per[faltantes] <- NA
  return(datos)
}

datos <- generar()
head(datos)
##           x        y faltantes    y.per
## 1 0.7275323 5.854265        No 5.854265
## 2 0.8481436 8.448366        Si       NA
## 3 0.1442695 4.635120        No 4.635120
## 4 0.8738171 8.380226        No 8.380226
## 5 0.4505050 2.537086        No 2.537086
## 6 0.6925783 8.789090        Si       NA

Para este ejemplo, los gráficos que relacionan las variables (con y sin valores faltantes) son:

Ahora, con el 40% de valores faltantes, es necesario imputar los datos faltantes. Para esto, utilizaremos la técnica de imputación múltiple propuesta por Rubin (1987). La idea consiste en generar \(M > 1\) conjuntos de valores para los datos faltantes. Al final, el valor imputado corresponderá al promedio de esos \(M\) valores. Por tanto el modelo final de imputación (para los valores faltantes) toma la siguiente forma:

\[\dot{y}_i = \dot{\beta} x_{i - (missing)}+ \dot{\varepsilon_i}\]

El símbolo \(\dot{}\) representa la naturaleza estocástica de la imputación. Por ejemplo, aunque \(\dot{\beta}\) representa un valor diferente a \(\beta = 10\), es un valor que viene de una distribución de probabilidad. Hay varias maneras de realizar la imputación:

El valor agregado de la imputación múltiple realmente está en la estimación de los errores estándar. No tener en cuenta la naturaleza estocástica de los valores imputados arroja estimaciones de la varianza mucho menores. Esto puede ser uno de los errores más graves que un estadístico puede cometer, puesto que afecta la cobertura nominal de los intervalos de confianza y a su vez influye en las pruebas de hipótesis y en el cálculo de los valores p.

Por ejemplo, si el interés es la estimación de la pendiente de la regresión 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\]

Por otro lado, 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\]

Imputación ingenua

Una función que realiza esta imputación es la siguiente:

im.ingenua <- function(datos){
  Ind <- is.na(datos$y.per)
  na.omit(datos)
  beta1 <- lm(y ~ 0 + x, data = datos, na.action = na.omit)$coeff
  datos$y.per[Ind] <-  datos$x[Ind] * beta1

  model.input <- lm(y.per ~ 0 + x, data = datos)
  beta.input <- model.input$coeff
  beta.sd <- summary(model.input)$coeff[2]
  result <- list(new = datos, beta = beta.input, sd = beta.sd)
}

Al aplicar la función sobre el conjunto de datos creado, se obtienen las siguientes salidas:

datos <- generar()
im.ingenua(datos)$beta
##        x 
## 10.09468
im.ingenua(datos)$sd
## [1] 0.1187957
head(im.ingenua(datos)$new)
##           x         y faltantes     y.per
## 1 0.7865446 11.301002        No 11.301002
## 2 0.6821044  4.740224        Si  6.867376
## 3 0.1734049  1.994628        No  1.994628
## 4 0.5161599  3.141765        Si  5.196659
## 5 0.6095868  2.103371        No  2.103371
## 6 0.7082076  6.043318        No  6.043318

Nótese que todos los valores faltantes imputados caen, como era de esperarse, sobre la línea de regresión. Esta es una característica que implica una subestimación de la varianza de la variable respuesta.

Imputación Bootstrap

Una función que realiza esta imputación es la siguiente:

im.bootstrap <- function(datos, M = 15){
  library(dplyr)
  n <- nrow(datos)
  datos1 <- na.omit(datos)
  n1 <- nrow(datos1)
  n0 <- n - n1
  Ind <- is.na(datos$y.per)
  faltantes.boot <- NULL
  beta1 <- NULL
  sigma1 <- NULL
  
  for (m in 1:M){
    datos.m <- dplyr::sample_n(datos1, n1, replace = TRUE)
    model1 <- lm(y ~ 0 + x, data = datos.m)
    beta <- model1$coeff
    sigma <- sqrt(anova(model1)[["Mean Sq"]][2])
    faltantes.boot <- rnorm(n0, datos$x[Ind] * beta, sd = sigma)
    datos$y.per[Ind] <-  faltantes.boot
    model.input <- lm(y.per ~ 0 + x, data = datos)
    beta1[m] <- model.input$coeff
    sigma1[m] <- summary(model.input)$coeff[2]
  }
  beta.input <- mean(beta1)
  u.bar <- mean(sigma1 ^ 2)
  B <- var(beta1)
  beta.sd <- sqrt(u.bar + B + B/M)
  result <- list(new = datos, beta = beta.input, sd = beta.sd)
}

Al aplicar la función sobre el conjunto de datos creado, se obtienen las siguientes salidas:

datos <- generar()
im.bootstrap(datos)$beta
## [1] 10.25154
im.bootstrap(datos)$sd
## [1] 0.2345388
head(im.bootstrap(datos)$new)
##            x         y faltantes     y.per
## 1 0.97794174  9.683813        Si 12.992767
## 2 0.44932770  5.823474        No  5.823474
## 3 0.66077397  5.651702        No  5.651702
## 4 0.01300767 -1.497382        No -1.497382
## 5 0.28542032  2.388563        No  2.388563
## 6 0.13981969  2.988707        No  2.988707

Nótese que existe una buena dispersión en los valores imputados.

Imputación Bayesiana

Bajo distribuciones previas no informativas, la distribución posterior de \(\sigma^2\) es: \[\sigma^2| y, x \sim \frac{\sum_{i = 1}^{n_1} (y_i - \hat{\beta} x_i)^2}{\chi ^2_{n_1-1}}\]

con \(\hat{\beta} = \frac{\sum_{i = 1}^{n_1} x_i y_i}{\sum_{i = 1}^{n_1} x_i^2}\). La distribución posterior de \(\beta\) es: \[\beta | \sigma^2, y, x \sim Normal(\hat{\beta}, \frac{\sigma^2}{\sum_{i = 1}^{n_1} x_i^2} )\]

Una función que realiza esta imputación es la siguiente:

im.bayes <- function(datos, M = 15){
  library(dplyr)
  n <- nrow(datos)
  datos1 <- na.omit(datos)
  n1 <- nrow(datos1)
  n0 <- n - n1
  Ind <- is.na(datos$y.per)
  model1 <- lm(y ~ 0 + x, data = datos1)
  beta <- model1$coeff
  sigma <- sqrt(anova(model1)[["Mean Sq"]][2])
  faltantes.bayes <- NULL
  beta1 <- NULL
  sigma1 <- NULL
  
  for (m in 1:M) {
    g <- rchisq(1, n1 - 1)
    sigma.pos <- (n1 - 1) * sigma ^ 2 / g
    var.pos <- sigma.pos / sum(datos1$x ^ 2)
    beta.pos <- rnorm(1, beta, sd = sqrt(var.pos))
    faltantes.bayes <- rnorm(n0, datos$x[Ind] * beta.pos, sd = sqrt(sigma.pos))
    datos$y.per[Ind] <-  faltantes.bayes
    model.input <- lm(y.per ~ 0 + x, data = datos)
    beta1[m] <- model.input$coeff
    sigma1[m] <- summary(model.input)$coeff[2]
  }
  beta.input <- mean(beta1)
  u.bar <- mean(sigma1 ^ 2)
  B <- var(beta1)
  beta.sd <- sqrt(u.bar + B + B/M)
  result <- list(new = datos, beta = beta.input, sd = beta.sd)
}

Al aplicar la función sobre el conjunto de datos creado, se obtienen las siguientes salidas:

datos <- generar()
im.bayes(datos)$beta
## [1] 9.97836
im.bayes(datos)$sd
## [1] 0.207771
head(im.bayes(datos)$new)
##           x        y faltantes      y.per
## 1 0.4622356 7.177236        No  7.1772358
## 2 0.5092983 2.707868        No  2.7078680
## 3 0.4112130 2.346065        Si  4.5994068
## 4 0.5185065 5.894138        Si  7.4832260
## 5 0.3391639 2.691695        Si -0.2335784
## 6 0.7489785 4.703660        No  4.7036598

Nótese que existe una buena dispersión en los valores imputados.

Simulación de Monte Carlo

La siguiente función agrupa todas las anteriores funciones de imputación y arroja resultados sobre la esperanza de las imputaciones, así como sus respectivos errores estándar.

simu <- function(){
  im.betas <- NULL
  im.sd <- NULL
  datos <- generar()
  im.betas[1] <- im.ingenua(datos)$beta
  im.betas[2] <- im.bootstrap(datos)$beta
  im.betas[3] <- im.bayes(datos)$beta
  im.betas[4] <- im.ingenua(datos)$sd
  im.betas[5] <- im.bootstrap(datos)$sd
  im.betas[6] <- im.bayes(datos)$sd
  return(im.betas)
}

resultados <- t(replicate(n = 1000, simu()))
resultados <- as.data.frame(resultados)
colnames(resultados) <- c("beta.ing", "beta.boot", "beta.bayes", "sd.ing", "sd.boot", "sd.bayes")
head(resultados)
##    beta.ing beta.boot beta.bayes    sd.ing   sd.boot  sd.bayes
## 1 10.056772 10.115601  10.171105 0.1215380 0.1947824 0.1950999
## 2 10.160699 10.241731  10.133356 0.1355619 0.2299487 0.2122155
## 3 10.112279 10.048669  10.079439 0.1169640 0.2330632 0.1882248
## 4  9.994243  9.986130   9.992585 0.1192448 0.1726904 0.2034506
## 5  9.911859  9.937705   9.910568 0.1203331 0.2011541 0.2016907
## 6  9.816548  9.870926   9.836582 0.1224530 0.2258406 0.2037236
resultados$long.ing <- (resultados[,1] + 1.96 * resultados[,4]) - 
  (resultados[,1] - 1.96 * resultados[,4])
resultados$long.boot <- (resultados[,2] + 1.96 * resultados[,5]) - 
  (resultados[,2] - 1.96 * resultados[,5])
resultados$long.bayes <- (resultados[,3] + 1.96 * resultados[,6]) - 
  (resultados[,3] - 1.96 * resultados[,6])

resultados$cob.ing <- (resultados[,1] - 1.96 * resultados[,4]) < 10  & 
  10 < (resultados[,1] + 1.96 * resultados[,4])
resultados$cob.boot <- (resultados[,2] - 1.96 * resultados[,5]) < 10  & 
  10 < (resultados[,2] + 1.96 * resultados[,5])
resultados$cob.bayes <- (resultados[,3] - 1.96 * resultados[,6]) < 10  &  
  10 < (resultados[,3] + 1.96 * resultados[,6])

colMeans(resultados)
##   beta.ing  beta.boot beta.bayes     sd.ing    sd.boot   sd.bayes 
## 10.0023061 10.0025197 10.0031333  0.1200185  0.2015411  0.2018985 
##   long.ing  long.boot long.bayes    cob.ing   cob.boot  cob.bayes 
##  0.4704725  0.7900411  0.7914423  0.8340000  0.9500000  0.9410000

Nótese que inclusive la imputación ingenua arroja estimaciones insesgadas. Sin emabrgo, el error estándar de esta es el más bajo. Por lo tanto, la longitud de los intervalos que utilizan imputación múltiple es un poco mayor y como resultado la cobertura del intervalo de confianza ingenuo no corresponde a un nivel de confianza del 0.95.