Visualisierung von Längsschnittdaten mit binärem Ergebnis

8

Für Längsschnittdaten mit einem numerischen Ergebnis kann ich Spaghetti-Diagramme verwenden, um die Daten zu visualisieren. Zum Beispiel so etwas (entnommen aus der UCLA Stats-Site):

tolerance<-read.table("http://www.ats.ucla.edu/stat/r/faq/tolpp.csv",sep=",", header=T)
head(tolerance, n=10)
interaction.plot(tolerance$time, tolerance$id, tolerance$tolerance, 
                 xlab="time", ylab="Tolerance",  legend=F)

Geben Sie hier die Bildbeschreibung ein

Aber was ist, wenn mein Ergebnis binär 0 oder 1 ist? Zum Beispiel zeigt in den "ohio" -Daten in R die binäre "resp" -Variable das Vorhandensein einer Atemwegserkrankung an:

library(geepack)
ohio2 <- ohio[2049:2148,]
head(ohio2, n=12)
      resp  id age smoke
 2049    1 512  -2     1
 2050    0 512  -1     1
 2051    0 512   0     1
 2052    0 512   1     1
 2053    1 513  -2     1
 2054    0 513  -1     1
 2055    0 513   0     1
 2056    1 513   1     1
 2057    1 514  -2     1
 2058    0 514  -1     1
 2059    0 514   0     1
 2060    1 514   1     1

interaction.plot(ohio2$age+9, ohio2$id, ohio2$resp, 
                 xlab="age", ylab="Wheeze status", legend=F)

Geben Sie hier die Bildbeschreibung ein

Die Spaghetti-Handlung gibt eine schöne Figur, ist aber nicht sehr informativ und sagt mir nicht viel. Was wäre ein geeigneter Weg, um diese Art von Daten zu visualisieren? Vielleicht etwas, das einen Wahrscheinlichkeitswert auf der y-Achse enthält?

Emilia
quelle
1
Wenn ich den Durchschnitt der Reaktion gegen das Alter aufzeichne, fange ich an. Die nächste Stufe könnte die Bruchteile der Übergänge 00, 01, 10, 11 in jedem Alter anzeigen.
Nick Cox
Meine aktuelle Version von R enthält nicht die ohioDaten (2.15) (zumindest nicht als Teil der Basis). Ist es in einer neueren Version oder über eine andere Bibliothek? Dies wäre eine interessante Anwendung für eine Wärmekarte mit Personen auf der Y-Achse und Ergebnissen auf der X-Achse. Zeichnen Sie dann 1 Antworten als schwarz und 0 Antworten als weiß. Durch Sortieren der Matrix erhalten Sie dann einen Überblick über die Häufigkeit unterschiedlicher Muster.
Andy W
@Andy Ich musste mich umsehen ... es stellte sich heraus, dass es im geepackPaket ist.
Penguin_Knight
Ja, tut mir leid. Ich habe meinen Beitrag oben geändert.
Emilia
Bitte lesen Sie den Artikel "Dynamik aus multivariablen Längsschnittdaten" (speziell für Binärdaten) doi: 10.1155 / 2014/901838.

Antworten:

14

Es gibt einige Möglichkeiten, dies zu umgehen.

Jitter die Variablen leicht, um die Linien auseinander zu verschmieren

Erstens, da sowohl das Alter als auch das Ergebnis sehr diskret sind, können wir es uns leisten, sie leicht zu zittern, um einige Trends aufzuzeigen. Der Trick besteht darin, Transparenz in der Linienfarbe zu verwenden, damit das Ausmaß der Überlappung leichter erkannt werden kann.

library(geepack)
set.seed(6277)

ohio2 <- ohio[2049:2148,]
head(ohio2, n=12)

jitteredResp <- ohio2$resp + rnorm(100,0,0.02)   # $
jitteredAge  <- ohio2$age+9 + rnorm(100,0,0.02)  # $
age          <- ohio2$age+9                      # $
id           <- ohio2$id                         # $
wheeze       <- ohio2$resp                       # $

#### Variation 1 ####
plot(jitteredAge, jitteredResp, type="n", axes=F,
     xlab="Age to the nearest year, jittered",
     ylab="Wheeze status, jittered")
for (i in id){
  par(new=T)
  lines(age[id==i], jitteredResp[id==i], col="#FF000008", lwd=2)
}
axis(side=1, at=seq(7,10))
axis(side=2, at=c(0,1),  label=c("No", "Yes"))

Geben Sie hier die Bildbeschreibung ein

Lust bekommen

Es ist auch möglich, diese Art von Kurven zu verwenden, um den Fluss der Motive anzuzeigen. Es ist wie eine Modifikation des obigen Diagramms, verwendet jedoch die Breite der Linie, um die Frequenz darzustellen, anstatt Überlappungen zu verwenden.

Geben Sie hier die Bildbeschreibung ein

Zeigen Sie das Schicksal eines jeden Falles

Dies mag kontraintuitiv klingen, aber wenn Sie die Fälle systematisch anordnen, funktioniert es genauso gut, die aggregierte Geschichte zu erzählen. Hier wird das Ergebnis jedes Falles entlang einer grauen Farbreferenzlinie angezeigt. Ich habe dort keine Legende legendhinzugefügt, aber mit dem Befehl kann sie ganz einfach hinzugefügt werden. Blau ist "resp = 0" und Rot ist "resp = 1". Die Zeit (Alter) ist auf der x-Achse verteilt. Ihre Daten sind bequem nach Ergebnismustern sortiert, sodass ich nichts tun musste. Wenn sie nicht vorsortiert sind, müssen Sie den Befehl wie dcastim Paket verwenden, reshape2um die Daten ein wenig zu massieren.

#### Variation 2 ####
my.col             <- vector()
my.col[wheeze ==1] <- "#D7191C"
my.col[wheeze ==0] <- "#2C7BB6"

plot(age, id, type="n", frame=F, xlab="Age, year", ylab="", axes=F, xlim=c(7,10))
abline(h=id, col="#CCCCCC")
axis(side=1, at=seq(7,10))
mtext(side=2, line=1, "Individual cases")
points(age, id, col=my.col, pch=16)

Geben Sie hier die Bildbeschreibung ein

Tabellierung

Visualisierung ist nicht der einzige Ausweg. Da es höchstens 16 verschiedene Muster geben würde, können Sie diese auch tabellieren. Verwendung +und -zu erstellen Muster wie + + + +und + - - -und dann für jedes dieser Muster, die Zählwerte und Prozent befestigen. Dies kann die Informationen gleichermaßen effektiv anzeigen.

Pinguin_Kacht
quelle