So verbessern Sie die Laufzeit für die R MICE-Datenimputation

9

Meine Frage kurz: Gibt es Methoden zur Verbesserung der Laufzeit von R MICE (Datenimputation)?

Ich arbeite mit einem Datensatz (30 Variablen, 1,3 Millionen Zeilen), der (ziemlich zufällig) fehlende Daten enthält. Etwa 8% der Beobachtungen in etwa 15 von 30 Variablen enthalten NAs. Um die fehlenden Daten zu unterstellen, führe ich die MICE-Funktion aus, die Teil des MICE- Pakets ist.

Ich habe eine ziemlich langsame Laufzeit, selbst in einer Teilmenge (100.000 Zeilen), mit method = "fastpmm" und m = 1 und läuft ungefähr 15 Minuten.

Gibt es eine Möglichkeit, die Laufzeit zu verbessern, ohne zu viel an Leistung zu verlieren? (Mäuse.impute.mean ist ziemlich schnell, bringt aber einen wichtigen Informationsverlust mit sich!).

Reproduzierbarer Code:

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")
Dendrobaten
quelle
1
Im Allgemeinen: Sind diese Fragen für Cross Validated geeignet oder besser für den Stapelüberlauf geeignet?
Dendrobates
3
Es könnte ein Urteilsspruch sein. Da (im Allgemeinen) die wesentlichsten Verbesserungen der Laufzeiten durch das Verständnis der zugrunde liegenden Algorithmen erzielt werden, würde ich erwarten, dass Ihre beste Chance auf eine wirklich effektive Antwort hier in einer Community besteht, in der die Leute möglicherweise alternative Ansätze vorschlagen können . Wenn Sie in ein oder zwei Tagen keine angemessenen Antworten erhalten, markieren Sie diesen Beitrag einfach für die Migration und wir senden ihn an SO weiter (zusammen mit den Antworten und Kommentaren, die er möglicherweise in der Zwischenzeit gesammelt hat).
whuber
1
Sie können die Option 'fastppm' in 'norm' ändern, sie wird schneller sein
marc1s
1
Thx @ marc1s, das hat sich für große Datenmengen sehr verbessert. Für einen zufälligen Datenrahmen (wie oben) mit 10.000 Zeilen war die Methode "Norm" etwa viermal schneller als "Fastpmm". Mit 50.000 Zeilen war es sogar 12-mal schneller. Daher nimmt der relative Laufzeitgewinn um die Anzahl der Zeilen zu.
Dendrobates
1
Abhängig von dem Modell, das Sie ausführen möchten, ist es möglicherweise schneller, die Schätzung der maximalen Wahrscheinlichkeit (oder der maximalen Wahrscheinlichkeit für vollständige Informationen) zu verwenden, die asymptotisch der Imputation entspricht, wenn das Modell korrekt angegeben ist. Hier ist ein Artikel,
Jeremy Miles

Antworten:

4

Sie können quickpred()aus dem micePaket verwenden, mit dem Sie die Prädiktoren einschränken können, indem Sie den Mincor (minimale Korrelation) und den Minpuc (Anteil der verwendbaren Fälle) angeben . Sie können auch die Ausschluss- und Einschlussparameter zur Steuerung der Prädiktoren verwenden.

Aanish
quelle
2

Ich habe einen Wrapper für die miceFunktion erstellt, der ein zusätzliches Argument enthält, droplistin dem Sie einen Zeichenvektor von Prädiktorvariablen übergeben können, den Sie nicht auf der rechten Seite der Imputationsformeln verwenden möchten. Dies diente der Geschwindigkeit, da ich feststellte, dass Faktorvariablen mit vielen Ebenen die Imputation erheblich verlangsamen würden . Die quickpredFunktion, auf die @Aanish verweist, war mir nicht bekannt , und vielleicht könnten Sie beide Konzepte zusammen verwenden.

Unten ist die Funktion, wie sie in meinem glmmplus- Paket erscheint. Wenn Sie es nützlich finden, kann ich eine Pull-Anfrage im eigentlichen micePaket öffnen .

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
quelle