Discounting of Costs and Effects in Economic Evaluation
Conversion of future costs and health effects (life-years, QALYs) to present value by applying a jurisdiction-specified annual discount rate, so that outcomes occurring at different times are made commensurable in a cost-effectiveness or budget-impact model.
In plain language
Discounting converts future costs and health gains into their equivalent value today, because a dollar (or a year of healthy life) promised in the future is worth less than the same thing right now. You divide each future amount by a factor that grows the further out in time you look, using a rate set by the health authority in your country. The result is called the present value, and all costs and health effects must be converted this way before you can fairly compare treatments whose benefits and costs fall at different points in time.
Discounting
restates costs and health effects that accrue in different future periods as their present value (PV) using an annual rate r, so a dollar (or QALY) in year t counts for less than the same quantity today. Under the standard constant exponential convention, a value C_t in year t is discounted by the factor 1/(1+r)^t; the PV of a stream is the sum of these discounted period values over the model horizon. The rationale is partly empirical (positive time preference, opportunity cost of capital) and partly normative (consistency, avoiding the paradox that, undiscounted, postponing any program indefinitely would dominate). In RWE-based economic evaluation, discounting is not a statistical estimator — it is a deterministic transformation applied to the time-resolved cost and effect streams that an RWE analysis produces (per-period claims costs, HCRU, survival-weighted QALYs from a partitioned-survival or Markov model). It must be pre-specified in the protocol/SAP and matched to the reimbursement jurisdiction, because the rate and whether costs and effects share one rate materially move the ICER.
Core conceptual distinction
. Three choices are separable and each changes the answer. (1) Rate level: the per-annum r (NICE 3.5%, US Second Panel reference-case 3%, ZIN/Netherlands 4% costs, PBAC 5%, CDA-AMC (formerly CADTH) 1.5%). (2) Symmetry of rates: whether costs and effects are discounted at the same rate (uniform; the dominant convention and the US/NICE base case) or at different rates (differential discounting — the Netherlands discounts effects at 1.5% and costs at 4%, motivated by the Gravelle & Smith rising-value-of-health argument that the consumption value of health rises over time). (3) Functional form: constant exponential (standard) vs. declining / time-varying schedules for very long horizons (UK Treasury Green Book declining rates; "gamma discounting") vs. hyperbolic discounting (descriptively closer to revealed preferences but time-inconsistent and not used in reference cases). Discounting is conceptually distinct from inflation adjustment: you first deflate all costs to a common price year (real terms), then discount; conflating the two double-counts or omits the time value of money. It is also distinct from half-cycle correction in Markov models, which addresses where within a cycle events fall, not time preference.
Pros, cons, and trade-offs
. - Uniform rate (costs = effects) vs. differential rate (effects < costs): Uniform is simpler, is the NICE/US reference case, and avoids the appearance of manipulating ICERs by lowering the effects rate. Differential discounting makes long-horizon prevention and cure look more cost-effective and follows the Dutch/Belgian guideline logic, but it is contested (Gravelle & Smith vs. Claxton et al.) and only defensible when the cost-effectiveness threshold itself is assumed to grow. Prefer uniform unless the target HTA body mandates differential rates. - Constant exponential vs. declining/time-varying: Constant rates are standard and transparent; declining schedules materially raise the PV of effects realized decades out (vaccines, gene therapy, prevention) and are sanctioned by some treasuries for inter-generational horizons. Prefer constant for the reference case; present declining-rate results only as a scenario, clearly labeled, when the horizon exceeds ~30 years. - Exponential vs. hyperbolic: Hyperbolic better describes individual behavior but produces preference reversals and is rejected for reference-case evaluation; reserve it for behavioral/uptake sub-models, never for the primary ICER. - Discounting QALYs vs. leaving effects undiscounted: Some argue health should not be discounted at all. Leaving effects undiscounted while discounting costs is internally inconsistent (the Keeler-Cretin "paradox") and inflates the value of deferrable programs; do not present an undiscounted-effects base case for a reimbursement submission.
When to use
. Any cost-effectiveness, cost-utility, or cost-benefit model — and any budget-impact or cost-of-illness model with a time horizon longer than one year — built on RWE inputs that span multiple years (lifetime Markov/partitioned-survival models, multi-year claims cost streams, extrapolated survival). Always apply the rate(s) and price year of the decision-making jurisdiction, and always report the reference-case rate plus 0% and an upper-bound rate (e.g., 0%/3%/5% per the US Second Panel; NICE 1.5%/3.5%) as deterministic sensitivity analyses.
When NOT to use — and when it is actively misleading or dangerous
. - Single-period / within-year analyses. Discounting a 12-month claims cost comparison or a one-year budget-impact slice adds nothing and can confuse reviewers; report nominal values when the horizon is ≤1 year. - Wrong jurisdiction's rate. Submitting a NICE appraisal with the US 3% rate (or vice versa) is a reference-case violation that can invalidate the submission — the rate is not a free analyst choice. - Discounting nominal (inflated) dollars. If costs were not first deflated to a common price year, discounting a stream that already embeds inflation systematically understates real PV; this is a silent, common error. - Treating censored follow-up as zero future cost. In RWE, claims/EHR follow-up is right-censored. Summing observed discounted costs to the horizon as if censored patients incur nothing biases mean costs downward (informative censoring by survival). Use a censoring-aware estimator (Bang-Tsiatis inverse-probability-of-censoring weighting, or a Lin partitioned estimator that discounts within intervals) before applying the discount factor, not after. - Differential discounting chosen to hit a threshold. Switching from a uniform to a lower effects rate solely to push an ICER under the willingness-to-pay threshold, without the jurisdiction mandating it, is analytically indefensible.
Data-source operational depth
. - Claims (FFS vs. Medicare Advantage): Costs are `paid_amt` (plan-paid + patient-paid, per the chosen perspective) summed by service date into annual buckets relative to `index_date`. Failure mode: MA-only person-time lacks adjudicated FFS claims, so a patient who switches to MA appears to incur $0 in later years — an artifact, not a real cost stream; restrict cost accrual to FFS-observable enrollment and treat MA spans as censored, then carry that censoring into the PV estimator. Bundled/capitated services and claims-adjudication lag distort the timing of costs and therefore the discount factor applied — late-adjudicated claims for an early service must be attributed to the service year, not the payment year. - EHR: Encounter-driven capture means costs/charges are incomplete and out-of-system ("leakage") care is invisible; charge-to-cost ratios are needed to convert charges to costs before discounting, and missing periods must be treated as censored rather than zero. - Registry: Strong for adjudicated long-term effects (survival, disease milestones feeding QALYs) but typically weak for full cost capture; link to claims for the cost stream and to a death index so the survival weights driving discounted QALYs are right. - Linked claims-EHR-vital records: The ideal substrate for matching a discounted cost stream to a discounted survival/QALY stream, but linkage selection and order/fill/service-date discrepancies must be reconciled so costs and effects are bucketed into the same time origin before discounting.
Worked claims example
Question: lifetime incremental cost-effectiveness of a new therapy vs. an active comparator in a commercial + Medicare FFS cohort, modeled over a 20-year horizon with NICE-style r = 3.5% for both costs and effects (price year 2024). (1) For each `person_id`, define `year_from_index = floor((service_date - index_date)/365.25)` and sum `paid_amt` into annual cost buckets cost_0, cost_1, ... cost_19; deflate every cost to 2024 dollars using a medical-care price index before discounting. (2) Build the annual QALY stream: for each year alive (from KM/partitioned survival), multiply fractional time-alive in that year by the EQ-5D-mapped utility for that health state to get qaly_0 ... qaly_19. (3) Because follow-up is right-censored at disenrollment/end-of-data, estimate mean annual costs and QALYs with inverse-probability-of- censoring weights (Bang-Tsiatis) so censored patients are not counted as $0/0-QALY after their last observed year. (4) Discount each year: PV_cost = Σ_t cost_t/(1.035)^t and PV_qaly = Σ_t qaly_t/(1.035)^t, applying the factor to the mean censoring- adjusted stream. (5) Repeat per arm, then incremental ICER = (PV_cost_new − PV_cost_comp)/(PV_qaly_new − PV_qaly_comp) and discounted NMB = λ·ΔPV_qaly − ΔPV_cost at λ = $100,000/QALY. (6) Sensitivity: re-run at r = 0% and r = 5% for both streams, and (if the model targets a Dutch submission) a differential scenario with effects at 1.5% and costs at 4%; report all rates transparently as separate rows, never as the headline result.
Interpreting the output
The worked example discounts a two-year cost stream of $35,000 (Year 1) and $35,000 (Year 2) at 3% annually, producing a present value of approximately $67,396, compared with an undiscounted total of $70,000.
(1) Formal interpretation. The present-value calculation applies the factor 1/(1+r)^t to each period's cost and health gain. Year 1 costs are discounted by 1/1.03 ≈ 0.971 and Year 2 costs by 1/1.03² ≈ 0.943. The $2,604 reduction in present value over two years at 3% appears modest, but the compounding effect grows substantially over a 20- or 30-year model horizon: a QALY gained 20 years in the future at 3% discounting is worth only 1/1.03^20 ≈ 0.554 of a QALY gained today. Discounting applies to both cost and effect streams; applying it to costs but not to effects (or vice versa) is a methodological error. Jurisdiction-specific reference cases specify the rate: 3% (US, UK reference case), 3.5% (NICE base case), or differential rates for some European submissions.
(2) Practical interpretation. The $2,604 present-value reduction over two years illustrates why discounting matters most for chronic-disease models with long horizons. An intervention that prevents a cardiovascular event in year 10 is worth considerably less in present value than one preventing the same event next year — which is exactly why oncology and preventive-care models are more sensitive to the discount rate than acute-care models. Always run the 0% and 5% rate sensitivity scenarios alongside the reference-case rate; in submissions where results flip across this range, the discount-rate assumption should be highlighted as a key driver.
Worked example
Scenario
A new drug for a chronic condition has a startup infusion cost of $50,000 billed at the end of Year 1 and an annual maintenance cost of $20,000 billed at the end of Year 2. An analyst needs to report these two future costs as their present value today, using the US reference-case discount rate of 3% per year. The formula is PV = FV / (1 + r)^t, where FV is the future amount, r is the discount rate (0.03), and t is the number of years from today.
Dataset
Future cost stream for one patient, two years out. Each row is one cost event that has not yet occurred.
| year_from_index | label | future_cost_usd |
|---|---|---|
| 1 | Startup infusion | 50000 |
| 2 | Year 2 maintenance | 20000 |
Steps
Year 1 cost: divide $50,000 by (1.03)^1 = 1.03. Result: $50,000 / 1.03 = $48,543.69.
Year 2 cost: divide $20,000 by (1.03)^2 = 1.0609. Result: $20,000 / 1.0609 = $18,851.92.
Add the two present values: $48,543.69 + $18,851.92 = $67,395.61.
Undiscounted total (ignoring time) would be $50,000 + $20,000 = $70,000.
Discounting reduces the reported total by $2,604.39, reflecting that money paid in the future is worth less than money paid today.
Result
Present value of the two-year cost stream = $67,395.61, compared with an undiscounted total of $70,000. The $2,604.39 difference is modest over two years at 3%, but over a 20-year model horizon the gap between discounted and undiscounted costs (and health gains) becomes much larger and materially changes which treatment looks cost-effective.
Runnable example
python implementation
Present-value discounting of per-person annual cost and QALY streams, then discounted ICER and NMB. Required input (already cleaned, deflated to a common price year, and censoring-adjusted upstream): annual : long table -> person_id, arm in...
import pandas as pd
import numpy as np
R_COST = 0.03 # US Second Panel reference-case rate for costs
R_QALY = 0.03 # same rate for effects (set lower, e.g. 0.015, only for a mandated differential scenario)
WTP = 100_000 # willingness-to-pay threshold ($/QALY) for net monetary benefit
def discount_streams(annual: pd.DataFrame, r_cost=R_COST, r_qaly=R_QALY) -> pd.DataFrame:
df = annual.copy()
t = df["year_from_index"].to_numpy()
df["pv_cost"] = df["cost"] / (1.0 + r_cost) ** t # 1/(1+r)^t applied per period
df["pv_qaly"] = df["qaly"] / (1.0 + r_qaly) ** t
return (df.groupby("arm")[["pv_cost", "pv_qaly"]]
.sum()
.rename(columns={"pv_cost": "PV_cost", "pv_qaly": "PV_qaly"}))
def icer_nmb(pv: pd.DataFrame, wtp=WTP) -> dict:
d_cost = pv.loc["NEW", "PV_cost"] - pv.loc["COMPARATOR", "PV_cost"]
d_qaly = pv.loc["NEW", "PV_qaly"] - pv.loc["COMPARATOR", "PV_qaly"]
icer = np.nan if np.isclose(d_qaly, 0) else d_cost / d_qaly # undefined when no incremental effect
nmb_new = wtp * pv.loc["NEW", "PV_qaly"] - pv.loc["NEW", "PV_cost"]
nmb_comp = wtp * pv.loc["COMPARATOR", "PV_qaly"] - pv.loc["COMPARATOR", "PV_cost"]
return {"d_cost": d_cost, "d_qaly": d_qaly, "ICER": icer,
"incremental_NMB": nmb_new - nmb_comp}
pv = discount_streams(annual)
result = icer_nmb(pv)r implementation
Present-value discounting and discounted ICER/NMB from per-person annual streams. Input 'annual' mirrors the Python version (deflated, censoring-adjusted upstream): person_id, arm in {'NEW','COMPARATOR'}, year_from_index (0..H), cost, qaly
library(data.table)
R_COST <- 0.03; R_QALY <- 0.03; WTP <- 100000 # reference-case rates; set R_QALY < R_COST only for a mandated differential run
discount_streams <- function(annual, r_cost = R_COST, r_qaly = R_QALY) {
setDT(annual)
annual[, pv_cost := cost / (1 + r_cost)^year_from_index] # 1/(1+r)^t per period
annual[, pv_qaly := qaly / (1 + r_qaly)^year_from_index]
annual[, .(PV_cost = sum(pv_cost), PV_qaly = sum(pv_qaly)), by = arm]
}
icer_nmb <- function(pv, wtp = WTP) {
new <- pv[arm == "NEW"]; cmp <- pv[arm == "COMPARATOR"]
d_cost <- new$PV_cost - cmp$PV_cost
d_qaly <- new$PV_qaly - cmp$PV_qaly
icer <- if (isTRUE(all.equal(d_qaly, 0))) NA_real_ else d_cost / d_qaly
inc_nmb <- (wtp * new$PV_qaly - new$PV_cost) - (wtp * cmp$PV_qaly - cmp$PV_cost)
list(d_cost = d_cost, d_qaly = d_qaly, ICER = icer, incremental_NMB = inc_nmb)
}
pv <- discount_streams(annual)
result <- icer_nmb(pv)