MaxB
MaxB

Reputation: 139

How to get univariate + multivariate survival analysis with R?

Using the survminer, ggplot2, and survival packages, I would like to create two Kaplan Meier plots:

I would like to get the KM plots + risk table with them that only show the four categories. I am using ggsurvplot but I am struggling to get my plot.

Thanks a lot!

Here is a sample of my dataset:

structure(list(sex = c("Male", "Female", "Male", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Female", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", 
"Male", "Female", "Male", "Male", "Male", "Male", "Male", "Male", 
"Female", "Male", "Male", "Male", "Male", "Female", "Female", 
"Male", "Female", "Female", "Male", "Male", "Female", "Female", 
"Female", "Male", "Male", "Male", "Male", "Male", "Male", "Female", 
"Male", "Male", "Female", "Female", "Male", "Male", "Female", 
"Female", "Female", "Male", "Female", "Female", "Male", "Male", 
"Female", "Male", "Female", "Male", "Male", "Male", "Male", "Male", 
"Male", "Female", "Male", "Male", "Male", "Male", "Male", "Male", 
"Female", "Male", "Male", "Male", "Male", "Male", "Male", "Male", 
"Female", "Female", "Female", "Male", "Male", "Male", "Female", 
"Male", "Male", "Female", "Male", "Male", "Female", "Male", "Male", 
"Male", "Male", "Male", "Female", "Female", "Male", "Male", "Female", 
"Female", "Male", "Male", "Female", "Male", "Male", "Female", 
"Female", "Female", "Male", "Male", "Male", "Male", "Male", "Male", 
"Male", "Female", "Male", "Male", "Female", "Male", "Female", 
"Male", "Male", "Male", "Female", "Male", "Male", "Male", "Male", 
"Female", "Female", "Male", "Female", "Male", "Male", "Male", 
"Male", "Male", "Male", "Female", "Female", "Male", "Male", "Male", 
"Male", "Female", "Male", "Female", "Male", "Male", "Female", 
"Female", "Male", "Male", "Female", "Male", "Male", "Female", 
"Female", "Male", "Male", "Male", "Male", "Male", "Male", "Female", 
"Female", "Male", "Male", "Male", "Male", "Male", "Male", "Female", 
"Male", "Male", "Female", "Male", "Male", "Female", "Female", 
"Male", "Male", "Female", "Female", "Female", "Female"), age = c(41, 
58, 63, 65, 62, 66, 68, 48, 68, 59, 63, 67, 64, 66, 52, 52, 69, 
64, 61, 67, 65, 67, 61, 62, 58, 54, 53, 66, 67, 67, 64, 65, 64, 
69, 63, 51, 67, 65, 68, 64, 65, 58, 62, 65, 67, 63, 60, 52, 69, 
69, 54, 53, 55, 68, 61, 46, 67, 67, 57, 55, 61, 65, 61, 66, 48, 
47, 69, 55, 58, 69, 64, 53, 65, 64, 62, 68, 64, 65, 60, 58, 54, 
43, 51, 69, 60, 69, 70, 64, 59, 65, 61, 69, 67, 63, 69, 58, 55, 
61, 63, 64, 65, 69, 62, 69, 61, 65, 60, 53, 41, 56, 61, 65, 65, 
68, 65, 51, 69, 52, 61, 54, 44, 63, 55, 62, 62, 68, 54, 63, 41, 
69, 67, 50, 65, 60, 59, 67, 66, 61, 67, 47, 63, 66, 65, 64, 57, 
52, 65, 65, 60, 44, 48, 67, 43, 63, 46, 59, 63, 66, 67, 62, 62, 
59, 70, 64, 65, 63, 62, 62, 42, 60, 62, 61, 64, 61, 60, 68, 64, 
56, 66, 61, 69, 62, 58, 59, 60, 57, 69, 47, 69, 51, 43, 63, 63, 
64, 68, 64, 60, 70, 66, 62), smoking_status = c(0, 0, 0, 0, 0, 
1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 0), match_MACE = c(0, 0, 1, 1, 0, 0, 0, 0, 1, 
1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 
0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 
1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 
0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 
1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 
0, 0), time_diff_MACE_months = c(72, 72, 28.4, 59.4, 72, 72, 
72, 72, 68.9, 11.4, 72, 72, 11.7, 7.8, 1.5, 72, 1.7, 16.8, 72, 
72, 72, 26.1, 72, 72, 62.3, 72, 72, 72, 38.9, 72, 72, 49.8, 72, 
72, 13, 26.4, 72, 72, 72, 72, 72, 18.8, 24, 49.9, 25.1, 72, 16.4, 
72, 27, 72, 72, 72, 72, 72, 72, 72, 3.6, 72, 72, 72, 72, 40.8, 
72, 1.6, 72, 72, 69, 3.4, 72, 28.1, 72, 72, 52.8, 72, 39.6, 72, 
59.9, 72, 72, 72, 72, 72, 72, 6.8, 72, 37.9, 72, 9.3, 18.7, 5.9, 
72, 37.1, 72, 72, 5.9, 72, 72, 20.4, 45.6, 68.5, 72, 72, 25.4, 
72, 72, 18.5, 72, 72, 72, 10.1, 24, 72, 72, 72, 72, 72, 11.3, 
72, 72, 72, 72, 41.6, 72, 72, 72, 66.6, 24.1, 72, 72, 8, 72, 
1.2, 72, 72, 72, 2.1, 30.6, 72, 10, 72, 55.5, 20.9, 67, 11.7, 
4, 72, 18, 14, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 7.7, 72, 
72, 72, 72, 64.3, 56.8, 2.6, 72, 3.9, 72, 72, 72, 72, 72, 72, 
72, 37.9, 22.6, 72, 72, 30.4, 72, 72, 72, 72, 34.5, 72, 8, 72, 
24.3, 72, 13.5, 9.3, 12, 72, 3, 1.3, 72, 72, 72, 72), match_RF_stroke = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), match_RF_HF = c(0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0), match_RF_AMI = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0), match_RF_T2D = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), match_RF_HTA = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), match_RF_MI = c(0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0), scoreMVPA = structure(c(1L, 1L, 2L, 1L, 3L, 
2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 
1L, 2L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 
2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 4L, 2L, 1L, 1L, 1L, 2L, 
2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 3L, 2L, 2L, 1L, 1L, 1L, 2L, 
1L, 2L, 2L, 4L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 4L, 2L, 2L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 3L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 
1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 
1L, 2L, 2L, 2L, 3L, 4L, 2L, 1L, 2L, 3L, 1L, 2L, 2L, 2L, 2L, 1L, 
2L, 2L, 2L, 2L, 1L, 3L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 
2L, 4L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 3L, 1L, 1L, 
2L, 2L, 4L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 
1L, 1L, 3L), levels = c("no AF proc + inactive", "no AF proc + active", 
"AF proc + inactive", "AF proc + active"), class = "factor")), row.names = c(NA, 
-200L), class = c("tbl_df", "tbl", "data.frame"))

