Rizopoulos 2016 - Predictive Accuracy and Cross-Validation
Summary
Discrimination is the time-dependent AUC and its weighted average, the dynamic concordance index ; calibration/accuracy is the expected (integrated) prediction error with a censoring correction. For model pbc15 with 5 years of data and a 2-year window, AUC is 0.854 and ; prediction error at year 7 is 0.106 (IPE over [5, 9]: 0.090). 10-fold cross-validation gives AUC 0.851 and PE 0.121 (some optimism).
Main Content
Time-dependent sensitivity, specificity and AUC (Sec. 5.3)
With longitudinal data up to and horizon , call subject a case if and a control otherwise. Sensitivity ; specificity . For pairs , with event in the window and event-free:
Estimators with censoring
: the first uses comparable pairs , the proportion concordant; the second uses pairs with censored , weighted by . Dynamic concordance (Eq. 11): , with and estimated by Kaplan-Meier; integrals by the 15-point Gauss-Kronrod rule. R:
aucJM,rocJM,dynCJM.
Prediction error
, , loss (square default). Censoring-corrected estimator (Henderson, Diggle and Dobson 2002): . Integrated PE over (Schemper and Henderson 2000) weights by with the Kaplan-Meier censoring survival. R:
prederrJM.
PBC accuracy of pbc15
Measure Setting Estimate AUC , (202 at risk) 0.8537 Dynamic C , [0, 14.31] 0.7913 Prediction error , , square loss 0.1064 Integrated PE [5, 9] 0.0902 10-fold CV: mean AUC / PE , horizon 7 0.8508 / 0.1213 Interpretation: discrimination is good and nearly identical out of sample; the in-sample prediction error is slightly optimistic (0.106 vs 0.121).
Validation recipe. Split patients (not rows) into folds, refit on training data (re-defining every object), compute AUC and PE on held-out patients with the same and horizon, and average; run folds in parallel (8.3 min on 5 cores).
Future plans (Sec. 6). C++ speed-up, multiple longitudinal outcomes, competing and recurrent events, interval censoring, priors for data-driven structure selection (Andrinopoulou and Rizopoulos 2016), personalised screening intervals.
Examples
import numpy as np
def auc_pairs(pi_case, pi_ctrl): # pi_*: predicted survival at t+dt for cases / controls
pc = np.asarray(pi_case)[:, None]; pn = np.asarray(pi_ctrl)[None, :]
return (pc < pn).mean() + 0.5 * (pc == pn).mean()Connections
Forecast Evaluation and Backtesting, Proper Scoring Rules (CRPS, Log Score, Pinball Loss), Survival Analysis.