Log-Rank Test filtern

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Log-Rank Test filtern

Beitrag von MSch »

Hallo Zusammen,

meine Frage geht bezüglich des Log-Rank-Tests. Ich habe eine Überlebenszeitanalyse erstellt mit dem survial package und wollte nun mit dem Log-Rank-Test verschiedene Kurven miteinander vergleichen.

Code: Alles auswählen

Logrank_ÜLeben_G_Stadium <- survdiff(s_ÜLeben~G_Stadium, data = Studiendaten, rho=1)
Erkärung der Kürzel:

s_ÜLeben : Ist meine Überlebenskurve:

Code: Alles auswählen

s_ÜLeben <- Surv(Studiendaten$Ü_Monate, Studiendaten$Tod)
G_Stadum: Ist nun die Variable bezüglich ich den Unterschied untersuchen möchte diese ist entweder G_Stadium=1, G_Stadium=2 oder G_Stadium=3

der Logrank Test gibt mir nun wie gewünscht die Werte aus mit einem von z.B.: p-Wert= 0.04

So wie ich dies verstehe bezieht sich der Test darauf dass er G_Stadium=1 (also die 1. Variable) mit den beiden anderen vergleicht und sich der p-Wert nur auf den Unterschied der Gesamtheit also G_Stadium=2 und G_Stadium=3 bezieht.
Nun möchte ich aber gerne auch G_Stadium=2 nur mit G_Stadium=3 vergleichen oder G_Stadium=1 nur mit G_Stadium=3 jedoch verstehe ich nicht wie ich diesen Filter eingeben kann.

Versuche wie:

Code: Alles auswählen

Logrank_ÜLeben_G_Stadium <- survdiff(s_ÜLeben~G_Stadium==2, data = Studiendaten, rho=1) 
führten dazu dass alle G=1 und G=3 wieder in einen Topf geschmissen wurden und
versuche wie:

Code: Alles auswählen

Logrank_ÜLeben_G_Stadium <- survdiff(s_ÜLeben~G_Stadium==1 + G_Stadium==2, data = Studiendaten)
führten zu einem Fehler in der Berechnung

in den Kommentaren dieses videos
https://www.youtube.com/watch?v=f1g9a-J ... ielaKeller

heißt es dass für dieses Problem einen Filter gibt aber wie wende ich diesen korrekt an? Wie würde der Code aussehen.
Vielen Dank für die Hilfe im Voraus
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Log-Rank Test filtern

Beitrag von bigben »

Hallo MSch,

Hier steht die offizielle Dokumentation zur Funktion survdiff: https://www.rdocumentation.org/packages ... s/survdiff

Dort findest Du u.a. das Argument subset mit dem sich festlegen lässt, welche Fälle im Datensatz einbezogen werden sollen. Das scheint mir für Dein Problem zielführend zu sein.

Wenn Du hier im Forum konkreten Code erfragst, dann steigen die Chancen dafür, wenn Du ein reproduzierbares Minimalbeispiel, z. B. Musterdaten In R lesbarer Form postest.

LG, Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Log-Rank Test filtern

Beitrag von bigben »

Hallo,

ich muss nochmal was ergänzen. Was Du da versuchst, nämlich das Überleben nur nach histologischer Einschätzung zu beurteilen, ist vielleicht eine Hausaufgabe, dann will ich nichts gesagt haben. Wenn es aber der Versuch ist, eine wissenschaftliche Arbeit zu schreiben, dann ist der Logrank-Test wahrscheinlich die falsche Richtung.
Man schaut sich eigentlich keine Überlebensdaten an, ohne das Alter der Patienten einzubeziehen. Man schaut sich eigentlich keine onkologischen Daten an, ohne den Raucherstatus zu berücksichtige und für das Beurteilen von Überleben wäre es nicht nicht verkehrt, wenn Daten zur Frailty vorliegen. Vom TNM-Stadium ganz zu schweigen (solider Tumor vorausgesetzt). Das alles kann der Logrank-Test nicht leisten und deshalb solltest Du Dich wahrscheinlich nicht zulange damit aufhalten und stattdessen zügig zu einer Modellierung, typisch zu einem Cox-Proportional-Hazards-Modell, voranschreiten.

JMTC,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Log-Rank Test filtern

Beitrag von MSch »

Hi Bernhard,

