Or try the following:

require(rms)
data(lung)
survfit(Surv (time, status) ~ ph.ecog, data=lung)
lung <- transform(lung, ph.ecog=factor(ph.ecog))
f <- cph(Surv(time, status) ~ strat(ph.ecog), data=lung, surv=TRUE)
## doesn't assume PH
quant <- Quantile(f)   # print quant to see how all quantiles are computed
quant(stratum=1)
meds <- sapply(1:4, function(x) quant(stratum=x))
meds

0.5 0.5 0.5 0.5
394 306 199 118

## Much more precise, if PH holds:
dd <- datadist(lung); options(datadist='dd')
f <- cph(Surv(time, status) ~ ph.ecog, data=lung, surv=TRUE)
quant <- Quantile(f)
Predict(f, ph.ecog=., fun=function(lp) quant(lp=lp))
## Note that confidence intervals are approximate because they don't
## take into account uncertainty in the underlying survival curve

  ph.ecog yhat lower upper
1       0  429   583   320
2       1  329   329   329
3       2  210   288   176
4       3   88   353    11

## Test for linearity in ph.ecog
f <- cph(Surv(time, status) ~ scored(ph.ecog), data=lung)
anova(f)  # chi-sq=1.05 with 2 d.f. P=.59
## Note this type of testing distorts the final d.f.

                Wald Statistics          Response: Surv(time, status)

 Factor     Chi-Square d.f. P
 ph.ecog    20.27      3    0.0001
  Nonlinear  1.05      2    0.5925
 TOTAL      20.27      3    0.0001

## More precise, as saves two d.f. by assuming linearity, PH
lung <- transform(lung, ph.ecog.num=as.numeric(as.character(ph.ecog)))
dd <- datadist(lung)
f <- cph(Surv(time, status) ~ ph.ecog.num, data=lung, surv=TRUE)
quant <- Quantile(f)
Predict(f, ph.ecog.num=., fun=function(lp) quant(lp=lp))
## Same caution about confidence limits

  ph.ecog.num yhat lower upper
1           0  450   550   364
2           1  310   310   310
3           2  212   269   183
4           3  166   210   122

quant(lp=predict(f, data.frame(ph.ecog.num=0:3)))

  1   2   3   4
450 310 212 166

Frank


David Winsemius wrote:
The survfit.object help page says:

"The print.survfit method does more computation than is typical for a print method and is documented on a separate page."

It takes a bit of digging, but after first trying:

getAnywhere(print.survfit)   # and then following code and trying
getAnywhere(survmean) # survmean is the function which does the work using pfun

... I think I finally understand exactly what the print.survfit help page means when it refers to a "side-effect".

So there is no durable element in the survfit object that is the median. The automation you request would involve duplicating the code of survmean but with assignment of the "out" matrix to something that does not get discarded.



--
Frank E Harrell Jr   Professor and Chair           School of Medicine
                     Department of Biostatistics   Vanderbilt University

______________________________________________
[email protected] 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.
  • [R] Obta... Polwart Calum (County Durham and Darlington NHS Foundation Trust)
    • Re:... David Winsemius
      • ... Marc Schwartz
      • ... Frank E Harrell Jr

Reply via email to