Danardono <daodao99 at student.umu.se> wrote:> > While waiting for 2.1, for those who need function[s] for this > survival-splitting business, as I do, this 'survcut' function below > might be helpful. > It is not an elegant nor efficient function but it works, at least for > some examples below. >Ditto the following, for the case where there are multiple time-varying (irreversible) binary covariates, here slicing as coarsely as possible. # # Create dataset for survival analysis with time-dependent covariate # Gill-Anderson model # x <- data.frame(onset=c(46, 32, 53, 76, 64, 43), case=c(1,1,1,0,0,0), ooph=c(NA, 30, 38, 50, NA, NA), ocp=c(1,1,0,0,1,0), parity=c(2,0,1,3,3,2), age.preg=c(28,NA,27,20,22,23)) make.dep <- function(onset, case, time.dep, covs=NULL) { if (is.null(n.time.dep <- ncol(time.dep))) { if (!is.null(time.dep)) { n.time.dep <- 1 time.dep <- as.matrix(time.dep) }else{ n.time.dep <- 0 warning("No time dependent covariates") } } if (is.null(n.covs <- ncol(covs))) { if (!is.null(covs)) { n.covs <- 1 covs <- as.matrix(covs) }else{ n.covs <- 0 } } ordered.t <- t(apply(cbind(onset,time.dep),1,sort,na.last=TRUE)) tot.time.dep <- apply(ordered.t,1,function(x) sum(!is.na(x))) ordered.t <- cbind(rep(0, nrow(ordered.t)), ordered.t) npars <- 4+n.time.dep+n.covs nrecs <- sum(tot.time.dep) new.x <- as.data.frame(matrix(nr=nrecs, nc=npars)) names(new.x) <- c("start", "stop", "event", names(time.dep),names(covs),"episode") this.rec<-0 for(i in 1:length(onset)) { for(j in 1:tot.time.dep[i]) { this.rec <- this.rec+1 new.x[this.rec,1] <- ordered.t[i, j] new.x[this.rec,2] <- ordered.t[i, j+1] new.x[this.rec,3] <- 0 new.x[this.rec,4:(3+n.time.dep)] <- (ordered.t[i,j]>=time.dep[i,]) missing <- is.na(new.x[this.rec,]) new.x[this.rec,missing] <- 0 if (n.covs>0) { new.x[this.rec, (4+n.time.dep):(4+n.time.dep+n.covs)] <- covs[i,] } new.x[this.rec, npars]<-paste(i,j,sep=".") } new.x[this.rec,3]<-case[i] } new.x } David Duffy.
On Wed, 17 Nov 2004, David Duffy wrote:> Danardono <daodao99 at student.umu.se> wrote: >> >> While waiting for 2.1, for those who need function[s] for this >> survival-splitting business, as I do, this 'survcut' function below >> might be helpful.You don't need to wait for 2.1. survival_2.16 is available on CRAN. -thomas>> It is not an elegant nor efficient function but it works, at least for >> some examples below. >> > Ditto the following, for the case where there are multiple time-varying > (irreversible) binary covariates, here slicing as coarsely as possible. > > # > # Create dataset for survival analysis with time-dependent covariate > # Gill-Anderson model > # > x <- data.frame(onset=c(46, 32, 53, 76, 64, 43), > case=c(1,1,1,0,0,0), > ooph=c(NA, 30, 38, 50, NA, NA), > ocp=c(1,1,0,0,1,0), > parity=c(2,0,1,3,3,2), > age.preg=c(28,NA,27,20,22,23)) > > make.dep <- function(onset, case, time.dep, covs=NULL) { > if (is.null(n.time.dep <- ncol(time.dep))) { > if (!is.null(time.dep)) { > n.time.dep <- 1 > time.dep <- as.matrix(time.dep) > }else{ > n.time.dep <- 0 > warning("No time dependent covariates") > } > } > if (is.null(n.covs <- ncol(covs))) { > if (!is.null(covs)) { > n.covs <- 1 > covs <- as.matrix(covs) > }else{ > n.covs <- 0 > } > } > ordered.t <- t(apply(cbind(onset,time.dep),1,sort,na.last=TRUE)) > tot.time.dep <- apply(ordered.t,1,function(x) sum(!is.na(x))) > ordered.t <- cbind(rep(0, nrow(ordered.t)), ordered.t) > npars <- 4+n.time.dep+n.covs > nrecs <- sum(tot.time.dep) > new.x <- as.data.frame(matrix(nr=nrecs, nc=npars)) > names(new.x) <- c("start", "stop", "event", names(time.dep),names(covs),"episode") > this.rec<-0 > for(i in 1:length(onset)) { > for(j in 1:tot.time.dep[i]) { > this.rec <- this.rec+1 > new.x[this.rec,1] <- ordered.t[i, j] > new.x[this.rec,2] <- ordered.t[i, j+1] > new.x[this.rec,3] <- 0 > new.x[this.rec,4:(3+n.time.dep)] <- (ordered.t[i,j]>=time.dep[i,]) > missing <- is.na(new.x[this.rec,]) > new.x[this.rec,missing] <- 0 > if (n.covs>0) { > new.x[this.rec, (4+n.time.dep):(4+n.time.dep+n.covs)] <- covs[i,] > } > new.x[this.rec, npars]<-paste(i,j,sep=".") > } > new.x[this.rec,3]<-case[i] > } > new.x > } > > David Duffy. > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! R-project.org/posting-guide.html >Thomas Lumley Assoc. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle