Re: [R] Survival (KM/Cox) plots with lattice?

From: Dieter Menne <dieter.menne_at_menne-biomed.de>
Date: Thu, 14 Feb 2008 16:36:18 +0000 (UTC)

Deepayan Sarkar <deepayan.sarkar <at> gmail.com> writes:

> > I am looking for a lattice-panel for survival (KM/Cox) plots. I know it's
> > not standard, but maybe someone has already tried?
>
> There are some half-formed ideas in
>
> http://dsarkar.fhcrc.org/talks/extendingLattice.pdf
>
> but nothing packaged (mostly because I'm not all that familiar with
> survival analysis). If you have some well-defined use cases, I would
> be happy to collaborate on something generally useful.
>

Deepayan,

Here my attempts. The code is not very generic, cox does not work yet, and I don't believe the syntax is good. And, there is an environment marked !!! below, which I could not get around and replaced it by a hardcoded grouping.

But nevertheless, I think it already looks better than standard graphics

Dieter

#------------------------------------------------------------------------------
library(survival)
library(lattice)

ovarian$resfak = factor(ovarian$resid.ds) levels(ovarian$resfak) =c("resid.no","resid.yes") ovarian$rxfak = factor(ovarian$rx)
levels(ovarian$rxfak) =c("rx.no","rx.yes")

xyplot.survfit = function(x,form,groups=NULL,...) {   st = names(x$strata)
  # treat strata like other grouping variable   st = sub("strata\\(.*)=","",st)
  faks = strsplit(st,"[=,]")[]
  nc = length(faks[[1]])
  # bug (?) in survfit; sometimes has spaces   faks = gsub(" ","", unlist(faks))
  nam = faks[seq(1,nc,by=2)]
  gr = data.frame(
    matrix(faks[seq(2,length(faks),by=2)],ncol=nc %/%2,byrow=TRUE))   names(gr)= nam
  dfr = with(x,data.frame(time,n.risk,n.event,surv,std.err,upper,lower,     gr[rep(1:nrow(gr),x$strata),]))
  # !!! Some env-problem: groups = groups does not work here   if (!is.null(groups)) {
    xyplot(form, data=dfr, type="s", groups=rxfak, #groups=groups,

      cens = dfr$n.event==0,
      panel = function(x,y,subscripts,groups,cens,...){
        panel.superpose(x,y,subscripts,groups,...)
        ce = cens[subscripts]
        panel.superpose(x[ce],y[ce],ce,groups,type="p")
      })

  } else {
    xyplot(form,data=dfr,type="s",cens = dfr$n.event==0, subscripts=TRUE,
      panel = function(x,y,cens,subscripts,...){
        panel.xyplot(x,y,...)
        ce = cens[subscripts]
        # dirty. Should pass ... too to set pwd etc.  
        panel.xyplot(x[ce],y[ce],type="p")
      }
      )

  }
}

svfit = survfit( Surv(futime,fustat)~resfak+rxfak,data=ovarian) cph = coxph( Surv(futime,fustat)~resfak+rxfak,data=ovarian) #coxfit = survfit(cph,newdata=... )# Not tried yet

# The formula in xyplot is redundant and error prone, since the first term should
# always be surv~time.
# The correct formula could be inferred from svfit$call, but I would be 
# important to distinguish between groups and panels in plotting 
# form = ~|resfak, groups=rxfak # looks minimal, but not really nice
# panels=resfak, groups=rxfak # collides with panel=

xyplot(svfit,surv~time|resfak, groups="rxfak") # looks ok, bad syntax see !!! xyplot(svfit,surv~time|resfak+rxfak) # looks ok # would look ok if the !!! problem above were solved #xyplot(svfit,surv~time|rxfak, groups="resfak")

#xyplot(svfit,surv~time) # plot is not valid, should not be possible

# Does not work yet
#xyplot(coxfit,surv~time|resfak, groups="rxfak")
#xyplot(coxfit,surv~time|resfak+rxfak)

______________________________________________
R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Thu 14 Feb 2008 - 16:39:39 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 14 Feb 2008 - 17:30:14 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive