如何在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;变量使得很难理解什么是什么。
答案 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)
答案 1 :(得分:2)
尝试像这样定义survcurv
:
survcurv <-
lapply(1:nrow(newdf),
function(x, m1, newdata){
cbind(newdata[x, ], survfit(m1, newdata[x, ]) %>% tidy)
},
m1,
newdf) %>%
bind_rows()
这将包括所有预测值作为具有预测估计值的列。