The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

HR-Based Probability Converter

The Problem

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.

The Three-Step Method

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}}\]

Worked Example 1: PLATO Trial (Ticagrelor vs Aspirin)

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)

CV Death Conversion

# 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

With 95% Confidence Interval

# 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: 93

Worked Example 2: High Event Rate (Oncology)

The 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,000

Worked Example 3: Rescaling to Monthly Cycles

Often 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.003544

Batch Conversion

For 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”.

Example CSV format:

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

Multi-HR Comparison

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:

Key Assumptions and Limitations

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

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

  3. Independent events: The conversion treats each event independently. For competing risks models, additional adjustments may be needed.

References

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.