Kaplan Meier Analyse- Gemeinsame Grafik erstellen
Moderator: schubbiaschwilli
Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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
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
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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
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
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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
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
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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?
LG,
Bernhard
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
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
Hallo Bernhard,
danke mit Deinem Code klappt das Filtern des Lebensjahresvektors nach Metastasierungsort.
Allerdings gelingt mir mit folgenden 3 Codes die grafische Darstellung nicht:
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)
Siehe Bild 3.
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
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)
'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))
Code: Alles auswählen
plot(survival.bones,col= "blue")
lines(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 :(
(Funktion : plot(c(survival.bones, survival.Leber)) - Grafikversuch.png (5.6 KiB) 1844 mal betrachtet
- Beide Lebensjahresvektoren (Knochen, Leber) werden in einer Kurve dargestellt :(
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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:
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
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)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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.
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:
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.
Habe ich im survival Paket einen Befehl übersehen, oder gibt es noch eine andere Möglichkeit?
Viele Grüße
Anne
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)
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")
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.
Habe ich im survival Paket einen Befehl übersehen, oder gibt es noch eine andere Möglichkeit?
Viele Grüße
Anne
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
Hallo Anne,
ich habe mir mal die Beispiele zur Funktion survfit() angesehen (example(survfit.formula)). Meinst Du sowas:
Dies habe ich auch noch gefunden:
https://youtu.be/f1g9a-JdAVA
Gruß, Jörg
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
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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
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
Re: Kaplan Meier Analyse- Gemeinsame Grafik erstellen
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:
(entlehnt aus example(Surv) plus etwas Farbe)
Gruß, Jörg
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)
Gruß, Jörg