Hosmer-Lemeshow test for Cox model

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Hosmer-Lemeshow test for Cox model

jane.wong
Dear list,

Usually we use Hosmer-Lemeshow test to test the goodness of fit for logistic model, but if I use it to test for Cox model, how can I get the observed probability for each group?
Suppose I calculated the 5-year predicted probability using Cox model, then I split the dataset into 10 group according to this predicted probability. We should compare the observed probability with predicted probability within each group,but how to calculate this observed probability, should I use Kaplan-Meier to estimate it?  how should I modify the following program,thanks.

hosmerlem = function(y, yhat, g=10) {
  cutyhat = cut(yhat,
     breaks = quantile(yhat, probs=seq(0,
       1, 1/g)), include.lowest=TRUE)
  obs = xtabs(cbind(1 - y, y) ~ cutyhat)
  expect = xtabs(cbind(1 - yhat, yhat) ~ cutyhat)
  chisq = sum((obs - expect)^2/expect)
  P = 1 - pchisq(chisq, g - 2)
  return(list(chisq=chisq,p.value=P))
}
Reply | Threaded
Open this post in threaded view
|

Re: Hosmer-Lemeshow test for Cox model

Frank Harrell
Any method that requires binning is problematic.  Instead, take a look at the calibrate function in the rms package.  There is a new option for continuous calibration curves for survival models.
Frank
jane.wong wrote
Dear list,

Usually we use Hosmer-Lemeshow test to test the goodness of fit for logistic model, but if I use it to test for Cox model, how can I get the observed probability for each group?
Suppose I calculated the 5-year predicted probability using Cox model, then I split the dataset into 10 group according to this predicted probability. We should compare the observed probability with predicted probability within each group,but how to calculate this observed probability, should I use Kaplan-Meier to estimate it?  how should I modify the following program,thanks.

hosmerlem = function(y, yhat, g=10) {
  cutyhat = cut(yhat,
     breaks = quantile(yhat, probs=seq(0,
       1, 1/g)), include.lowest=TRUE)
  obs = xtabs(cbind(1 - y, y) ~ cutyhat)
  expect = xtabs(cbind(1 - yhat, yhat) ~ cutyhat)
  chisq = sum((obs - expect)^2/expect)
  P = 1 - pchisq(chisq, g - 2)
  return(list(chisq=chisq,p.value=P))
}
Frank Harrell
Department of Biostatistics, Vanderbilt University