Ich habe einen sehr großen Datensatz und es fehlen ungefähr 5% zufällige Werte. Diese Variablen sind miteinander korreliert. Der folgende Beispiel-R-Datensatz ist nur ein Spielzeugbeispiel mit Dummy-korrelierten Daten.
set.seed(123)
# matrix of X variable
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated
N <- 2000000*0.05 # 5% random missing values
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA
> xmat[1:10,1:10]
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1 -1 -1 1 NA 0 -1 1 -1 0 -1
sample2 1 1 -1 1 0 0 1 -1 -1 1
sample3 0 0 1 -1 -1 -1 0 -1 -1 -1
sample4 1 0 0 -1 -1 1 1 0 1 1
sample5 NA 0 0 -1 -1 1 0 NA 1 NA
sample6 -1 1 0 1 1 0 1 1 -1 -1
sample7 NA 0 1 -1 0 1 -1 0 1 NA
sample8 1 -1 -1 1 0 -1 -1 1 -1 0
sample9 0 -1 0 -1 1 -1 1 NA 0 1
sample10 0 -1 1 0 1 0 0 1 NA 0
Gibt es in dieser Situation eine (beste) Möglichkeit, fehlende Werte zu unterstellen? Ist der Random Forest-Algorithmus hilfreich? Jede funktionierende Lösung in R wäre sehr dankbar.
Bearbeitungen:
(1) Fehlende Werte werden zufällig auf die Variablen und Stichproben verteilt. Die Anzahl der Variablen ist sehr groß (hier im Beispiel - 10000), während die Anzahl der Stichproben hier im obigen Dummy-Beispiel etwa 200 beträgt Betrachtet man eine Stichprobe über alle Variablen (10000), besteht die hohe Wahrscheinlichkeit, dass bei einer Variablen ein Wert fehlt - aufgrund der großen Anzahl von Variablen. Das Löschen des Samples ist also keine Option.
(2) Die Variable kann sowohl quantitativ als auch qualitativ (binär) im Rahmen der Anrechnung behandelt werden. Das einzige Urteil ist, wie gut wir es vorhersagen können (Genauigkeit). Vorhersagen wie 0,98 anstelle von 1 könnten also akzeptabel sein, eher 0 gegen 1 oder -1 gegen 1. Ich muss möglicherweise einen Kompromiss zwischen Rechenzeit und Genauigkeit eingehen.
(3) Das Problem, über das ich nachgedacht habe, wie sich eine Überanpassung auf die Ergebnisse auswirken kann, da die Anzahl der Variablen im Vergleich zur Anzahl der Stichproben groß ist.
(4) Da die Gesamtmenge der fehlenden Werte ungefähr 5% beträgt und zufällig ist (nicht auf Variablen oder Proben konzentriert, da Vorsichtsmaßnahmen getroffen wurden, um Variablen oder Proben mit sehr hohen fehlenden Werten zu entfernen)
(5) Die Vervollständigung der Daten für die Analyse ist das erste Ziel und die Genauigkeit ist zweitrangig. Also nicht zu empfindlich auf Genauigkeit.
quelle
Antworten:
Abhängig von Ihrer Situation und Ihrem Datensatz gibt es zwei Möglichkeiten, um Probleme mit großen Variablen und kleinen Stichproben (Beobachtungen) zu lösen.
(1) Verwenden Sie einfach Stichproben (Beobachtungen) als Variable, vorausgesetzt, dass die Bewertungen für alle Variablen gleich oder normalisiert sind.
(2) Verwenden Sie Variablen als Variable, aber führen Sie während der Eingabe einige Stichproben durch, damit die Anzahl der Variablen unter der Anzahl der Stichproben liegt, und führen Sie schließlich die Daten zusammen.
Das folgende Training können Sie an Ihre Bedürfnisse anpassen. Ich gehe davon aus, dass die Variable kontinuierlich ist, aber Sie trainieren ähnlich für diskrete Variablen. Hier gebe ich ein kleines Beispiel für eine schnelle Überprüfung.
Erstens können für das Training, das korrelierte Daten generiert, die Beobachtungen (Proben) korreliert werden. Dies kann in Situationen realistisch sein, in denen Variablen als unabhängig angenommen werden, während Beobachtungen korreliert werden. Aber in anderen Situationen, in denen sowohl Beobachtungen als auch Variablen korrelieren.
Ich benutze
missForest
Paket für die Anrechnung, die von der abhängenrandomForest
Paket um dies zu tun. Sie können parallel rechnen, wenn Sie eine sehr große Anzahl von Datenpunkten zu unterstellen haben.Da dies ein simulierter Datensatz ist, haben wir den Luxus, die Genauigkeit der Imputation abzuschätzen, indem wir das Original vergleichen, bevor fehlende Werte mit den imputierten Werten eingeführt werden.
Sie können dies umgehen, um die Genauigkeit zu erhöhen. Viel Glück !
quelle
Es gibt eine Fülle von Datenimputationsbüchern, so dass es schwierig ist, in diesem Rahmen eine Antwort zu geben.
Wenn Ihr Datensatz sehr groß ist, sollten Sie einen schnellen oder skalierbaren Algorithmus verwenden.
quelle
Das ist eine wirklich interessante Frage. Ich suche auch das Gleiche. Tatsächlich gibt es viele verschiedene Möglichkeiten, damit umzugehen.
Meiner Meinung nach besteht das erste darin, festzustellen, welche Art von fehlenden Daten Sie haben - völlig zufällig (MCAR), zufällig (MAR) oder nicht zufällig (NMAR). Dies ist schwierig und kontrovers zu beweisen, aber dieses Papier zeigt eine interessante Art, MAR-Daten zu betrachten.
Um mit multipler Imputation umzugehen, hat R einige Pakete:
MICE
(was sehr gebraucht zu sein scheint),randomForest
,Hmisc
Amelia
mi
Dies sind nur einige der Pakete, die ich bisher gefunden habe.
MICE
hat auch zufällige Gesamtstrukturen und einige andere Methoden implementiert, wie z. B. die Vorhersage des Mittelwerts.Dies ist nicht viel, kann Ihnen aber dabei helfen, einige Dinge herauszufinden. Sobald ich Ergebnisse habe oder mich für eine Methode entschieden habe, bearbeite ich den Beitrag.
Viel Glück!
quelle
Interessante Frage. Der Trick dabei ist, dass Sie für die mehrfache Imputation mehr als nur ein Vorhersagemodell benötigen (was zum Beispiel mit einem Ansatz des maschinellen Lernens leicht zu erreichen wäre). Wir werden diese Modelle als Simulationsmodelle bezeichnen, da es sich nicht ganz um Wahrscheinlichkeitsmodelle handelt.
Der kombinierte Aspekt der Merkmalsauswahl (großp ) und das Trainieren eines Simulationsmodells lässt mich denken, dass ein Bayes'scher Ansatz der beste ist. Das bedeutet auch, dass es keinen klaren Ansatz dafür gibt. Für mich hätte der beste Ansatz den folgenden Ansatz:
quelle
Ihr Problem scheint auf eine Art niedrigrangige Matrix-Vervollständigung zugeschnitten zu sein. Versuchen Sie es mit der
impute.svd()
Funktion aus dembcv
Paket . Ich würde vorschlagen, einen kleinen Rang (das Argumentk
) zu verwenden - so etwas wie 5.quelle