R: Tibble vs ggplot2 (vẽ biểu đồ)

Nov 27 2020

Tôi đang cố gắng làm theo một hướng dẫn trong R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/Máy tính tôi đang sử dụng để làm việc không có cổng USB hoặc kết nối internet - nó chỉ có R với một vài thư viện được cài đặt. Máy tính làm việc của tôi có "Survival, ranger, ggplot2 và dplyr". Tuy nhiên, nó không có "ggfortify". Tôi đang cố gắng tìm ra cách vẽ biểu đồ từ hướng dẫn mà không có 'ggfortify'. Đây là mã tôi đang sử dụng bên dưới:

  #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)

Tuy nhiên, tôi không thể làm cho điều này hoạt động:

#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

Hoặc phần này hoạt động:
# Phần 3: không hoạt động

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

Ai đó có thể vui lòng giúp tôi sửa những điều này?

Cảm ơn (Bài trước: R: vẽ đồ thị (ggplot vs autoplot) )

Trả lời

1 jakub Nov 27 2020 at 21:20

Bạn sẽ phải làm một số công việc thám tử!

Tôi có thời gian cho phần # 2 hôm nay. Vì vậy: Hóa ra, thông tin về địa tầng được chứa trong phần tử km_trt_fit$strata. Nó trông như thế này:

km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)

km_trt_fit$strata

#> trt=1 trt=2 
#>    61    53

Điều này cho bạn biết rằng có 61 phần tử trt=1và 53 phần tử của trt=2. Tôi không biết tại sao những thứ này không cộng đến 137 (số hàng trong veteran) nhưng tôi cho rằng đó chỉ là cách survfit()hoạt động. Đó cũng là lý do khiến bạn gặp lỗi, bởi vì dữ liệu mô hình kết quả có số hàng khác với khung dữ liệu ban đầu, mà bạn đang cố đưa vào bằng cách sử dụng veteran$trt.

Giải pháp của tôi: Tạo một vectơ stratacó 61 và 53 phần tử của trt=1trt=2tương ứng:

strata = km_trt_fit$strata
strata = rep(names(strata), times = strata)

Bao gồm điều đó trong dữ liệu đầu vào của bạn:

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)

Kết quả là khá gần với những gì hướng dẫn có.

Tôi không quá quen thuộc với ggfortify nhưng công việc của nó có lẽ là làm một việc tương tự cho bạn một cách tự động. Trong trường hợp không có nó, bạn sẽ phải điều tra các cấu trúc được tạo ra bởi các hàm mô hình và trích xuất dữ liệu theo cách thủ công như tôi đã làm ở trên.