绘制ggplot中连续协变量的预测生存曲线

时间:2016-10-05 11:08:03

标签: r ggplot2 survival-analysis cox-regression broom

如何在cox比例风险模型中绘制连续协变量代表值的生存曲线?具体来说,我想在ggplot中使用" survfit.cox" " survfit"宾语。

这可能看起来像是一个已经回答的问题,但我已经搜索了SO中的所有内容,其中包括“幸存”和“#和' newdata' (加上许多其他搜索词)。到目前为止,这是最接近回答我的问题的主题:Plot Kaplan-Meier for Cox regression

与该帖子的一个答案中提供的可重现的例子保持一致:

url <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
df <- read.table(url, header = TRUE)

library(dplyr)
library(ggplot2)
library(survival)
library(magrittr)
library(broom)

# Identifying the 25th and 75th percentiles for prio (continuous covariate)

summary(df$prio)

# Cox proportional hazards model with other covariates
# 'prio' is our explanatory variable of interest

m1 <- coxph(Surv(week, arrest) ~ 
                       fin + age + race + prio,
                     data = df)

# Creating new df to get survival predictions
# Want separate curves for the the different 'fin' and 'race'
# groups as well as the 25th and 75th percentile of prio

newdf <- df %$%
  expand.grid(fin = levels(fin), 
                    age = 30, 
                    race = levels(race), 
                    prio = c(1,4))

# Obtain the fitted survival curve, then tidy 
# into a dataframe that can be used in ggplot

survcurv <- survfit(m1, newdata = newdf) %>%
  tidy()

问题是,一旦我有这个名为survcurv的数据帧,我就无法分辨出哪个&#39;估计&#39;变量属于哪种模式,因为没有保留原始变量。例如,“估计”中的哪一个&#39;变量代表30岁的拟合曲线,种族=&#39;其他&#39;,prio =&#39; 4&#39;,fin =&#39; no&#39;?

在我见过的所有其他示例中,通常会将survfit对象放入通用plot()函数中,并且不会添加图例。我想使用ggplot并为每个预测曲线添加一个图例。

在我自己的数据集中,模型要复杂得多,并且曲线比我在此处显示的要多得多,因此您可以想象看到40种不同的估计。&#39; ..&#39 ; estimate.40&#39;变量使得很难理解什么是什么。

2 个答案:

答案 0 :(得分:2)

感谢您提供一个措辞严谨的问题和一个很好的例子。我有点惊讶tidy在创造合理的产出方面做得相对较差。请参阅下文,了解我尝试创建一些可绘制的数据:

library(tidyr)
newdf$group <- as.character(1:nrow(newdf))

survcurv <- survfit(m1, newdata = newdf) %>%
  tidy() %>% 
  gather('key', 'value', -time, -n.risk, -n.event, -n.censor) %>% 
  mutate(group = substr(key, nchar(key), nchar(key)),
         key   = substr(key, 1, nchar(key) - 2)) %>% 
  left_join(newdf, 'group') %>% 
  spread(key, value)

创建一个情节(也许你想使用geom_step代替,但遗憾的是没有阶梯状的功能区):

ggplot(survcurv, aes(x = time, y = estimate, ymin = conf.low, ymax = conf.high,
                     col = race, fill = race)) +
  geom_line(size = 1) +
  geom_ribbon(alpha = 0.2, col = NA) +
  facet_grid(prio ~ fin)

enter image description here

答案 1 :(得分:2)

尝试像这样定义survcurv

survcurv <- 
  lapply(1:nrow(newdf),
         function(x, m1, newdata){
           cbind(newdata[x, ], survfit(m1, newdata[x, ]) %>% tidy)
         },
         m1, 
         newdf) %>%
  bind_rows()

这将包括所有预测值作为具有预测估计值的列。