Health economic models require transition probabilities, but clinical literature often reports rates or odds. These are different quantities and cannot be used interchangeably. This vignette explains the conversions and demonstrates them with realistic scenarios.
You are building a Markov model comparing Dabigatran vs Warfarin for atrial fibrillation. The RE-LY trial (Connolly et al., NEJM 2009) reports the incidence rate of major bleeding as:
3.36 events per 100 patient-years in the Warfarin arm
Dividing 3.36 by 100 gives 0.0336. But this ignores the continuous nature of risk – patients who bleed early in the year are removed from the at-risk pool, meaning the remaining patients face a slightly different risk.
\[p = 1 - e^{-rt}\]
where \(r\) is the instantaneous rate and \(t\) is the time horizon.
# RE-LY trial: Warfarin arm major bleeding
rate_per_100 <- 3.36
r <- rate_per_100 / 100 # Convert to per-person rate
t <- 1 # 1-year model cycle
p <- 1 - exp(-r * t)
cat("Rate (per person-year):", r, "\n")
#> Rate (per person-year): 0.0336
cat("Annual probability:", round(p, 5), "\n")
#> Annual probability: 0.03304
cat("Naive division would give:", r, "(overestimates by", round((r - p)/p * 100, 2), "%)\n")
#> Naive division would give: 0.0336 (overestimates by 1.69 %)3.36, Multiplier =
Per 10010.03304You are building a Diabetes model with 1-year cycles. The UKPDS Risk Engine (Clarke et al., Diabetologia 2004) predicts the 10-year probability of coronary heart disease as 20% for a 55-year-old male with HbA1c 8%.
Dividing 0.20 by 10 gives 0.02 (2% per year). But risk compounds: if you survive Year 1, you face risk again in Year 2. The correct conversion accounts for this compounding.
\[p_{new} = 1 - (1 - p_{old})^{t_{new}/t_{old}}\]
p_10yr <- 0.20
t_old <- 10
t_new <- 1
p_1yr <- 1 - (1 - p_10yr)^(t_new / t_old)
cat("10-year probability:", p_10yr, "\n")
#> 10-year probability: 0.2
cat("Correct 1-year probability:", round(p_1yr, 5), "\n")
#> Correct 1-year probability: 0.02207
cat("Naive (divide by 10):", p_10yr / 10, "\n")
#> Naive (divide by 10): 0.02
cat("Correct value is", round((p_1yr - 0.02)/0.02 * 100, 1), "% higher\n")
#> Correct value is 10.3 % higher0.20, Original Time =
10 Years1 Year0.02206A logistic regression predicting post-surgical infection reports an odds ratio of 2.5 for patients with diabetes (vs no diabetes). The baseline infection probability (no diabetes) is 8%.
\[p = \frac{\text{Odds}}{1 + \text{Odds}}\]
p_baseline <- 0.08
odds_baseline <- p_baseline / (1 - p_baseline)
odds_diabetes <- odds_baseline * 2.5
p_diabetes <- odds_diabetes / (1 + odds_diabetes)
cat("Baseline odds:", round(odds_baseline, 4), "\n")
#> Baseline odds: 0.087
cat("Diabetes odds (OR=2.5):", round(odds_diabetes, 4), "\n")
#> Diabetes odds (OR=2.5): 0.2174
cat("Diabetes probability:", round(p_diabetes, 4), "\n")
#> Diabetes probability: 0.1786