Cómo mejorar el tiempo de ejecución para la imputación de datos R MICE

9

En resumen, mi pregunta: ¿existen métodos para mejorar el tiempo de ejecución de R MICE (imputación de datos)?

Estoy trabajando con un conjunto de datos (30 variables, 1.3 millones de filas) que contiene (bastante al azar) datos faltantes. Alrededor del 8% de las observaciones en aproximadamente 15 de las 30 variables contienen NA. Para imputar los datos faltantes, estoy ejecutando la función MICE, parte del paquete MICE .

Experimento un tiempo de ejecución bastante lento, incluso en un subconjunto (100,000 filas), con method = "fastpmm" ym = 1 y se ejecuta durante aproximadamente 15 minutos.

¿Hay alguna manera de mejorar el tiempo de ejecución sin perder demasiado rendimiento? (mice.impute.mean es bastante rápido, ¡pero viene con una importante pérdida de información!).

Código reproducible

library(mice)
df <- data.frame(replicate(30,sample(c(NA,1:10),1000000,rep=TRUE)))
df <- data.frame(scale(df))

output <- mice(df, m=1, method = "fastpmm")
Dendrobates
fuente
1
En general: ¿son este tipo de preguntas apropiadas en Cross Validated, o más adecuadas para Stack Overflow?
Dendrobates
3
Puede ser una decisión judicial. Debido a que (como principio general) las mejoras más sustanciales en los tiempos de ejecución se obtienen al comprender los algoritmos subyacentes, esperaría que su mejor oportunidad de obtener una respuesta realmente efectiva esté aquí, en una comunidad donde las personas puedan sugerir enfoques alternativos . Si no obtiene respuestas adecuadas en un día o dos, simplemente marque esta publicación para la migración y la enviaremos a SO (junto con cualquier respuesta y comentario que pueda haber recopilado mientras tanto).
whuber
1
Puede cambiar la opción 'fastppm' a 'norma', será más rápido
marc1s
1
Thx @ marc1s, eso mejoró mucho para grandes conjuntos de datos. Para un marco de datos aleatorio (como el anterior) con 10,000 filas, la "norma" del método fue aproximadamente 4 veces más rápida que "fastpmm". Con 50,000 filas fue incluso 12 veces más rápido. Por lo tanto, la ganancia relativa en tiempo de ejecución aumenta en número de filas.
Dendrobates
1
Dependiendo del modelo que vaya a ejecutar, puede ser más rápido usar la estimación de máxima verosimilitud (o la máxima verosimilitud de la información completa), que es asintóticamente equivalente a la imputación si el modelo se especifica correctamente. Aquí hay un documento en el que participé, que compara los diferentes métodos: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Jeremy Miles

Respuestas:

4

Se puede utilizar quickpred()de micepaquete mediante el cual puede limitar los predictores especificando el Mincor (correlación mínimo) y minpuc (proporción de casos útiles). También puede usar los parámetros de exclusión e inclusión para controlar los predictores.

Aanish
fuente
2

Hice un contenedor para la micefunción que incluye un argumento adicional droplist, donde puede pasar un vector de caracteres de variables predictoras que no desea usar en el lado derecho de las fórmulas de imputación. Esto fue por la velocidad, ya que descubrí que las variables de factores con muchos niveles ralentizarían considerablemente la imputación . No estaba al tanto de la quickpredfunción referenciada por @Aanish, y tal vez podrían usar ambos conceptos juntos.

A continuación se muestra la función tal como aparece en mi paquete glmmplus . Si lo encuentra útil, puedo abrir una solicitud de extracción en el micepaquete real .

ImputeData <- function(data, m = 10, maxit = 15, droplist = NULL) {
  if (length(intersect(names(data), droplist)) < length(droplist)) {
    stop("Droplist variables not found in data set")
  }
  predictorMatrix <- (1 - diag(1, ncol(data)))
  for (term in droplist) {
  drop.index <- which(names(data) == term)
    predictorMatrix[, drop.index] <- 0
  }
  mids.out <- mice(data, m = m, maxit = maxit,
                   predictorMatrix = predictorMatrix)
  return(mids.out)
}
Ben Ogorek
fuente