Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Methoden der Zeitreihenanalyse

Moderator: schubbiaschwilli

Antworten
Liselotte
Beiträge: 5
Registriert: Mo Sep 02, 2019 4:06 pm

Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von Liselotte »

Hallo,

ich bin neu hier und beschäftige mich erst seit ca. 6 Monaten mit R und hoffe nun, dass mir jemand bei meinem Problem weiterhelfen kann.
Ich möchte eine Kaplan Meier Kurve erstellen, die nach der Information "1" von 14 Spalten aufgezeigt werden soll.
Mein Ziel ist es eine Kaplan Meier Kurve zu erstellen, die nur mit den 14 Spalten mit der Zeileninfo "1" Berechnungen durchführt.
Die Berechnung soll einzelnd nach Spalten (z.B M1_Knochen, M1_Lunge) aufgetragen werden, sodass man 14 einzelne Kurven erhält die man in einer Grafik vergleichen kann.

#Spalteninfos:
str(M1_Knochen)
Factor w/ 2 levels "0","1": 2 2 1 1 2 2 2 1 2 1 ...
#Ausgabe, sieht so aus:
R_BereinigtEinlesen_20190320_1507$M1_Knochen
[1] 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 1 0
[48] 1 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
[95] 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0
[142] 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 0
[189] 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0
Levels: 0 1

str(M1_Leber)
Factor w/ 2 levels "0","1": 2 1 1 2 2 2 2 1 1 1 ...

str(M1_LK)
Factor w/ 2 levels "0","1": 2 1 1 1 1 2 1 2 2 2 ...
usw.
Alle Spalten haben das Format "Factor" und jeweils nur das Level "0" oder "1".
Wenn man nach "1" filtert (Gruppe_Knochen <- subset(R_BereinigtEinlesen_20190320_1507, M1_Knochen=="1")), aber eine unterschiedliche Länge (z.B. M1_Leber: 110 obs., M1_Knochen: 162 obs. ).

Leider habe ich bisher nur pro Spalte eine Einzelgrafik erstellen können, in der die Berechnung nach "0" und "1" durchgeführt wird.

#Mein Arbeitsstand:
#Survival Objekt
str(surv_y)
'Surv' num [1:233, 1:2] 2.460 7.742 4.614 4.770 3.419 2.759 2.737+ 5.055+ 3.400 10.293 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "time" "status"
- attr(*, "type")= chr "right"

#Kaplan Meier Kurve
#Spalte Knochen
fit_1_Knochen<- survfit(surv_y~M1_Knochen, data = R_BereinigtEinlesen_20190320_1507)
plot(fit_1_Knochen, xlab = "Überlebenszeit [Jahre]", ylab= "Überleben [%]",yscale = 100, las=1,
col = c("deeppink3", "blue"), main= "Überleben M1= Knochen")
legend("topright", title = "Status", c("NEIN", "JA"), fill =c("deeppink3", "blue"))

#usw. für jede Spalte einzelnd durchgeführt.


Habt Ihr eine Lösung dafür, alle 14 Spalten in einer Grafik darzustellen?


Vielen Dank schonmal.
Anne
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von bigben »

Hallo Anne,

bitte setze nicht voraus, dass wir Deine Daten kennen oder verstehen. Nach meinem sicherlückenhaften Verständnis trägt man in einer Kaplan-Meier-Kurve die Zahl der noch lebenden über die Zeit auf. Augenscheinlich hast Du für jeden Metastasierungsort je einen Vektor mit Nullen und Einsen. Vermutlich repräsentiert jeder dieser Werte einen Patienten. Wo kommt jetzt die Information über den Zeitverlauf her?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Liselotte
Beiträge: 5
Registriert: Mo Sep 02, 2019 4:06 pm

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von Liselotte »

Hallo Bernhard,

genau, die Kaplan Meier Kurve trägt die Überlebenszeit (Erstdiagnose-Tod) der Patienten mit dem Ereignis= "1" (Verstorben) und mit keinem Ereignis= "0", über die Zeit auf. Dafür gibt es einen definierten Ereignisvektor.
str(Ereignis)
num [1:233] 1 1 1 1 1 1 0 0 1 1 ...

Die Information über den Zeitverlauf ist so definiert:
surfJahre <- time_length (difftime(Tod, DtED), "years")#Überlebens Objekt
surv_y <- Surv(surfJahre, Ereignis)# Überlebens Objekt unter Einbezug des Ereignis