vielen Dank erst mal für den Link. Es handelt sich dabei nicht um eine Hausaufgabe sondern wirklich ehr um eine wissenschaftliche Arbeit. Das im Bezug auf Krebs natürlich enorm viele Faktoren eine Rollen spielen ist klar. Bei diesem speziellen Fall sind jedoch die zu untersuchenden Daten bereits sehr weit aufgeschlüsselt und es soll in diesem Schritt wirklich nur noch bezüglich des G Stadiums unterschieden werden.
Leider ist es mir anhand der R-Dokumentation nicht wirklich klar wie ich mit dem Subset Argument umgehen soll. Hier würde mir einfach ein Beispiel genügen wie es aussehen soll.
Leider weiß ich nicht genau wie ich ein Beispieldatensatz hier am besten hoch lade daher versuche ich es mal so:

Code: Alles auswählen

Ü_Monate <-c(20,11,21,12,14,13,21,21,15,10)
Tod <- c(1,0,0,1,1,0,1,1,0,0)
G_Stadium <-(1,1,3,2,2,1,1,2,3,3)


Studiendaten <- data.frame(Ü_Monate, Tod, G_Stadium)
s_ÜLeben <- Surv(Studiendaten$Ü_Monate, Studiendaten$Tod)
Diese Drei Vektoren würden z.B. mein Datensatz Studiendaten ergeben.
Wie würde es nun aussehen wenn ich z.B. alle mit G_Stadium=1 und G_Stadium=3 vergleich wollte:

Code: Alles auswählen

Logrank_ÜLeben_G_Stadium <- survdiff(s_ÜLeben~G_Stadium, data = Studiendaten, subset=3, rho=1) 
führt zu nichts.

Auch hier schon mal Danke im Voraus
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Log-Rank Test filtern

Beitrag von bigben »

Hallo,
MSch hat geschrieben: Di Jul 26, 2022 9:17 am Bei diesem speziellen Fall sind jedoch die zu untersuchenden Daten bereits sehr weit aufgeschlüsselt und es soll in diesem Schritt wirklich nur noch bezüglich des G Stadiums unterschieden werden.
Wir sind ja auch ein R-Forum und ich bin abgewichen von Deiner Frage, wie man R am besten bedient.
Leider ist es mir anhand der R-Dokumentation nicht wirklich klar wie ich mit dem Subset Argument umgehen soll. Hier würde mir einfach ein Beispiel genügen wie es aussehen soll.

Das sollst Du gerne bekommen. Auf Deutsch würdest Du vielleicht sagen wollen: Benutze nur die Datensätze, in denen gilt: G_Stadium gleich eins oder G-Stadium gleich drei. In R-Code umgeschrieben hieße das dann

Code: Alles auswählen

G_Stadium == 1 | G_Stadium == 3
Im kompletten Kontext dann:

Code: Alles auswählen

library(survival)

Studiendaten <- data.frame(
  Ü_Monate = c(20,11,21,12,14,13,21,21,15,10),
  Tod = c(1,0,0,1,1,0,1,1,0,0),
  G_Stadium = c(1,1,3,2,2,1,1,2,3,3)
)
Studiendaten$s_ÜLeben <- Surv(Studiendaten$Ü_Monate, Studiendaten$Tod)

# alles gegen alles
survdiff(s_ÜLeben ~ G_Stadium, data = Studiendaten)

# G1 vs G2
survdiff(s_ÜLeben ~ G_Stadium, 
         subset = G_Stadium == 1 | G_Stadium == 2, 
         data  = Studiendaten, rho = 1)

# G1 vs G3
survdiff(s_ÜLeben ~ G_Stadium, 
         subset = G_Stadium == 1 | G_Stadium == 3, 
         data  = Studiendaten, rho = 1)

# G2 vs G3
survdiff(s_ÜLeben ~ G_Stadium, 
         subset = G_Stadium == 2 | G_Stadium == 3, 
         data  = Studiendaten, rho = 1)
Ich hoffe, das funktioniert so für Dich.
Leider weiß ich nicht genau wie ich ein Beispieldatensatz hier am besten hoch lade daher versuche ich es mal so:
Das hat doch ganz wunderbar funktioniert. Als der alte Besserwisser, der ich nunmal bin, habe ich das in meinem Code ein wenig angepasst. So, wie Du den Dataframe erstellt hast, sind alle Funktionen und Variablennamen doppelt vorhanden: Einmal im Dataframe und einmal im allgemeinen Namespace. Das ist erstmal kein Problem, kann aber eines werden, wenn man an einem von beiden Änderungen vornimmt und nicht genau weiß, auf welches eine Funktion jetzt zugreift. So wie ich es gemacht habe, sind alle Daten, die in den Dataframe gehören im Dataframe und auch nur dort. Ist nur so eine lockere Empfehlung am Rande und soll nicht zu aufdringlich sein.

