Dear John, Thank you very much for your help! It was very important for getting along further.
I found out some additional things which I want to give back to you as feedback (maybe other persons will have the same problems). It's also possible to leave away the individual=T argument. Instead you can use: newdata.1<- data.frame(unique(Rossi.2[c("start","stop")]),fin=0,age=30,prio=5,Id=1,arrest.time=0) fit <- survfit(mod.allison.5, newdata.1, id=Id) *but not* fit <- survfit(mod.allison.5, newdata.1, id="Id") so you have to leave away the "" in specifying the id variable --> maybe the help file could be more precise here. Additionally I found out some more things while dealing with my original data. It's very important to specify the Surv object and the formula directly in the coxph function, *so don't do this:* SurvO <- Surv(Rossi.2$start, Rossi.2$stop, Rossi.2$arrest.time) form <- as.formula(SurvO ~ fin + age + age:stop + prio) mod.allison.5<- coxph(form, data=Rossi.2) mod.allison.5 newdata.1<- data.frame(unique(Rossi.2[c("start","stop")]),fin=0,age=30,prio=5,arrest.time=0) fit <- survfit(mod.allison.5, newdata.1, individual=T) > Fehler in model.frame.default(data = newdata.1, formula = SurvO ~ fin + : Variablenlängen sind unterschiedlich (gefunden für 'fin') --> Error, length of variables are different I think the error message is not optimal here, anyway. The problem obviously consists in the survfit-function not recognizing the names of the variables anymore. It seems completely logic, but anyway, it took me many hours. Thanks again, Jürgen --------- Korrespondenz ---------- Betreff: Re: How to specify "newdata" in a Cox-Modell with a time dependent interaction term? Von: John Fox <j...@mcmaster.ca> An: J?rgen Biedermann <juergen.biederm...@googlemail.com> Datum: 16.06.2012 17:22 > Dear Jurgen, > >> fit<- survfit(mod.allison.5, newdata.1, individual=TRUE) >> fit > Call: survfit(formula = mod.allison.5, newdata = newdata.1, individual = TRUE) > > records n.max n.start events median 0.95LCL 0.95UCL > 19809 432 432 114 NA NA NA > > plot(fit) # shows one survival curve > > See ?survfit.coxph. > > Best, > John > > > On Sat, 16 Jun 2012 16:23:41 +0200 > Jürgen Biedermann<juergen.biederm...@googlemail.com> wrote: >> Dear John, >> >> Thank you very much for the quick answer. I will use the mentioned citation >> of your book in the future. >> >> However: >> The Id argument is necessary for the function to know that the different >> rows belong to one individual. >> >> Or how the Help-File says: >> >> id: >> optional variable name of subject identifiers. If this is present, then each >> group >> of rows with the same subject id represents the covariate path through time >> of >> a single subject, and the result will contain one curve per subject. If the >> coxph >> fit had strata then that must also be specified in newdata. If missing, then >> each >> individual row of newdata is presumed to represent a distinct subject and >> there >> will be nrow(newdata) times the number of strata curves in the result (one >> for >> each strata/subject combination). >> >> I tried your proposal anyway, but, as expected, fifty different survival >> curves appeared. >> >> So, there is still no solution. >> >> Best regards >> Jürgen >> >> -- >> ----------------------------------- >> Jürgen Biedermann >> Bergmannstraße 3 >> 10961 Berlin-Kreuzberg >> Mobil: +49 176 247 54 354 >> Home: +49 30 940 53 044 >> e-mail: juergen.biederm...@gmail.com >> >> >> --------- Korrespondenz ---------- >> >> Betreff: Re: How to specify "newdata" in a Cox-Modell with a time dependent >> interaction term? >> Von: John Fox<j...@mcmaster.ca> >> An: J?rgen Biedermann<juergen.biederm...@googlemail.com> >> Datum: 16.06.2012 15:55 >>> Dear Jürgen, >>> >>> All the values of your Id variable are equal to 1; how can that make sense? >>> Removing the argument Id=id may get you what you want. >>> >>> By the way, the document to which you refer was an appendix to a 2002 book >>> that has been superseded by Fox and Weisberg, An R Companion to Applied >>> Regression, Second Edition (Sage, 2011). Appendices for that book are >>> available >>> at<http://socserv.socsci.mcmaster.ca/jfox/Books/Companion/appendix.html>. >>> >>> I hope this helps, >>> John >>> >>> ------------------------------------------------ >>> John Fox >>> Sen. William McMaster Prof. of Social Statistics >>> Department of Sociology >>> McMaster University >>> Hamilton, Ontario, Canada >>> http://socserv.mcmaster.ca/jfox/ >>> >>> On Sat, 16 Jun 2012 15:04:48 +0200 >>> Jürgen Biedermann<juergen.biederm...@googlemail.com> wrote: >>>> Dear Mr. Therneau, Mr. Fox, or to whoever, who has some time... >>>> >>>> I don't find a solution to use the "survfit" function (package: survival) >>>> for a defined pattern of covariates with a Cox-Model including a time >>>> dependent interaction term. Somehow the definition of my "newdata" >>>> argument seems to be erroneous. >>>> I already googled the problem, found many persons having the same or a >>>> similar problem, but still no solution. >>>> I want to stress that my time-dependent covariate does not depend on the >>>> failure of an individual (in this case it doesn't seem sensible to predict >>>> a survivor function for an individual). Rather one of my effects declines >>>> with time (time-dependent coefficient). >>>> >>>> For illustration, I use the example of John Fox's paper "Cox Proportional >>>> - Hazards Regression for Survival Data". >>>> http://cran.r-project.org/doc/contrib/Fox-Companion/appendix-cox-regression.pdf >>>> >>>> Do you know any help? See code below >>>> >>>> Thanks very much in advance >>>> Jürgen Biedermann >>>> >>>> #---------------------------------------- >>>> #Code >>>> >>>> Rossi<- >>>> read.table("http://cran.r-project.org/doc/contrib/Fox-Companion/Rossi.txt", >>>> header=T) >>>> >>>> Rossi.2<- fold(Rossi, time='week', >>>> event='arrest', cov=11:62, cov.names='employed') >>>> >>>> # see below for the fold function from John Fox >>>> >>>> # modeling an interaction with time (Page 14) >>>> >>>> mod.allison.5<- coxph(Surv(start, stop, arrest.time) ~ >>>> fin + age + age:stop + prio, >>>> data=Rossi.2) >>>> mod.allison.5 >>>> >>>> # Attempt to get the survivor function of a person with age=30, fin=0 and >>>> prio=5 >>>> >>>> newdata.1<- >>>> data.frame(unique(Rossi.2[c("start","stop")]),fin=0,age=30,prio=5,Id=1,arrest.time=0) >>>> fit<- survfit(mod.allison.5,newdata.1,id="Id") >>>> >>>> Error message: >>>> >>>> >Fehler in model.frame.default(data = newdata.1, id = "Id", formula = >>>> Surv(start, : >>>> Variablenlängen sind unterschiedlich (gefunden für '(id)') >>>> >>>> --> failure, length of variables are different. >>>> >>>> #----------------------------------------------------------------- >>>> fold<- function(data, time, event, cov, >>>> cov.names=paste('covariate', '.', 1:ncovs, sep=""), >>>> suffix='.time', cov.times=0:ncov, common.times=TRUE, lag=0){ >>>> vlag<- function(x, lag) c(rep(NA, lag), x[1:(length(x)-lag)]) >>>> xlag<- function(x, lag) apply(as.matrix(x), 2, vlag, lag=lag) >>>> all.cov<- unlist(cov) >>>> if (!is.list(cov)) cov<- list(cov) >>>> ncovs<- length(cov) >>>> nrow<- nrow(data) >>>> ncol<- ncol(data) >>>> ncov<- length(cov[[1]]) >>>> nobs<- nrow*ncov >>>> if (length(unique(c(sapply(cov, length), length(cov.times)-1)))> >>>> 1) >>>> stop(paste( >>>> "all elements of cov must be of the same length and \n", >>>> "cov.times must have one more entry than each element of >>>> cov.")) >>>> var.names<- names(data) >>>> subjects<- rownames(data) >>>> omit.cols<- if (!common.times) c(all.cov, cov.times) else all.cov >>>> keep.cols<- (1:ncol)[-omit.cols] >>>> nkeep<- length(keep.cols) >>>> if (is.numeric(event)) event<- var.names[event] >>>> times<- if (common.times) matrix(cov.times, nrow, ncov+1, byrow=T) >>>> else data[, cov.times] >>>> new.data<- matrix(Inf, nobs, 3 + ncovs + nkeep) >>>> rownames<- rep("", nobs) >>>> colnames(new.data)<- c('start', 'stop', paste(event, suffix, >>>> sep=""), >>>> var.names[-omit.cols], cov.names) >>>> end.row<- 0 >>>> for (i in 1:nrow){ >>>> start.row<- end.row + 1 >>>> end.row<- end.row + ncov >>>> start<- times[i, 1:ncov] >>>> stop<- times[i, 2:(ncov+1)] >>>> event.time<- ifelse (stop == data[i, time]& data[i, event] == >>>> 1, 1, 0) >>>> keep<- matrix(unlist(data[i, -omit.cols]), ncov, nkeep, byrow=T) >>>> select<- apply(matrix(!is.na(data[i, all.cov]), ncol=ncovs), >>>> 1, all) >>>> rows<- start.row:end.row >>>> cov.mat<- xlag(matrix(unlist(data[i, all.cov]), >>>> nrow=length(rows)), lag) >>>> new.data[rows[select], ]<- >>>> cbind(start, stop, event.time, keep, cov.mat)[select,] >>>> rownames[rows]<- paste(subjects[i], '.', seq(along=rows), >>>> sep="") >>>> } >>>> row.names(new.data)<- rownames >>>> as.data.frame(new.data[new.data[, 1] != Inf& >>>> apply(as.matrix(!is.na(new.data[, cov.names])), 1, all), ]) >>>> } >>>> #----------------------------------------------------------------- >>>> [[alternative HTML version deleted]]
______________________________________________ R-help@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.