Come migliorare il tempo di esecuzione per l'imputazione dei dati R MICE


9

La mia domanda in breve: ci sono metodi per migliorare il tempo di esecuzione di R MICE (imputazione dei dati)?

Sto lavorando con un set di dati (30 variabili, 1,3 milioni di righe) che contiene (in modo abbastanza casuale) dati mancanti. Circa l'8% delle osservazioni in circa 15 variabili su 30 contengono NA. Per imputare i dati mancanti, sto eseguendo la funzione MICE, parte del pacchetto MICE .

Ho un tempo di esecuzione piuttosto lento, anche su un sottoinsieme (100.000 righe), con method = "fastpmm" e m = 1 e funziona per circa 15 minuti.

C'è un modo per migliorare il tempo di esecuzione senza perdere troppo nelle prestazioni? (mice.impute.mean è abbastanza veloce, ma viene fornito con un'importante perdita di informazioni!).

Codice riproducibile:

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")

1
In generale: questo tipo di domande sono appropriate su Cross Validated o sono più adatte per Stack Overflow?
Dendrobate il

3
Potrebbe essere una chiamata di giudizio. Poiché (come principio generale) i miglioramenti più sostanziali nei tempi di esecuzione si ottengono comprendendo gli algoritmi sottostanti, mi aspetterei che le tue migliori possibilità di ottenere una risposta davvero efficace possano essere qui, in una comunità in cui le persone potrebbero essere in grado di suggerire approcci alternativi . Se non ricevi risposte adeguate in uno o due giorni, contrassegna semplicemente questo post per la migrazione e lo invieremo a SO (insieme a eventuali risposte e commenti che potrebbe aver raccolto nel frattempo).
whuber

1
Puoi cambiare l'opzione 'fastppm' in 'norm', sarà più veloce
marc1s,

1
Thx @ marc1s, che ha migliorato molto per grandi set di dati. Per un frame di dati casuali (come sopra) con 10.000 righe, il metodo "norm" era circa 4 volte più veloce di "fastpmm". Con 50.000 file era addirittura 12 volte più veloce. Pertanto, il guadagno relativo nel tempo di esecuzione aumenta del numero di righe.
Dendrobate il

1
A seconda del modello che si intende eseguire, potrebbe essere più veloce utilizzare la stima della massima verosimiglianza (o la verosimiglianza massima di informazioni complete), che è asintoticamente equivalente all'imputazione se il modello è specificato correttamente. Ecco un articolo in cui sono stato coinvolto, che confronta i diversi metodi: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Jeremy Miles,

Risposte:


4

È possibile utilizzare quickpred()dal micepacchetto tramite il quale è possibile limitare i predittori specificando mincor (correlazione minima) e minpuc (percentuale di casi utilizzabili). Inoltre è possibile utilizzare i parametri exclude e include per controllare i predittori.


2

Ho creato un wrapper per la micefunzione che include un argomento in più droplist, in cui è possibile passare un vettore di carattere di variabili predittive che non si desidera utilizzare nella parte destra delle formule di imputazione. Questo era per la velocità, poiché ho scoperto che le variabili fattoriali con molti livelli avrebbero rallentato notevolmente l'imputazione . Non ero a conoscenza della quickpredfunzione a cui fa riferimento @Aanish e forse potresti usare entrambi i concetti insieme.

Di seguito è la funzione come appare nel mio pacchetto glmmplus . Se lo trovi utile, potrei aprire una richiesta pull nel micepacchetto effettivo .

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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.