在ggplot或lattice中使用Surv对象

Mis*_*sha 5 analysis r graph ggplot2 lattice

任何人都知道如何利用ggplot或格子进行生存分析?做一个格子或类似生存的生存图表会很好.


所以最后我玩了一下,找到了一个Kaplan-Meier情节的解决方案.我为将列表元素放入数据帧中的混乱代码道歉,但我无法想出另一种方法.

注意:它只适用于两级层次.如果有人知道我怎么能x<-length(stratum)这样做,请告诉我(在Stata我可以附加一个宏观 - 不确定它在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)
}
Run Code Online (Sandbox Code Playgroud)

Ani*_*iko 4

我一直在使用以下代码lattice。第一个函数绘制一组的 KM 曲线,通常用作函数panel.group,而第二个函数添加整个面板的对数秩检验 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.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,...)
}
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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