R: Tibble vs ggplot2 (การพล็อตกราฟ)
ฉันพยายามทำตามบทช่วยสอนใน R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/) คอมพิวเตอร์ที่ฉันใช้ในการทำงานไม่มีพอร์ต USB หรือการเชื่อมต่ออินเทอร์เน็ตมีเพียง R ที่ติดตั้งไลบรารีไม่กี่แห่ง คอมพิวเตอร์ที่ทำงานของฉันมี "survival, ranger, ggplot2 และ dplyr" อย่างไรก็ตามมันไม่มี "ggfortify" ฉันพยายามหาวิธีการพล็อตกราฟจากบทช่วยสอนโดยไม่ใช้ "ggfortify" นี่คือรหัสที่ฉันใช้ด้านล่าง:
#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)
อย่างไรก็ตามฉันไม่สามารถใช้งานได้:
#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
หรือใช้งานได้:
# ส่วนที่ 3: ไม่ทำงาน
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
ใครช่วยแก้ไขให้ฉันหน่อยได้ไหม
ขอบคุณ (Previous Post: R: plotting graphs (ggplot vs autoplot) )
คำตอบ
คุณจะต้องทำงานนักสืบ!
ฉันมีเวลาสำหรับตอนที่ 2 ในวันนี้ km_trt_fit$strataดังนั้นมันจะเปิดออกว่าข้อมูลเกี่ยวกับชั้นที่มีอยู่ในองค์ประกอบ ดูเหมือนว่า:
km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)
km_trt_fit$strata
#> trt=1 trt=2
#> 61 53
นี่กำลังบอกคุณว่ามี 61 องค์ประกอบtrt=1และ 53 องค์ประกอบของtrt=2. ฉันไม่รู้ว่าทำไมสิ่งเหล่านี้ไม่รวมกันถึง 137 (จำนวนแถวในveteran) แต่ฉันคิดว่านั่นเป็นเพียงวิธีการsurvfit()ทำงาน veteran$trtนอกจากนี้ยังเป็นเหตุผลที่คุณจะได้รับข้อผิดพลาดเพราะส่งผลให้ข้อมูลแบบมีจำนวนที่แตกต่างกันของแถวกว่ากรอบข้อมูลเดิมที่คุณกำลังพยายามที่จะรวมโดยใช้
วิธีแก้ปัญหาของฉัน: สร้างเวกเตอร์ที่strataมีองค์ประกอบ 61 และ 53 ของtrt=1และtrt=2ตามลำดับ:
strata = km_trt_fit$strata
strata = rep(names(strata), times = strata)
รวมสิ่งนั้นไว้ในข้อมูลที่คุณป้อน:
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)
ผลลัพธ์ค่อนข้างใกล้เคียงกับบทช่วยสอน
ฉันไม่คุ้นเคยกับ ggfortify มากเกินไป แต่งานของมันอาจจะต้องทำสิ่งที่คล้ายกันสำหรับคุณโดยอัตโนมัติ ในกรณีที่ไม่มีคุณจะต้องตรวจสอบโครงสร้างที่สร้างโดยฟังก์ชันแบบจำลองและดึงข้อมูลด้วยตนเองเหมือนที่ฉันทำข้างต้น