计算ggadjusted曲线的SE或CI

时间:2019-03-28 18:26:53

标签: r cox-regression survival

如何从Survminer函数计算ggadjustedcurves的变异指数(SE或CI)?我正在使用条件方法。有任何输入或资源吗?

2 个答案:

答案 0 :(得分:1)

截至2019年底,仍无法使用ggadjustedcurves函数绘制置信区间。但是,可以使用survest包中的rms函数从cox模型及其相应的置信区间估计调整后的生存概率。

使用ggplot2reshape2pammtools,我编写了一个函数,该函数能够以置信区间绘制调整后的生存曲线估计值,并以任意数量的变量进行分层:

library(rms)
library(ggplot2)
library(reshape2)
library(pammtools)

adjusted_surv_curves <- function(model_cph, ..., ci=TRUE, conf.int=0.95,
                                 from=0, to=max(surv_prob$time), step=0.5,
                                 xlab="Time", ylab="Survival Probability", title="",
                                 labels=names(strata), legend.title="Strata",
                                 plot.ylim=c(0, 1), theme=theme_bw(), size=1,
                                 palette="Set1", ci.alpha=0.2, return.data=F) {
    # check input
    stopifnot(class(model_cph)==c("cph", "rms", "coxph"))
    # check if packages are loaded
    if(!(all(c("ggplot2", "reshape2", "rms", "pammtools") %in% (.packages())))){
        stop("One or more of the following packages are not attached: ggplot2, reshape2, rms, pammtools")
    }
    # to get strata, this needs to be called without
    # specified times  
    surv_prob <- survest(model_cph)
    strata <- surv_prob$strata
    # calc adjusted survival probabilities
    surv_prob <- survest(model_cph, times = seq(from, to, by=step),
                         conf.int = conf.int)
    # extract estimates from survest object
    plotd_surv <- data.frame(time=surv_prob$time)
    plotd_lower <- data.frame(time=surv_prob$time)
    plotd_upper <- data.frame(time=surv_prob$time)
    for (i in 1:length(strata)) {
        plotd_surv[,ncol(plotd_surv)+1] <- surv_prob$surv[i,]
        plotd_lower[,ncol(plotd_lower)+1] <- surv_prob$lower[i,]
        plotd_upper[,ncol(plotd_upper)+1] <- surv_prob$upper[i,]
    }
    # put together in new data frame
    # melt dataframes
    plotd_surv <- melt(plotd_surv, id.vars = "time")
    colnames(plotd_surv)[3] <- "est"
    plotd_lower <- melt(plotd_lower, id.vars = "time")
    colnames(plotd_lower)[3] <- "lower"
    plotd_upper <- melt(plotd_upper, id.vars = "time")
    colnames(plotd_upper)[3] <- "upper"
    # merge to one
    plotdata <- merge(plotd_surv, plotd_lower, by=c("time", "variable"))
    plotdata <- merge(plotdata, plotd_upper, by=c("time", "variable"))
    # return data instead, if specified
    if (return.data) {
        return(plotdata)
    }
    # plot curves
    p <- ggplot(data=plotdata, aes(x=time)) +
            geom_step(aes(y=est, color=variable), size=size) +
            theme + ylim(plot.ylim) + 
            scale_colour_brewer(palette = palette, name=legend.title,
                            labels=labels) +
            xlab(xlab) + ylab(ylab) + ggtitle(title)
    # add confidence interval if not specified otherwise
    if (ci) {
        p <- p + pammtools::geom_stepribbon(
                    aes(ymin=lower, ymax=upper, fill=variable),
                        alpha=ci.alpha) +
            scale_fill_brewer(palette = palette, name=legend.title,
                          labels=labels)
    }
    # add additional ggplot parameter, if specified
    add_params <- list(...)
    if (length(add_params)!=0) {
       for (i in 1:length(add_params)) {
            p <- p + add_params[[i]]
        } 
    }
    # return plot
    return(p)    
}

作为输入,必须使用cph函数定义的模型。建议的函数将使用cph函数在strat()调用中定义的所有阶层变量的所有值来分割曲线(您还应指定x=TRUEy=TRUE估计)。 tofromstep自变量可用于指定应在什么时间间隔和多久计算一次生存概率。可以随意修改图本身的各种参数,因为它还接受ggplot调用的任何其他参数。

警告:生存概率及其相应的置信区间的估计将与ggadjustedcurves函数所做的估计不同,因为它们的计算方法不同。有关如何计算置信区间的更多信息,请查阅官方文档:https://rdrr.io/cran/rms/man/survest.cph.html

示例,假设已定义函数:

library(rms)
library(ggplot2)
library(reshape2)
library(pammtools)

# load example dataset
data("lung")

# define model
model <- cph(with(data=lung, Surv(time, status) ~ strat(sex) + age + ph.ecog), x=TRUE, y=TRUE)

# plot adjusted survival curves by sex
adjusted_surv_curves(model)

上面的代码提供以下输出:

adjusted_surv_curve

我知道代码很丑陋,效率不是最高,但是它可以按我的预期运行,希望对您或碰巧遇到此问题的其他人有所帮助。

答案 1 :(得分:0)

简短的回答:您不能。在ggadjustedcurves的文档中,未指定置信区间选项。现在,如果您尝试在conf.int中使用ggadjustedcurves参数,则不会出错,但也无法正常工作。另外,在软件包的github page中,已经报告了该问题,并且已请求但尚未添加此功能。

通过添加ggsurvplot,您可以从同一包中的conf.int = TRUE函数中轻松计算和绘制CI。对于ggsurvplot,它是这样的:

library(survminer)
fit <- survfit(Surv(stop, event) ~ rx, data = bladder )
ggsurvplot(fit, data = bladder, conf.int=TRUE)