One of the most common tasks in health economic modelling is converting a control group probability to an intervention group probability using a Hazard Ratio (HR) from a clinical trial. This arises whenever:
A common mistake is to multiply the probability directly by the HR (i.e., \(p_{int} = p_{ctrl} \times HR\)). This is mathematically incorrect because the HR operates on the instantaneous rate, not on the cumulative probability.
Under the proportional hazards assumption (the HR is constant over time):
Step 1: Convert control probability to rate
\[r_{control} = -\frac{\ln(1 - p_{control})}{t}\]
Step 2: Apply the Hazard Ratio
\[r_{intervention} = r_{control} \times HR\]
Step 3: Convert back to probability
\[p_{intervention} = 1 - e^{-r_{intervention} \times t_{cycle}}\]
The PLATO trial (Wallentin et al., NEJM 2009) compared Ticagrelor to Aspirin in Acute Coronary Syndrome. Key results at 12 months:
| Endpoint | Aspirin (Control) | HR (95% CI) |
|---|---|---|
| CV Death | 5.25% | 0.79 (0.69 - 0.91) |
| MI | 6.43% | 0.84 (0.75 - 0.95) |
| Stroke | 1.38% | 1.01 (0.79 - 1.28) |
| Major Bleeding | 11.43% | 1.04 (0.95 - 1.13) |
# PLATO trial - CV Death
p_control <- 0.0525 # 5.25% at 12 months
hr <- 0.79 # Ticagrelor vs Aspirin
t <- 1 # 1 year
# Step 1: Probability -> Rate
r_control <- -log(1 - p_control) / t
cat("Step 1 - Control rate:", round(r_control, 5), "per year\n")
#> Step 1 - Control rate: 0.05393 per year
# Step 2: Apply HR
r_intervention <- r_control * hr
cat("Step 2 - Intervention rate:", round(r_intervention, 5), "per year\n")
#> Step 2 - Intervention rate: 0.0426 per year
# Step 3: Rate -> Probability
p_intervention <- 1 - exp(-r_intervention * t)
cat("Step 3 - Intervention probability:", round(p_intervention, 5), "\n\n")
#> Step 3 - Intervention probability: 0.04171
# Compare with naive method
p_naive <- p_control * hr
cat("Correct method:", round(p_intervention, 5), "\n")
#> Correct method: 0.04171
cat("Naive (p x HR):", round(p_naive, 5), "\n")
#> Naive (p x HR): 0.04147
cat("Difference:", round((p_intervention - p_naive) * 10000, 2), "per 10,000 patients\n")
#> Difference: 2.34 per 10,000 patients# Apply CI bounds
hr_low <- 0.69
hr_high <- 0.91
p_low <- 1 - exp(-r_control * hr_low * t)
p_high <- 1 - exp(-r_control * hr_high * t)
cat("Intervention probability: ", round(p_intervention, 5),
" (95% CI:", round(p_low, 5), "to", round(p_high, 5), ")\n")
#> Intervention probability: 0.04171 (95% CI: 0.03653 to 0.04789 )
# Clinical impact
arr <- p_control - p_intervention
nnt <- ceiling(1 / arr)
cat("ARR:", round(arr * 100, 2), "%\n")
#> ARR: 1.08 %
cat("NNT:", nnt, "\n")
#> NNT: 93The error from naive multiplication grows with higher event rates. Consider an oncology model where the control arm 2-year mortality is 40%:
p_control_onc <- 0.40
hr_onc <- 0.75
t_onc <- 2
# Correct method
r_ctrl <- -log(1 - p_control_onc) / t_onc
r_int <- r_ctrl * hr_onc
p_int_correct <- 1 - exp(-r_int * t_onc)
# Naive method
p_int_naive <- p_control_onc * hr_onc
cat("Control 2-year mortality:", p_control_onc, "\n")
#> Control 2-year mortality: 0.4
cat("HR:", hr_onc, "\n\n")
#> HR: 0.75
cat("Correct intervention probability:", round(p_int_correct, 4), "\n")
#> Correct intervention probability: 0.3183
cat("Naive (p x HR):", round(p_int_naive, 4), "\n")
#> Naive (p x HR): 0.3
cat("Error:", round(abs(p_int_correct - p_int_naive) * 100, 2), "percentage points\n")
#> Error: 1.83 percentage points
cat("This affects", round(abs(p_int_correct - p_int_naive) * 10000), "patients per 10,000\n")
#> This affects 183 patients per 10,000Often you need monthly transition probabilities for your Markov model. You can combine HR conversion with time rescaling:
# PLATO CV Death, but for a monthly model
p_annual_ctrl <- 0.0525
hr <- 0.79
# Convert annual probability to rate
r_ctrl <- -log(1 - p_annual_ctrl) / 1
r_int <- r_ctrl * hr
# Convert to monthly probabilities
t_month <- 1/12
p_monthly_ctrl <- 1 - exp(-r_ctrl * t_month)
p_monthly_int <- 1 - exp(-r_int * t_month)
cat("Monthly control probability:", round(p_monthly_ctrl, 6), "\n")
#> Monthly control probability: 0.004484
cat("Monthly intervention probability:", round(p_monthly_int, 6), "\n")
#> Monthly intervention probability: 0.003544For models with multiple health states and transitions, you can upload a CSV with control probabilities and HRs. Navigate to Bulk Conversion in ParCC and select “HR -> Intervention Probability”.
Endpoint,Control_Prob,Hazard_Ratio,Time_Horizon
CV Death,0.0525,0.79,1
MI,0.0643,0.84,1
Stroke,0.0138,1.01,1
Major Bleeding,0.1143,1.04,1
Use the Multi-HR Comparison tab to evaluate how different HRs from subgroup analyses or network meta-analyses translate into absolute probabilities. This is useful for:
Proportional Hazards: The HR is assumed constant over time. If the Kaplan-Meier curves cross, this assumption is violated and alternative methods (e.g., piecewise HRs) should be considered.
Exponential within cycle: The conversion assumes exponential survival within each model cycle. This is standard practice for short cycles (1 month, 1 year) but may be less appropriate for very long cycles.
Independent events: The conversion treats each event independently. For competing risks models, additional adjustments may be needed.