Cox Proportional Hazards Model
Statistics
Semi-Parametric Regression for Survival Data
The Cox model relates covariates to the hazard function without specifying the baseline hazard. Hazard ratios quantify how each predictor multiplies the risk of the event occurring at any given time.
-
Oncology β Identify prognostic factors for cancer survival
-
Reliability β Determine which operational conditions accelerate equipment failure
-
Employee Analytics β Predict turnover risk from workplace factors
The hazard ratio tells you how much faster or slower the clock ticks for each group.
The Cox model is a semi-parametric regression model for survival data that relates covariates to the hazard function without specifying the baseline hazard.
Cox Model Specification
Hazard Ratios
Proportional Hazards Assumption
The model assumes the ratio of hazards between any two individuals is constant over time.
Testing PH Assumption
-
Schoenfeld residuals: Plot residuals against time; should show no pattern
-
Log-log survival plots: Parallel curves indicate PH holds
-
Statistical test: Test correlation of Schoenfeld residuals with time
Partial Likelihood
Cox's key insight: the baseline hazard drops out of the likelihood.
Confidence Intervals for HR
Python Implementation
import numpy as np
import pandas as pd
from lifelines import CoxPHFitter
import matplotlib.pyplot as plt
np.random.seed(42)
# Simulate survival data with covariates
n = 300
age = np.random.normal(60, 10, n)
treatment = np.random.binomial(1, 0.5, n)
beta_true = [0.03, -0.5] # age increases risk, treatment decreases risk
# Generate survival times
U = np.random.uniform(0, 1, n)
linpred = beta_true[0]*age + beta_true[1]*treatment
time = -np.log(U) / np.exp(linpred) * 100
censored_time = np.random.uniform(50, 150, n)
event = (time <= censored_time).astype(int)
observed_time = np.minimum(time, censored_time)
# Create DataFrame
df = pd.DataFrame({
'duration': observed_time,
'event': event,
'age': age,
'treatment': treatment
})
# Fit Cox model
cph = CoxPHFitter()
cph.fit(df, duration_col='duration', event_col='event')
print(cph.summary[['coef', 'exp(coef)', 'se(coef)', 'p', 'exp(coef) lower 95%', 'exp(coef) upper 95%']])
# Plot hazard ratios
cph.plot()
plt.title('Cox Model - Hazard Ratios')
plt.show()
# Concordance index
print(f"\nConcordance index: {cph.concordance_index_:.3f}")
Worked Example
Model Evaluation
| Metric | Description |
|--------|------------|
| Concordance index | Probability that a randomly chosen event occurs at a shorter time for higher-risk individual (0.5 = random, 1.0 = perfect) |
| Partial AIC | For model comparison (lower is better) |
| Schoenfeld residuals | Check PH assumption |
| Likelihood ratio test | Test overall model significance |
Key Takeaways
Related Topics
-
See Kaplan-Meier Estimator for non-parametric survival estimation
-
See Logistic Regression for binary outcomes
-
See Mediation Analysis for causal pathway analysis