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

MeasureSettingEstimate
AUC, (202 at risk)0.8537
Dynamic C, [0, 14.31]0.7913
Prediction error, , square loss0.1064
Integrated PE[5, 9]0.0902
10-fold CV: mean AUC / PE, horizon 70.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.

See Also

Rizopoulos 2016 - JMbayes Joint Models Overview