R: Tibble vs ggplot2 (Diagramme zeichnen)
Ich versuche einem Tutorial in R zu folgen (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/). Der Computer, den ich für die Arbeit verwende, hat keinen USB-Anschluss oder keine Internetverbindung - er hat nur R mit einigen installierten Bibliotheken. Mein Arbeitscomputer hat "Survival, Ranger, ggplot2 und dplyr". Es hat jedoch nicht "ggfortify". Ich versuche herauszufinden, wie die Grafiken aus dem Tutorial ohne 'ggfortify' gezeichnet werden können. Hier ist der Code, den ich unten verwende:
#load libraries
library(survival)
library(ranger)
library(ggplot2)
library(dplyr)
#load data
data(veteran)
head(veteran)
#Part 1 : works
# Kaplan Meier Survival Curve
km <- with(veteran, Surv(time, status))
km_fit <- survfit(Surv(time, status) ~ 1, data=veteran)
#plot(km_fit, xlab="Days", main = 'Kaplan Meyer Plot') #base graphics is always ready
tibble(time = km_fit$time, surv = km_fit$surv,
min = km_fit$lower, max = km_fit$upper) %>%
ggplot(aes(x = time)) +
geom_line(aes(y = surv)) +
geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)
Ich kann dies jedoch nicht zum Laufen bringen:
#Part 2: does not work
km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)
tibble(time = km_trt_fit$time, surv = km_trt_fit$surv,
min = km_trt_fit$lower, max = km_trt_fit$upper) %>%
ggplot(aes(x = time, group = factor(veteran$trt), colour = factor(veteran$trt), fill = factor(veteran$trt))) +
geom_line(aes(y = surv)) +
geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)
Error: Aesthetics must be either length 1 or the same as the data (114): group, colour and fill
Oder dies funktioniert:
#Teil 3: funktioniert nicht
vet <- mutate(veteran, AG = ifelse((age < 60), "LT60", "OV60"),
AG = factor(AG),
trt = factor(trt,labels=c("standard","test")),
prior = factor(prior,labels=c("N0","Yes")))
aa_fit <-aareg(Surv(time, status) ~ trt + celltype +
karno + diagtime + age + prior ,
data = vet)
tibble(time = aa_fit$time, surv = aa_fit$surv, min = aa_fit$lower, max = aa_fit$upper) %>%
ggplot(aes(x = time)) +
geom_line(aes(y = surv)) +
geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)
Error: geom_line requires the following missing aesthetics: y
Kann mir bitte jemand helfen, diese zu korrigieren?
Danke (Vorheriger Beitrag: R: Diagramme zeichnen (ggplot vs autoplot) )
Antworten
Sie müssen Detektivarbeit leisten!
Ich habe heute Zeit für Teil 2. Also: Es stellt sich heraus, dass die Informationen über die Schichten im Element enthalten sind km_trt_fit$strata
. Es sieht aus wie das:
km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)
km_trt_fit$strata
#> trt=1 trt=2
#> 61 53
Dies sagt Ihnen, dass es 61 Elemente von trt=1
und 53 Elemente von gibt trt=2
. Ich weiß nicht, warum diese nicht 137 (die Anzahl der Zeilen in veteran
) ergeben, aber ich gehe davon aus, dass das genau so survfit()
funktioniert. Dies ist auch der Grund, warum Sie den Fehler erhalten, da die resultierenden Modelldaten eine andere Anzahl von Zeilen aufweisen als der ursprüngliche Datenrahmen, den Sie mithilfe von einschließen möchten veteran$trt
.
Meine Lösung: Erstellen Sie einen Vektor strata
mit 61 und 53 Elementen trt=1
und trt=2
jeweils:
strata = km_trt_fit$strata
strata = rep(names(strata), times = strata)
Nehmen Sie das in Ihre Eingabedaten auf:
tibble(time = km_trt_fit$time, surv = km_trt_fit$surv,
min = km_trt_fit$lower, max = km_trt_fit$upper,
trt = factor(strata)) %>%
ggplot(aes(x = time, colour = trt, fill = trt)) +
geom_line(aes(y = surv)) +
geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)
Das Ergebnis kommt dem des Tutorials ziemlich nahe.
Ich bin mit ggfortify nicht allzu vertraut, aber seine Aufgabe ist es wahrscheinlich, automatisch etwas Ähnliches für Sie zu tun. In Abwesenheit müssen Sie die von den Modellfunktionen erzeugten Strukturen untersuchen und die Daten manuell extrahieren, wie ich es oben getan habe.