[R] Expected number of events, Andersen-Gill model fit via coxph in package survival

David Winsemius dwinsemius at comcast.net
Sat Oct 6 17:56:29 CEST 2012


On Oct 5, 2012, at 8:48 PM, Omar De la Cruz C. wrote:

> Hello,
> 
> I am interested in producing the expected number of events, in a
> recurring events setting. I am using the Andersen-Gill model, as fit
> by the function "coxph" in the package "survival."
> 
> I need to produce expected numbers of events for a cohort,
> cumulatively, at several fixed times. My ultimate goal is: To fit an
> AG model to a reference sample, then use that fitted model to generate
> expected numbers of events for a new cohort; then, comparing the
> expected vs. the observed numbers of events would give us some idea of
> whether the new cohort differs from the reference one.
> 
>> From my reading of the documentation and the text by Therneau and
> Grambsch, it seems that the function "survexp" is what I need. But
> using it I am not able to obtain expected numbers of events that match
> reasonably well the observed numbers *even for the same reference
> population.* So, I think I am misunderstanding something quite badly.
> 
> Below is an example that illustrates the situation. At the end I
> include the sessionInfo().
> 
> Thank you!
> 
> Omar.
> 
> 
> ############################
> 
> # Example of unexpected behavior in computing estimated number of events
> # in using package "survival" for fitting the Andersen-Gill model
> 
> require(survival)
> 
> head(bladder2)  # this is the data, in interval format
> 
> # Fit Andersen-Gill model
> cphfit = coxph(Surv(start,stop,event)~rx+number+size+cluster(id),data=bladder2)
> 
> # Choose some arbitrary time horizons
> t.horiz = seq(min(bladder2$start),max(bladder2$stop),length=6)
> 
> # Compute the cohort expected survival
> s = survexp(~1,data=bladder2,ratetable=cphfit,times=t.horiz)
> # This are the expected survival values:
> s$surv
> 
> # We are interested in the rate of events
> e.r = as.vector( 1 - s$surv )
> 

Rates are events/n-exposed/time, so those are not rates as I understand the term.  And I do not see any accounting for the length of intervals at risk in the rest of your code. That vector does not even calculate interval event expectations as I read it.

-- 
David


> # How does this compare to the actual number of events, cumulative at
> # each time horizon?
> 
> observed = numeric(length(t.horiz))
> 
> for (i in 1:length(t.horiz)){
> 
>        observed[i] = sum(bladder2$event[bladder2$stop <= t.horiz[i]])
> 
> }
> 
> print(observed)
> 
> # We would like to compute expected numbers of events that approximately
> # match these observed values.
> 
> # We should multiply the expected survival rates by the number of individuals.
> 
> # Now, one would think that this is the number of at-risk individuals:
> s$n.risk
> 
> # But that is actually the total number of rows in the data. In any case,
> # these numbers do not match:
> 
> rbind(expected = s$n.risk*e.r,observed=observed)
> 
> # What if we multiply by the number of individuals?
> 
> rbind(expected = length(unique(bladder2$id))*e.r,observed=observed)
> 
> # This does not work either! The required factor seems to be about 133, but
> # I don't see an explanation for that.
> 
> # In this example, multiplying by 133.182 gives a good match between observed
> # and expected values, but in other examples even the shape of the curves
> # are different.
> 
> # Multiplying by a number of individuals at risk at each time point
> # (number of individuals
> # for which there is a time interval containing the time horizon) does
> # not work either.
> 
> #####################
> 
>> sessionInfo()
> R version 2.15.1 (2012-06-22)
> Platform: i386-apple-darwin9.8.0/i386 (32-bit)
> 
> locale:
> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
> 
> attached base packages:
> [1] splines   stats     graphics  grDevices utils     datasets
> methods   base
> 
> other attached packages:
> [1] survival_2.36-14
> 
> loaded via a namespace (and not attached):
> [1] tools_2.15.1
> 
> ______________________________________________
> 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.

David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list