πŸŽ‰ 75% of content is free forever β€” Unlock Premium from $10/mo β†’
CW
Search courses…
πŸ’Ό Servicesℹ️ Aboutβœ‰οΈ ContactView Pricing Plansfrom $10

Cox Proportional Hazards Model

StatisticsSurvival Analysis🟒 Free Lesson

Advertisement

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

  1. Schoenfeld residuals: Plot residuals against time; should show no pattern

  2. Log-log survival plots: Parallel curves indicate PH holds

  3. 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

Need Expert Statistics Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement