2016-05-11 16 views
0

Ich bin gerade dabei, einige longitudinale Daten zu säubern, und ich habe mehrere fehlende Fälle. Ich versuche eine Imputation zu verwenden, die Beobachtungen vor und nach dem fehlenden Fall enthält. Ich frage mich, wie ich die unten aufgeführten Probleme angehen kann.Imputation für longitudinale Daten mit Beobachtung vor und nach fehlenden Daten

Ich habe versucht, das Problem in kleinere, überschaubarere Operationen und Objekte auseinander zu brechen, aber die Lösungen, die ich komme, zwingen mich bedingte Formatierung basierend auf Zeilen direkt über und unter dem fehlenden Wert zu verwenden und Ehrlich gesagt, bin ich etwas verloren, wie das geht. Ich würde gerne ein wenig Anleitung, wenn Sie denken, dass Sie wissen, eine gute Technik, die ich verwenden kann, experimentieren mit, oder wenn Sie wissen, gute Suchbegriffe, die ich verwenden kann, wenn Sie eine Lösung suchen.

Die Details sind unten:

#Fake dataset creation 
id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4) 
time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6) 
ss <- c(1,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0) 
mydat <- data.frame(id, time, ss) 

* Bold Zeichen Änderungen aus dem Datensatz darstellen oben

Ziel ist es, einen Weg zu finden, bevor der Mittelwert des Wertes zu erhalten (3) und nach (0) der NA-Wert für die ID # 1 (variable ss) so, dass die Daten wie folgt aussehen:
1,3,2,3, 1,5, 0,0,

ID # 2 (variable ss) sollte so aussehen:
2,4,0, , 0,0,0

ID # 3 (Variable ss) sollte eine letzte Beobachtung nach vorne Ansatz durch verwenden, so würde es so aussehen müssen:
4,1,2,4,2 , 3,

ID # 4 (Variable ss) hat zwei aufeinander folgende NA-Werte und sollte nicht geändert werden. Es wird später in meinem Projekt für eine andere Analyse markiert werden. So sollte es so aussehen:
2,1,0, NA, NA, 0,0 (keine Änderung).

Antwort

0

Ich benutze ein Paket, smwrBase, die Syntax für das Ausfüllen nur 1 fehlender Wert ist unten, aber Adresse id nicht.

Das Zoo-Paket könnte mehr Standard sein, das gleiche Problem aber.

zoo::na.approx(ss, maxgap=1) 

Unten ist ein Ansatz, der die variable ID berücksichtigt. Aktuelle Interpolationsansätze füllen den letzten Wert nicht gerne aus, also habe ich ein Handbuch hinzugefügt, falls stmt dafür. Ein bisschen brutale Gewalt, da da draußen vielleicht ein Tapply-Ansatz sein könnte.

> id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4) 
> time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6) 
> ss <- c(1,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0) 
> mydat <- data.frame(id, time, ss, ss2=NA_real_) 
> for (i in unique(id)) { 
+ # interpolate for gaps 
+ mydat$ss2[mydat$id==i] <- zoo::na.approx(ss[mydat$id==i], maxgap=1, na.rm=FALSE) 
+ # extension for gap as last value 
+ if(is.na(mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])])) { 
+  mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])] <- 
+  mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])-1] 
+ } 
+ } 
> mydat 
    id time ss ss2 
1 1 0 1 1.0 
2 1 1 3 3.0 
3 1 2 2 2.0 
4 1 3 3 3.0 
5 1 4 NA 1.5 
6 1 5 0 0.0 
7 1 6 0 0.0 
8 2 0 2 2.0 
9 2 1 4 4.0 
10 2 2 0 0.0 
11 2 3 NA 0.0 
12 2 4 0 0.0 
13 2 5 0 0.0 
14 2 6 0 0.0 
15 3 0 4 4.0 
16 3 1 1 1.0 
17 3 2 2 2.0 
18 3 3 4 4.0 
19 3 4 2 2.0 
20 3 5 3 3.0 
21 3 6 NA 3.0 
22 4 0 2 2.0 
23 4 1 1 1.0 
24 4 2 0 0.0 
25 4 3 NA NA 
26 4 4 NA NA 
27 4 5 0 0.0 
28 4 6 0 0.0 

Der interpolierte Wert in id = 1 1.5 (avg von 3 und 0), ID = 2 ist 0 (avg von 0 und 0 und ID = 3 3 (der Wert vorhergehende da es besteht Kein folgender Wert)

+1

Jonah M. ... ich habe die Bedeutung von id in Ihrer Beispieldatei nicht verstanden/verstanden, daher ist meine obige Lösung nur teilweise hilfreich – greengrass62

+0

Keine Sorge, ich schätze das. –

+0

Jonah. Siehe oben Antwort: – greengrass62