Ja, für jeden Metastasierungsort gibt es einen Vektor mit "0" und "1". Jeder Patient hat Informationen zu allen 14 Metastasierungsorten/ 14 Spalten.
"1" bedeutet, dass der Patient an diesem Metastasierungsort erkrankt ist, "0" : nicht erkrankt.
Nur an dem Metastasierungsort erkrankte (z.B. Knochenmetastasen Verktor: "1"), sollen in die Berechnung der Knochenmetastasenkurve einfließen.
Für jede der 14 Metastasierungsorte soll eine eigene Kurve erstellt werden und alle in einer Grafik nebeneinander dargestellt werden. (siehe Bild 1)

Ich bekomme aber nur Bild 2 dargestellt, da ich nicht weis wie man nur Vektor "1" in Metastasierungsort filtert und dann alle 14 Grafiken in einer darstellt. Also das war so meine Idee wie man das Problem lösen könnte.....

Viele Grüße
Anne
Dateianhänge
Bild2: Spalte Knochenmetastasen
Bild2: Spalte Knochenmetastasen
ÜLZ_Knochen.png (6.92 KiB) 1519 mal betrachtet
Bild 1: So soll meine Grafik auch aussehen.
Bild 1: So soll meine Grafik auch aussehen.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von bigben »

Ok, es gibt also für jeden Metastasierungsort einen Vektor von 0 und 1 und es gibt einen zweiten Vektor, der eine Anzahl von Lebensjahren enthält. Du möchtest nun aus dem Lebensjahrevektor eine Auswahl bilden, bei der nur die Patienten erhalten bleiben, die in einem bestimmten Metastasierungsort positiv sind. Hilft Dir folgendes?

Code: Alles auswählen

M1_Knochen <- factor(c(1, 0, 1, 0, 1, 0, 1)) # im Beispiel jeder zweite
survival <- c(1, 2, 3, 4, 5, 6, 7)  # Hier Zahlen und keine difftime-Objekte, sollte aber trotzdem passen

survival.bones <- survival[M1_Knochen=="1"]  # Auswahl durch eckige Klammern
print(survival.bones)  # Und jetzt bleibt nur noch jeder zweite übrig
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Liselotte
Beiträge: 5
Registriert: Mo Sep 02, 2019 4:06 pm

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von Liselotte »

Hallo Bernhard,

danke mit Deinem Code klappt das Filtern des Lebensjahresvektors nach Metastasierungsort.

Allerdings gelingt mir mit folgenden 3 Codes die grafische Darstellung nicht:

Code: Alles auswählen

plot(survival.bones, survival.Leber)
Error in match.arg(conf.int, c("both", "only", "none")) :
'arg' must be NULL or a character vector
In addition: There were 12 warnings (use warnings() to see them)

Code: Alles auswählen

plot(c(survival.bones, survival.Leber))
Siehe Bild 3.

Code: Alles auswählen

plot(survival.bones,col= "blue")
lines(survival.Leber, col="red")
Error in lines.Surv(survival.Leber, col = "red") :
method not defined for a Surv object

Gibt es einen Grafikbefehl, der dazu führt, dass die Lebensjahresvektoren nach Metastasierungsort getrennt dargstellt werden (also eine Kurve für Knochen, eine für Leber, usw.) ? Entschuldige, falls das eine doofe Frage ist, aber ich habe bei meiner Recherche nichts passendes gefunden.