Upvotes: 0

Views: 61

Answers (1)

U Bhalraam
U Bhalraam

Reputation: 131

This is the solution to your problem. I've fleshed out the UV code for you and left the MV for your own optimisation. I have stored your data as x.

library(survival)
library(survminer)

data1 <- x %>% data.frame()

UV <- survfit(Surv(time = time_diff_MACE_months, event = match_MACE) ~ scoreMVPA, data = data1)
MV <- coxph(Surv(time = time_diff_MACE_months, event = match_MACE) ~ age + sex + strata(scoreMVPA), data = data1)

plot3 <- ggsurvplot(UV,
                    pval = TRUE,
                    break.time.by = 10,
                    conf.int = FALSE,
                    risk.table = T, 
                    risk.table.y.text.col = TRUE,
                    xlim=c(0,75), 
                    legend.labs = c("no AF proc + inactive", "no AF proc + active", "AF proc + inactive", "AF proc + active"), 
                    xlab = "Months",
                    ylab = "% who do not incur MACE", 
                    palette = c("#fba30c", "#0077b8", "#06D6A0", "#002A32"), 
                    theme = "lancet", 
                    pval.coord = c(0,0.1), 
                    legend.title = "")

plot4 <- ggadjustedcurves(MV, data = data1)

UV plot plot3 MV plot plot4

Upvotes: 1

Related Questions