R Anleitungen

R: Daten imputieren

Fehlende Daten können ein nicht ganz so triviales Problem bei der Analyse eines Datensatzes darstellen, und auch die Abrechnung ist in der Regel nicht so einfach. Wenn die Menge der fehlenden Daten im Verhältnis zur Größe des Datensatzes eher gering ist, kann das Weglassen der wenigen fehlenden Stichproben die beste Strategie sein, um die Analyse nicht zu verzerren. Das Weglassen verfügbarer Datenpunkte beraubt die Daten jedoch auch an Informationen, und ist vor allem bei Verfahren unerfreulich, bei denen Daten Listenweise vorhanden sein müssen, wie beispielsweise Verfahren mit Messwiederholung oder wenn man eine Studie mit Intention-to-Treat durchführt. Je nach  Situation kann es daher besser sein, die fehlenden Daten mit anderen statistischen Methoden zu vervollständigen. Verfahren, die dies tun, imputieren die fehlenden Daten.

missForest

missForest ist eines unser am häufigsten verwendeten Verfahren, um Daten zu imputieren. Es ist flexibel, non-parametrisch, kann auch mit kategorischen Daten umgehen und verwendet dabei einen modernen Algorithmus, basierend auf maschinellem Lernen.

R Code
library(missForest)

Daten <- sapply(Daten, as.numeric) # Falls sample() eine Fehlermeldung ausgibt
Daten.missForest <- missForest(Daten)

Daten.Imputiert <- Daten.missForest$ximp
missForest kann unter Umständen die Fehlermeldung „Error in sample.int(length(x), size, replace, prob): invalid first argument“ anzeigen. In solchen Fällen empfiehlt es sich alle nicht-numerischen Spalten aus dem Datensatz zu entfernen und sapply(Daten, as.numeric) ausführen.

MICE

mice steht für Multivariate Imputation by Chained Equations. Dieses Paket wird verwendet, um fehlende Werte durch plausible Werte zu ersetzen, um möglichst realitätsnah Regressionskoeffizienten zu schätzen, die durch fehlende Werte nicht beeinträchtigt werden. mice ermöglicht es uns, eine Reihe von imputierten Datensätzen zu erstellen, die fehlende Werte durch plausible Werte ersetzen, und unsere Analyse an diesen separaten, vollständigen Datensätzen durchzuführen.

In der Praxis läuft das meiste davon im Hintergrund ab und wir können mice so wie unten aufrufen:

R Code
library(mice)

Daten.Imputiert <- mice(Daten, m=5, maxit=50, meth="pmm", seed=42)
mice kann nur mit kontinuierlichen numerischen Variablen umgehen. Daher sollten alle Variablen aus dem Datensatz vorher entfernt werden, die dies nicht erfüllen.

mi

mi imputiert aus der bedingten Verteilung einer Variablen unter Berücksichtigung der beobachteten und imputierten Werte der anderen Variablen. Gleichzeitig erkennt es automatisch Unregelmäßigkeiten in den Daten wie hohe Kollinearität der Variablen.

R Code
library(mi)

Daten.Imputiert <- mi(Daten, seed=42)

Allgemeine Syntax

Unterhalb eine allgemeine Syntax, die zur Imputation von Daten verwendet werden kann, bei der am Anfang Spalten von dem Datensatz ausgeschlossen werden müssen, z.B. weil sie nicht imputiert werden sollen (z.B. wenn es sich um Diagnosen handelt), oder bei Zeichenketten, wie Kommentaren, die nicht imputiert werden können. Hier wird beispielhaft missForest verwendet, allerdings funktioniert der Syntax ebenfalls mit den anderen Imputationsalgorithmen.

Im letzten Schritt werden die an Anfang entfernten Spalten wieder hinzugefügt und die anfängliche Reihenfolge der Variablen wieder hergestellt.

R Code
# Spalten, die wir nicht imputieren möchten, z.B. weil sie Kommentare enthalten
Entfernte.Spalten <- c("Spalte1", "Spalte2", "Spalte3")

# Temporären Datenrahmen erstellen, der diese Spalten nicht enthält
Daten.gekürzt <- Daten[, -which(names(Daten) %in% Entfernte.Spalten)]

# Daten mit missForest (oder einem beliebigen anderen Verfahren) imputieren
Daten.missForest <- missForest(Daten.gekürzt)

# Der imputierte Datensatz ist bei missForest im Element $ximp gespeichert
Daten.imputiert <- as.data.frame(Daten.missForest$ximp)

# Die am Anfang entfernten Spalten wieder zu dem Datensatz hinzufügen
Daten.imputiert <- cbind(Daten[, which(names(Daten) %in% Entfernte.Spalten)], Daten.imputiert)

# Spalten im Datensatz wieder so ordnen, wie sie ursprünglich waren
Daten.imputiert <- Daten.imputiert[, names(Daten)]