Viele Grüße
Anne
Dateianhänge
Beide Lebensjahresvektoren (Knochen, Leber) werden in einer Kurve dargestellt :(<br />(Funktion : plot(c(survival.bones, survival.Leber))
Beide Lebensjahresvektoren (Knochen, Leber) werden in einer Kurve dargestellt :(
(Funktion : plot(c(survival.bones, survival.Leber))
Grafikversuch.png (5.6 KiB) 1498 mal betrachtet
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von bigben »

Hallo Liselotte,

Du verwendest bestimmt irgendein schönes package für Deine Überlebens-Analysen und ich glaube, das hast Du noch nicht genannt. Da ich mit mich Überlebensanalysen in R noch nicht beschäftigt habe, kann ich nur raten. Manche Packages implementieren ein add-Argument so in dieser Art:

Code: Alles auswählen

plot(survival.bones)
plot(survival.Leber, add=TRUE)
Ist zumindest einen Versuch wert. Wenn für diesen Datentyp keine plot-Funktion mit "add"-Argument und keine lines-Funktion definiert ist, bleibt Dir die Möglichkeit, die Koordinaten aus dem Surv-Objekt herauszulesen und die "normale" lines-Funktion auf die Koordinaten direkt anzuwenden.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Liselotte
Beiträge: 5
Registriert: Mo Sep 02, 2019 4:06 pm

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von Liselotte »

Hallo Bernhard,

das von mir verwendete Package heißt "survival".
In der Package Beschreibung habe ich leider nichts äquivalentes zu "add" gefuden.

Der einfache "add" Befehl funktioniert leider nicht.

Code: Alles auswählen

> plot(survival.bones)
> plot(survival.Leber, add=T)
Warning messages:
1: In plot.window(...) : "add" ist kein Grafikparameter
2: In plot.xy(xy, type, ...) : "add" ist kein Grafikparameter
3: In axis(side = side, at = at, labels = labels, ...) :
"add" ist kein Grafikparameter
4: In axis(side = side, at = at, labels = labels, ...) :
"add" ist kein Grafikparameter
5: In box(...) : "add" ist kein Grafikparameter
6: In title(...) : "add" ist kein Grafikparameter

auch das hier funktioniert nicht:

Code: Alles auswählen

plot(survival.bones)
plot(survival.Leber, type = "add")
Error in plot.survfit(survfit(x ~ 1), ...) :
The graphical argument 'type' is not allowed


Wie man Koordinaten aus dem surv-Objekt herausliest weiss ich nicht sowas habe ich noch nie gemacht, das hört sich ziemlich komplex an. :shock:

Habe ich im survival Paket einen Befehl übersehen, oder gibt es noch eine andere Möglichkeit?

Viele Grüße
Anne
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von jogo »

Hallo Anne,

ich habe mir mal die Beispiele zur Funktion survfit() angesehen (example(survfit.formula)). Meinst Du sowas:

Code: Alles auswählen

library("survival")
#fit a Kaplan-Meier and plot it 
fit <- survfit(Surv(time, status) ~ x, data = aml) 

plot(fit, lty = 2:3) ## oder:
plot(fit, col=c("green", "red"))
:?:

Dies habe ich auch noch gefunden:
https://youtu.be/f1g9a-JdAVA

Gruß, Jörg
Liselotte
Beiträge: 5
Registriert: Mo Sep 02, 2019 4:06 pm

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von Liselotte »

Hallo Jörg,

danke fürs Nachschauen. Das ist der allgemeine Code zum plotten, damit habe ich die Grafik für eine Metastasierungspalte hinbekommen.
Aber ich benötige ein Argument um alle 14 Kurven der Überlebens-Funktion, in einer Grafik darzustellen.
Danke für den Link, das Video ist gut aber behandelt leider nur die allgemeine grafische Darstellung und hat keine neuen Infos für mein Problem.

Viele Grüße
Anne
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen

Beitrag von jogo »

Hallo Anne,

ohne ein reproduzierbares Beispiel deinerseits (siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=11 ) wird es schwierig, Dir konkrete Hilfe zu geben. ... oder auch https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example

(wenn ich alles richtig verstanden habe:)
Eigentlich müsstest Du den Dataframe so umwandeln, dass die 14 Spalten nicht nebeneinanderstehen, sondern untereinander versehen mit einer weiteren Spalte, die den Metastasierungsort angibt. Das wäre also ein reshape wide to long https://stackoverflow.com/questions/2185252/reshaping-data-frame-from-wide-to-long-format
Dann lässt sich der Metastasierungsort in der Formel für survfit() auf der rechten Seite angeben (als Gruppierungsvariable).
(siehe Video ab 2:35min)

Hier habe ich noch ein Beispiel:

Code: Alles auswählen

library("survival")
L <- lung[!is.na(lung$ph.ecog),]
Fit <- survfit(Surv(time, status) ~ ph.ecog, data=L)
plot(Fit, col=1:4)
legend(x="right", legend=unique(L$ph.ecog), fill=1:4)
(entlehnt aus example(Surv) plus etwas Farbe)

Gruß, Jörg
Antworten