Viele Grüße,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Log-Rank Test filtern

Beitrag von MSch »

Hi
bigben hat geschrieben: Di Jul 26, 2022 2:46 pm Im kompletten Kontext dann:
CODE: ALLES AUSWÄHLEN

library(survival)

Studiendaten <- data.frame(
Ü_Monate = c(20,11,21,12,14,13,21,21,15,10),
Tod = c(1,0,0,1,1,0,1,1,0,0),
G_Stadium = c(1,1,3,2,2,1,1,2,3,3)
)
Studiendaten$s_ÜLeben <- Surv(Studiendaten$Ü_Monate, Studiendaten$Tod)

# alles gegen alles
survdiff(s_ÜLeben ~ G_Stadium, data = Studiendaten)

# G1 vs G2
survdiff(s_ÜLeben ~ G_Stadium,
subset = G_Stadium == 1 | G_Stadium == 2,
data = Studiendaten, rho = 1)

# G1 vs G3
survdiff(s_ÜLeben ~ G_Stadium,
subset = G_Stadium == 1 | G_Stadium == 3,
data = Studiendaten, rho = 1)

# G2 vs G3
survdiff(s_ÜLeben ~ G_Stadium,
subset = G_Stadium == 2 | G_Stadium == 3,
data = Studiendaten, rho = 1)
Ich hoffe, das funktioniert so für Dich.
vielen Dank es klappt genau wie ich mir vorgestellt habe. Auf das oder Zeichen hätte ich selber kommen können und ja == hab ich bei mir im Skript verwendet aber da gab es dann eben nur noch G1/G2/G3 was zu einem Fehler führte.

bigben hat geschrieben: Di Jul 26, 2022 2:46 pm MSch hat geschrieben: ↑Di Jul 26, 2022 9:17 am
Bei diesem speziellen Fall sind jedoch die zu untersuchenden Daten bereits sehr weit aufgeschlüsselt und es soll in diesem Schritt wirklich nur noch bezüglich des G Stadiums unterschieden werden.
Wir sind ja auch ein R-Forum und ich bin abgewichen von Deiner Frage, wie man R am besten bedient.
Fand ich sehr erfrischend, dass du auch direkt nach dem Sinn der Auswertung fragst. Es hat mich jedenfalls auch noch mal angeregt über den ein oder anderen Punkt nachzudenken und wird meine Arbeit ehr bereichern.
bigben hat geschrieben: Di Jul 26, 2022 2:46 pm Das sollst Du gerne bekommen. Auf Deutsch würdest Du vielleicht sagen wollen: Benutze nur die Datensätze, in denen gilt: G_Stadium gleich eins oder G-Stadium gleich drei. In R-Code umgeschrieben hieße das dann
CODE: ALLES AUSWÄHLEN

G_Stadium == 1 | G_Stadium == 3
ja da ist mein Gehirn wohl kurz aus dem R-Modus gerutscht ^^

bigben hat geschrieben: Di Jul 26, 2022 2:46 pm Das hat doch ganz wunderbar funktioniert. Als der alte Besserwisser, der ich nunmal bin, habe ich das in meinem Code ein wenig angepasst. So, wie Du den Dataframe erstellt hast, sind alle Funktionen und Variablennamen doppelt vorhanden: Einmal im Dataframe und einmal im allgemeinen Namespace. Das ist erstmal kein Problem, kann aber eines werden, wenn man an einem von beiden Änderungen vornimmt und nicht genau weiß, auf welches eine Funktion jetzt zugreift. So wie ich es gemacht habe, sind alle Daten, die in den Dataframe gehören im Dataframe und auch nur dort. Ist nur so eine lockere Empfehlung am Rande und soll nicht zu aufdringlich sein.
Danke für die Anpassung. Ich werde es mir zu Herzen nehmen. Das mit dem doppeln kommt noch aus der Zeit als ich mir R beigebracht habe. Hatte Anfangs große Probleme die Variablen-Typen zu verstehen und wann welche wie definiert werden, daher hab ich diese meist im Voraus definiert und anschließend mit den Daten gefüllt ^^.
Antworten