在ggplot或lattice中使用Surv对象 [英] Utilise Surv object in ggplot or 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屋!