Ich möchte die Imputation verwenden, um fehlende Werte in meinem Datensatz unter bestimmten Bedingungen zu ersetzen.
Zum Beispiel möchte ich, dass die unterstellte Variable x1
größer oder gleich der Summe meiner beiden anderen Variablen ist, sagen wir x2
und x3
. Ich möchte x3
auch von entweder 0
oder unterstellt werden, >= 14
und ich möchte x2
von entweder 0
oder unterstellt werden >= 16
.
Ich habe versucht, diese Einschränkungen in SPSS für die Mehrfachimputation zu definieren, aber in SPSS kann ich nur Maximal- und Minimalwerte definieren. Gibt es eine Möglichkeit, weitere Einschränkungen in SPSS zu definieren, oder kennen Sie ein R-Paket, mit dem ich solche Einschränkungen für die Imputation fehlender Werte definieren kann?
Meine Daten sind wie folgt:
x1 =c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24)
x2 = c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0)
x3 = c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0)
dat=data.frame(x1=x1, x2=x2, x3=x3)
> dat
x1 x2 x3
1 21 0 0
2 50 NA 0
3 31 18 0
4 15 0 0
5 36 19 0
6 82 0 54
7 14 NA 0
8 14 0 0
9 19 0 0
10 18 0 0
11 16 0 0
12 36 0 0
13 583 0 0
14 NA NA NA
15 NA NA NA
16 NA NA NA
17 50 22 NA
18 52 NA 0
19 26 0 0
20 24 0 0
0 or 16 or >= 16
um0 or >= 16
da>=16
den Wert enthält16
. Hoffe, das hat deine Bedeutung nicht durcheinander gebracht. Gleiches gilt für0 or 14 or >= 14
Antworten:
Eine Lösung besteht darin, Ihre eigenen benutzerdefinierten Imputationsfunktionen für das
mice
Paket zu schreiben . Das Paket ist darauf vorbereitet und das Setup überraschend schmerzfrei.Zuerst richten wir die Daten wie vorgeschlagen ein:
Als nächstes laden wir das
mice
Paket und sehen, welche Methoden es standardmäßig auswählt:Das
pmm
steht für Predictive Mean Matching - der wahrscheinlich beliebteste Imputationsalgorithmus zur Imputation kontinuierlicher Variablen. Er berechnet den vorhergesagten Wert mithilfe eines Regressionsmodells und wählt die 5 Elemente aus, die dem vorhergesagten Wert am nächsten liegen (nach euklidischem Abstand ). Diese ausgewählten Elemente werden als Spenderpool bezeichnet, und der endgültige Wert wird zufällig aus diesem Spenderpool ausgewählt.Aus der Vorhersagematrix ergibt sich, dass die Methoden die Variablen übergeben bekommen, die für die Einschränkungen von Interesse sind. Beachten Sie, dass die Zeile die Zielvariable und die Spalte die Prädiktoren ist. Wenn x1 nicht 1 in der x3-Spalte hätte, müssten wir dies in die Matrix einfügen:
imp_base$predictorMatrix["x1","x3"] <- 1
Nun zum lustigen Teil, der die Imputationsmethoden generiert. Ich habe hier eine ziemlich grobe Methode gewählt, bei der ich alle Werte verwerfe, wenn sie die Kriterien nicht erfüllen. Dies kann zu einer langen Schleifenzeit führen und es kann möglicherweise effizienter sein, die gültigen Imputationen beizubehalten und nur die verbleibenden zu wiederholen.
Sobald wir die Methoden definiert haben, ändern wir einfach die vorherigen Methoden. Wenn Sie nur eine einzelne Variable ändern möchten, können Sie einfach verwenden,
imp_base$method["x2"] <- "pmm_x2"
aber für dieses Beispiel werden wir alle ändern (die Benennung ist nicht erforderlich):Schauen wir uns nun den dritten unterstellten Datensatz an:
Ok, das macht den Job. Ich mag diese Lösung, da Sie die Hauptfunktionen huckepack nehmen und nur die Einschränkungen hinzufügen können, die Sie für sinnvoll halten.
Aktualisieren
Um die in den Kommentaren erwähnten rigorosen Einschränkungen @ t0x1n durchzusetzen, möchten wir der Wrapper-Funktion möglicherweise die folgenden Funktionen hinzufügen:
Dies führt zu einer etwas komplizierteren Wrapper-Funktion:
Beachten Sie, dass dies nicht so gut funktioniert. Dies liegt höchstwahrscheinlich daran, dass der vorgeschlagene Datensatz die Einschränkungen in allen Fällen nicht erfüllt, ohne dass sie fehlen. Ich muss die Schleifenlänge auf 400-500 erhöhen, bevor sie sich überhaupt verhält. Ich gehe davon aus, dass dies unbeabsichtigt ist. Ihre Unterstellung sollte nachahmen, wie die tatsächlichen Daten generiert werden.
Optimierung
Das Argument
ry
enthält die nicht fehlenden Werte, und wir könnten die Schleife möglicherweise beschleunigen, indem wir die Elemente entfernen, die wir als zutreffend eingestuft haben, aber da ich mit den inneren Funktionen nicht vertraut bin, habe ich darauf verzichtet.Ich denke, das Wichtigste, wenn Sie starke Einschränkungen haben, die Zeit zum Ausfüllen benötigen , ist die Parallelisierung Ihrer Anrechnungen ( siehe meine Antwort auf CrossValidated ). Die meisten haben heute Computer mit 4-8 Kernen und R verwendet standardmäßig nur einen von ihnen. Die Zeit kann (fast) halbiert werden, indem die Anzahl der Kerne verdoppelt wird.
Fehlende Parameter bei der Imputation
In Bezug auf das Problem des
x2
Fehlens zum Zeitpunkt der Imputation - Mäuse geben tatsächlich niemals fehlende Werte in diex
- eindata.frame
. Die Mäusemethode beinhaltet das Ausfüllen eines zufälligen Wertes zu Beginn. Der Kettenteil der Imputation begrenzt die Auswirkung von diesem Anfangswert. Wenn Sie sich diemice
-Funktion ansehen, finden Sie diese vor dem Aufruf der Imputation (diemice:::sampler
-Funktion):Das
data.init
kann an diemice
Funktion geliefert werden und das mice.imput.sample ist ein grundlegendes Stichprobenverfahren.Besuchsreihenfolge
Wenn die Besuchsreihenfolge wichtig ist, können Sie die Reihenfolge angeben, in der die Funktion
mice
die Imputationen ausführt. Die Standardeinstellung ist von,1:ncol(data)
aber Sie können festlegen, dass dasvisitSequence
beliebig ist.quelle
pmm_x1
jedoch: (1) Die maximale Summe einer möglichen Kombination vonx2
undx3
aus dem gesamten Datensatz ist viel strenger als die ursprüngliche Einschränkung. Die richtige Sache wäre, dass zu testen , für jede Zeile ,x1 < x2 + x3
. Je mehr Zeilen Sie haben, desto geringer ist natürlich die Wahrscheinlichkeit, eine solche Einschränkung einzuhalten (da eine einzelne fehlerhafte Zeile alles ruiniert), und desto länger kann die Schleife möglicherweise werden.x1
undx2
fehlen, können Sie einen Wert unterstellen,x1
für den die Einschränkungen gelten (sagen wir 50), aber wennx2
sie einmal unterstellt werden, sind sie gebrochen (sagen wir, es wird unterstellt, dass sie 55 sind). Gibt es eine Möglichkeit, "horizontal" anstatt vertikal zu unterstellen? So können wir eine einzige Reihe von zurechnen könntex1
,x2
undx3
und einfach wieder impute es , bis diese bestimmte Zeile fällt unter den Einschränkungen. Das sollte schnell genug gehen, und wenn das erledigt ist, können wir in die nächste Reihe wechseln. Wenn MI von Natur aus "vertikal" ist, haben wir natürlich kein Glück. In diesem Fall vielleicht der Ansatz Aleksandr erwähnt?mice
Paket verwende. Danke für das Teilen.debug()
zu sehen, wiemice.impute.pmm
und seine Geschwister unter der Haube arbeiten.Das Nächste, was ich finden konnte, war Amelias vorherige Aufnahme von Informationen. Siehe Kapitel 4.7 in der Vignette , insbesondere 4.7.2:
Während Sie also nicht in der Lage sind, etwas allgemeines zu sagen
x1<x2+x3
, können Sie Ihren Datensatz durchlaufen und für jeden relevanten Fall eine vorherige Beobachtungsebene hinzufügen. Konstantengrenzen können ebenfalls angewendet werden (z. B. x1, x2 und x3 dürfen nicht negativ sein). Beispielsweise:quelle
Einschränkungen lassen sich wahrscheinlich einfacher in die prädiktive Mittelwertanpassung für mehrere Imputationen implementieren. Dies setzt voraus, dass eine signifikante Anzahl von Beobachtungen mit nicht fehlenden einschränkenden Variablen vorliegt, die die Einschränkungen erfüllen. Ich denke darüber nach, dies in der R-
Hmisc
Paketfunktion zu implementierenaregImpute
. Vielleicht möchten Sie in einem Monat oder so zurückschauen. Es wird wichtig sein, den maximalen Abstand zu dem Ziel anzugeben, den eine Spenderbeobachtung haben kann, da die Einschränkungen die Spender weiter vom idealen, nicht eingeschränkten Spender entfernen.quelle
x<y<z
.x1<x2
) erfüllt ist?aregImpute
Funktion mit prädiktiver Mittelwertanpassung tun könnte . Was aber, wenn keine der Geberbeobachtungen (fast übereinstimmende Vorhersagen) die Bedingungen für die unterstellte Zielbeobachtung erfüllt, obwohl sie offensichtlich die Bedingungen für die Menge der Gebervariablen erfüllen mussten?Ich bin der Meinung, dass das
Amelia
(Amelia II) -Paket derzeit die umfassendste Unterstützung für die Angabe von Datenwertebereichsbeschränkungen bietet. Das Problem ist jedoch, dassAmelia
davon ausgegangen wird, dass die Daten multivariat normal sind.Wenn in Ihrem Fall die Annahme einer multivariaten Normalität nicht zutrifft, sollten Sie das
mice
Paket überprüfen , das die Mehrfachimputation (MI) über verkettete Gleichungen implementiert . Dieses Paket setzt keine multivariate Normalität voraus . Es hat auch eine Funktion, die vielleicht ausreicht, um Einschränkungen festzulegen , aber ich bin mir nicht sicher, in welchem Maße. Die Funktion wird aufgerufensqueeze()
. Sie können darüber in der Dokumentation nachlesen: http://cran.r-project.org/web/packages/mice/mice.pdf . Ein zusätzlicher Vorteilmice
ist die Flexibilität, die es ermöglicht, benutzerdefinierte Imputationsfunktionen zu spezifizieren und die Auswahl der Algorithmen zu erweitern. Hier ist ein Tutorial zum Durchführen von MI mitmice
:http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .Soweit ich weiß, unterstützt das
Hmisc
Paket von Dr. Harrell nach dem gleichen Ansatz verketteter Gleichungen ( Predictive Mean Matching ) wahrscheinlich nicht normale Daten (mit Ausnahme dernormpmm
Methode). Möglicherweise hat er die Funktionalität für die Einschränkungsspezifikation bereits gemäß der obigen Antwort implementiert. Ich habe nicht verwendetaregImpute()
, kann also nicht mehr dazu sagen (ich habeAmelia
und verwendetmice
, aber ich bin definitiv kein Experte für Statistik und versuche nur, so viel wie möglich zu lernen).Zum Schluss finden Sie vielleicht die folgende, etwas veraltete, aber immer noch schöne Übersicht über Ansätze, Methoden und Software für die Mehrfachzurechnung von Daten mit fehlenden Werten: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Ich bin sicher, dass es neuere Übersichtsartikel zu MI gibt, aber das ist alles, was mir derzeit bekannt ist. Ich hoffe das ist etwas hilfreich.
quelle
aregImpute
.squeeze
ist, dass seine Grenzen konstant sind, so dass Sie nichts wie angeben könnenx1<x2
. Es scheint auch auf den unterstellten Ergebnisvektor angewendet zu werden, was meines Erachtens zu spät ist. Es scheint mir, dass die Grenzen während des Imputationsprozesses berücksichtigt werden sollten, sodass sie mehr Bedeutung haben als eine nachträgliche Anpassung.Amelia
, da ich von "" auf "" umgestellt habemice
, sobald meine Tests bestätigt haben, dass meine Daten nicht multivariat normal sind. Vor kurzem bin ich jedoch auf diese sehr schönen Präsentationsfolien zum Thema (MI-Methoden und -Software) gestoßen: statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/… . Wenn ich es richtig verstanden habe, beschreibt es eine mögliche Lösung für das Einschränkungsproblem (siehe PDF Seite 50 - nicht Folie Nummer 50!). Hoffe das hilft.Wenn ich Ihre Frage richtig verstehe, scheint es mir, dass Sie bereits wissen, welche Werte die fehlenden Variablen einschränken sollten. Ich bin nicht sehr vertraut mit SPSS, aber ich denke, Sie können eine Funktion schreiben, um das zu tun (was je nach Ihrer Erfahrung nicht allzu schwierig sein sollte, sollte ich sagen). Ich kenne kein Paket, das mit solchen Einschränkungen funktioniert.
quelle