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.
On this page
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 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.
Decision diagram
flowchart TD Q[Reimbursement jurisdiction of the decision] --> US[US Second Panel<br/>3% costs and effects<br/>0% and 5% sensitivity] Q --> NICE["NICE England/Wales<br/>3.5% both<br/>1.5% in defined life-extending cases"] Q --> NL["ZIN Netherlands<br/>4% costs / 1.5% effects<br/>differential"] Q --> PBAC[PBAC Australia<br/>5% both] Q --> CADTH[CADTH Canada<br/>1.5% both] US --> Apply["Deflate costs to common price year<br/>then apply 1/(1+r)^t per period"] NICE --> Apply NL --> Apply PBAC --> Apply CADTH --> Apply Apply --> PV[Sum to PV costs and PV effects<br/>then ICER and NMB]
flowchart LR Y0[Year 0 cost C0<br/>factor 1.000] --> S[Sum of discounted period values = PV] Y1[Year 1 cost C1<br/>factor 1/1.03 = 0.971] --> S Y5[Year 5 cost C5<br/>factor 1/1.03^5 = 0.863] --> S Y10[Year 10 cost C10<br/>factor 1/1.03^10 = 0.744] --> S Y20[Year 20 cost C20<br/>factor 1/1.03^20 = 0.554] --> S S --> Note[Same factors applied to the QALY stream at the effects rate]
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
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.
Trade-offs
Runnable example
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 {'NEW','COMPARATOR'}, year_from_index (0..H), cost (real $ that year), qaly...
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)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)Discounting of per-person-year claims-style cost and QALY streams in a DATA step, then discounted ICER/NMB. Required input (deflated to a common price year and censoring-adjusted upstream): work.annual : person_id, arm ('NEW'/'COMPARATOR'), year_from_index (0..H), cost, qaly The DATA step computes 1/(1+r)**t per...
%let rcost = 0.03; /* reference-case discount rate for costs */
%let rqaly = 0.03; /* reference-case discount rate for effects */
%let wtp = 100000; /* willingness-to-pay threshold ($/QALY) */
/* Apply 1/(1+r)**t to each person-year cost and QALY value. */
data discounted;
set work.annual;
pv_cost = cost / (1 + &rcost) ** year_from_index;
pv_qaly = qaly / (1 + &rqaly) ** year_from_index;
run;
/* Present value by arm. */
proc sql;
create table pv as
select arm,
sum(pv_cost) as PV_cost,
sum(pv_qaly) as PV_qaly
from discounted
group by arm;
quit;
/* Discounted incremental ICER and net monetary benefit. */
proc sql;
create table result as
select (n.PV_cost - c.PV_cost) as d_cost,
(n.PV_qaly - c.PV_qaly) as d_qaly,
case when (n.PV_qaly - c.PV_qaly) = 0 then .
else (n.PV_cost - c.PV_cost) / (n.PV_qaly - c.PV_qaly)
end as ICER,
((&wtp * n.PV_qaly - n.PV_cost)
- (&wtp * c.PV_qaly - c.PV_cost)) as incremental_NMB
from (select * from pv where arm = 'NEW') as n,
(select * from pv where arm = 'COMPARATOR') as c;
quit;Citations
- [1]Attema AE, Brouwer WBF, Claxton K. Discounting in economic evaluations. PharmacoEconomics. 2018;36(7):745-758.
- [2]Sanders GD, Neumann PJ, Basu A, et al. Recommendations for conduct, methodological practices, and reporting of cost-effectiveness analyses: Second Panel on Cost-Effectiveness in Health and Medicine. JAMA. 2016;316(10):1093-1103.