在ggplot或lattice中使用Surv对象 [英] Utilise Surv object in ggplot or lattice

查看:206
本文介绍了在ggplot或lattice中使用Surv对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任何人都知道如何利用ggplot或lattice来进行生存分析?这样做会很好,可以做一个网格或类似生存的图表。






所以最后我玩过并排序找到了Kaplan-Meier图的解决方案。我很抱歉将列表元素放入一个数据框中,但我无法找到另一种方式。

注意:它只适用于两层地层。如果有人知道我可以如何使用 x <-length(stratum)来做到这一点,请让我知道(在Stata中,我可以附加到宏 - 不确定这是如何工作在R )。

  ggkm <-function(time,event,stratum){

m2s <-Surv (时间,as.numeric(事件))

fit< - 幸存(m2s〜阶层)

f $时间< - 适合$时间

f $ surv< - fit $ surv

f $ strata< - c(rep(names(fit $ strata [1]),fit $ strata [1]),
rep (名称(fit $ strata [2]),fit $ strata [2]))

f $ upper < - fit $ upper

f $ lower < - fit $

r < - ggplot(f,aes(x = time,y = surv,fill = strata,group = strata))
+ geom_line()+ geom_ribbon(aes(ymin =低,ymax =高),alpha = 0.3)

return(r)
}


解决方案

我一直在 lattice 中使用下面的代码。第一个函数为一组绘制KM曲线,通常用作 panel.group 函数,而第二个函数为整个绘图添加log-rank测试p值面板:

  km.panel < -  function(x,y,type,mark.time = T,...) {
na.part< - is.na(x)| is.na(y)
x< - x [!na.part]
y< - y [!na。 ($)
if(length(x)== 0)return()
fit< - survfit(Surv(x,y)〜1)
if(mark.time){
cens < - 其中(fit%time%in%x [y == 0])
panel.xyplot(fit $ time [cens],fit $ surv [cens],type =p ,...)
}
panel.xyplot(c(0,fit $ time),c(1,fit $ surv),type =s,...)
}

logrank.panel< - 函数(x,y,下标,组,...){
lr < - survdiff(Surv(x,y) ])
otmp < - lr $ obs
etmp < - lr $ exp
df < - (sum(1 *(etmp> 0))) - 1
p <-1 - pchisq(lr $ chisq,df)
p.text< - paste(p =,signif(p,2))
grid.text(p.text,0.95,0.05,just = c(right,bottom))
panel.superpose(x = x,y = y,下标=下标,组= group,...)
}

审查指标必须为0-1为此代码工作。用法如下:

  library(生存)
库(格)
库(网格)
数据(冒号)#内置示例数据集
xyplot(status_time,data = colon,groups = rx,panel.groups = km.panel,panel = logrank.panel)

如果您只是使用'panel = panel.superpose',那么您将无法获得p值。


Anyone knows how to take advantage of ggplot or lattice in doing survival analysis? It would be nice to do a trellis or facet-like survival graphs.


So in the end I played around and sort of found a solution for a Kaplan-Meier plot. I apologize for the messy code in taking the list elements into a dataframe, but I couldnt figure out another way.

Note: It only works with two levels of strata. If anyone know how I can use x<-length(stratum) to do this please let me know (in Stata I could append to a macro-unsure how this works in R).

ggkm<-function(time,event,stratum) {

    m2s<-Surv(time,as.numeric(event))

    fit <- survfit(m2s ~ stratum)

    f$time <- fit$time

    f$surv <- fit$surv

    f$strata <- c(rep(names(fit$strata[1]),fit$strata[1]),
            rep(names(fit$strata[2]),fit$strata[2])) 

    f$upper <- fit$upper

    f$lower <- fit$lower

    r <- ggplot (f, aes(x=time, y=surv, fill=strata, group=strata))
        +geom_line()+geom_ribbon(aes(ymin=lower,ymax=upper),alpha=0.3)

    return(r)
}

解决方案

I have been using the following code in lattice. The first function draws KM-curves for one group and would typically be used as the panel.group function, while the second adds the log-rank test p-value for the entire panel:

 km.panel <- function(x,y,type,mark.time=T,...){
     na.part <- is.na(x)|is.na(y)
     x <- x[!na.part]
     y <- y[!na.part]
     if (length(x)==0) return()
     fit <- survfit(Surv(x,y)~1)
     if (mark.time){
       cens <- which(fit$time %in% x[y==0])
       panel.xyplot(fit$time[cens], fit$surv[cens], type="p",...)
      }
     panel.xyplot(c(0,fit$time), c(1,fit$surv),type="s",...)
}

logrank.panel <- function(x,y,subscripts,groups,...){
    lr <-  survdiff(Surv(x,y)~groups[subscripts])
    otmp <- lr$obs
    etmp <- lr$exp
    df <- (sum(1 * (etmp > 0))) - 1
    p <- 1 - pchisq(lr$chisq, df)
    p.text <- paste("p=", signif(p, 2))
    grid.text(p.text, 0.95, 0.05, just=c("right","bottom"))
    panel.superpose(x=x,y=y,subscripts=subscripts,groups=groups,...)
}

The censoring indicator has to be 0-1 for this code to work. The usage would be along the following lines:

library(survival)
library(lattice)
library(grid)
data(colon)  #built-in example data set
xyplot(status~time, data=colon, groups=rx, panel.groups=km.panel, panel=logrank.panel)

If you just use 'panel=panel.superpose' then you won't get the p-value.

这篇关于在ggplot或lattice中使用Surv对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