Cost-Benefit Analysis (CBA)
A full economic evaluation that values both the costs and the health (and non-health) consequences of an intervention in the same monetary units, expressing the result as incremental net monetary benefit or a benefit-cost ratio to inform allocation decisions, including across non-health sectors.
In plain language
Cost-benefit analysis (CBA) answers the question: does this program return more money in benefits than it costs? It works by converting every consequence of the program — lives saved, injuries avoided, sick days prevented — into dollar values, then subtracting the program's total cost from those monetized benefits. If the result (called net benefit) is positive, the program is worth the investment; a benefit-cost ratio above 1.0 means every dollar spent generates more than a dollar back. The key difference from cost-effectiveness analysis is that CBA keeps everything in dollars, while cost-effectiveness analysis leaves the health outcome in its natural units (such as events avoided or life-years gained) and never assigns it a dollar value.
Cost-benefit analysis (CBA)
is the only full economic evaluation that places both sides of the ledger in money. Costs (intervention, downstream medical and pharmacy, and — under a societal perspective — patient time, caregiver burden, and productivity) and consequences (deaths averted, events avoided, symptom-days, QALYs, productivity restored) are each converted to a common monetary scale. The decision rule is then internal to the analysis: an intervention is "worth it" if its incremental net monetary benefit (NMB) — monetized incremental benefit minus incremental cost — is positive, or equivalently if its benefit-cost ratio (BCR) exceeds 1. This is what separates CBA from cost-effectiveness analysis (CEA) and cost-utility analysis (CUA), which keep the outcome in natural units (life-years) or QALYs and import an external willingness-to-pay (WTP) threshold to decide. CBA does not borrow a threshold; it bakes the valuation of health into the estimate itself.
Core conceptual distinction
The CBA estimand is the incremental net monetary benefit of intervention vs comparator, NMB = (lambda x deltaE) - deltaC, where deltaE is the incremental effect in natural units, deltaC the incremental cost, and lambda the monetary value assigned to one unit of that effect. Algebraically this is identical to the net-benefit form of CEA — but the meaning of lambda is the crux. In CEA/CUA lambda is a decision-maker's threshold (e.g., a payer's cost-per-QALY ceiling) and the analyst reports results across a range of lambda (the net-benefit / cost-effectiveness acceptability curve). In CBA lambda is a claim about the social value of health itself, drawn from one of two valuation paradigms that must be pre-specified and never silently mixed: the human-capital approach (value = lost market production: wages x days lost, plus discounted lifetime earnings for premature mortality) and the welfarist / willingness-to-pay approach (value = what people will pay to obtain the health gain, from contingent valuation, discrete-choice experiments, or a value-of-a-statistical-life-year, VSLY). The two can differ by an order of magnitude and embed different ethics; reporting "a CBA" without stating which is uninterpretable.
Pros, cons, and trade-offs
- vs cost-effectiveness analysis (CEA): CEA's incremental cost-effectiveness ratio (ICER, deltaC/deltaE) is undefined or unstable near deltaE = 0, flips sign across quadrants of the cost-effectiveness plane, and cannot be averaged or summed. CBA's NMB is a single signed number on a linear scale: it has a defined variance, can be regressed, and can be added across programs — which is precisely why budget holders comparing a vaccine program against a road-safety program reach for it. Cost: CBA forces an explicit price on health that CEA sidesteps by leaving lambda to the decision-maker. - vs cost-utility analysis (CUA): CUA's QALY is itself a partial monetization-substitute — a preference-weighted health unit accepted across HTA bodies (NICE, ICER, CADTH) without anyone "pricing life." CBA can capture benefits the QALY structurally misses (productivity, spillovers to education/justice/environment, process utility, option value), but at the cost of contested valuation and weaker comparability with the existing HTA evidence base. Prefer CUA for within-health- system reimbursement; prefer CBA only when the decision genuinely spans sectors or a monetary ROI is the explicit ask. - vs cost-consequence analysis (CCA): CCA lists disaggregated costs and each consequence in its own natural unit and lets the decision-maker weight them. It is CBA with the final monetization step removed. CCA is honest when valuation is too contested to defend, but it abdicates the synthesis CBA exists to provide and cannot rank dissimilar programs. - The distributional blind spot (the central CBA failure mode): because the human-capital approach values a day of a high earner's restored productivity above a low earner's, and WTP rises with income, a naive CBA systematically favors interventions concentrated in wealthier, working-age, employed populations and understates benefit to retirees, children, the unemployed, and the disabled. This is not a rounding error — it can reverse a recommendation. CEA/CUA with a fixed lambda per QALY avoid it by construction. Equity weighting, distributional CBA (DCBA), or simply defaulting to CUA are the standard responses.
When to use
Multi-sectoral or public-health decisions where the consequences are heterogeneous and a single monetary metric is the only common denominator: vaccination and screening programs, occupational-health and workplace interventions, injury prevention, environmental-health regulation, and any setting where a budget holder explicitly wants net monetary return or a BCR. CBA is also natural when a large share of the benefit is non-health (productivity, averted criminal- justice or special-education costs) that a QALY cannot carry.
When NOT to use — and when it is actively misleading or dangerous
- Standard payer reimbursement / HTA submission. Most agencies require CEA/CUA with a cost-per-QALY against their own threshold; a CBA monetizing the QALY internally answers a question they did not ask and will be rejected or, worse, silently misread as a cost-per-QALY. - When the population is non-working or income-heterogeneous and human-capital valuation is used. A CBA of a pediatric, geriatric, or disability intervention valued by lost wages will mechanically conclude the intervention has little benefit. This is the single most dangerous misuse: the method appears rigorous while encoding a value judgment that the analyst may not even realize they made. - Double counting. If patient out-of-pocket spending is already in the cost column and the same avoided spending also appears inside a WTP figure (people partly pay to avoid costs they bear), the benefit is counted twice. The same trap catches productivity counted both as an averted cost and as a monetized benefit, and morbidity counted both in QALYs and in absenteeism. - When deltaE itself is biased. CBA inherits every confounding, immortal-time, and competing-risk problem of the underlying effect estimate; a clean monetization layer on a confounded effect produces a confidently wrong NMB.
Data-source operational depth
The cost side of a CBA is a healthcare-cost analysis (see healthcare-costs-pppm-pppy-pmpm); the benefit side is an effect estimate (often from an active-comparator new-user cohort) plus an external valuation. Each substrate fails differently. - Claims (FFS vs MA): The natural source for the cost arm — allowed/paid amounts, place-of-service and medical/pharmacy splits, PPPM/PPPY standardization on exact observed person-time, pre-specified outlier rules, and two-part/GLM modeling of the cost distribution. Failure modes: Medicare Advantage person-time carries no fee-for-service claim lines, so MA enrollees contribute outcomes but near-zero observed cost — including them deflates the cost arm and inflates NMB; restrict cost estimation to FFS-observable person-time or model the gap. Capitated/bundled arrangements hide unit costs the same way. Productivity is essentially absent from medical claims — at best a short-term-disability or absenteeism feed in employer-sourced data; otherwise it must be imputed (clinical improvement -> assumed work-days restored x wage), which is the largest source of CBA uncertainty and belongs in the PSA, not the base case alone. - EHR: Strong for the clinical effect, severity, and PROs that anchor benefit valuation, but holds charges/RVUs, not paid amounts — do not treat EHR charges as cost. Link to claims for costing. Visit-driven capture means a patient who leaves the system is differentially lost, biasing both the cost and effect arms. - Registry: Best for validated/adjudicated outcomes feeding the benefit estimate (e.g., cancer stage, MACE); weak for complete cost capture. Link to claims for costs and to a death index so that competing mortality, which differs by exposure in elderly populations, does not silently truncate downstream cost accrual differently across arms. - Linked claims-EHR-registry-survey: The ideal CBA substrate — registry/EHR effect + claims cost + a survey arm for WTP/productivity calibration — but linkage selects the linkable subset and creates order/fill/service-date discrepancies that must be reconciled before costs and effects are attributed to the same time window.
Worked claims-style example
Question: does an employer-sponsored migraine prophylaxis program (vs no program) deliver positive net monetary benefit over 1 year, from a societal perspective, in a commercial + Medicare FFS database? (1) Cohorts: program initiators and a propensity-matched non-program comparator, each with >=365 days continuous medical + pharmacy enrollment before `index_date` and excluding MA-only person-time so paid amounts are observed. (2) Cost arm: sum all allowed amounts in the 365-day follow-up (medical + pharmacy), standardize to PPPM on exact person-time, apply a pre-specified high-cost outlier rule, and model with a two-part/gamma GLM; deltaC = adjusted mean cost difference. (3) Benefit arm: the effect is migraine-days averted, derived from a comparative model of acute-medication fills (`days_supply` on triptan/NSAID NDCs) and ED/office visits with a primary migraine diagnosis (first-event coding within a 30-day clean window) — note this is a utilization-based proxy for migraine-days, not a directly observed claims field, so its conversion to averted symptom-days is itself an assumption that must be stated. (4) Monetization: value each averted migraine-day by the human-capital approach (mean daily wage x productivity fraction lost per migraine-day from the literature) for the societal perspective, and run a WTP-per-day alternative as a scenario; never add both. Because the benefit chain is fills/visits -> imputed migraine-days -> imputed work-days lost -> wage, every link is a PSA parameter, not a fixed base-case input. (5) Net benefit: NMB = (lambda x migraine-days averted) - deltaC, discounting any benefit/cost stream beyond 1 year if the horizon is extended. (6) Uncertainty: PSA drawing deltaC from the GLM, the effect from its sampling distribution, and lambda from a wide distribution over the wage/WTP value; report the share of simulations with NMB > 0 (net-benefit acceptability) and a one-way tornado on lambda and the discount rate. (7) Perspective split: report payer (plan-paid only, no productivity) and societal (adds patient liability + productivity) side by side per CHEERS 2022, and check explicitly that out-of-pocket spending is not also embedded in the WTP figure.
Interpreting the output
The worked example yields a net benefit of $120,000 and a benefit-cost ratio (BCR) of 1.60: the program costs $75,000 and generates $195,000 in monetized benefits (averted medical costs plus productivity gains valued at WTP), so NB = $195,000 − $75,000 = $120,000 and BCR = $195,000 / $75,000 = 1.60.
(1) Formal interpretation. A positive net benefit means the total monetized value of the health gains exceeds the total cost of the program: the intervention generates more value than it consumes when health is valued at the stated willingness-to-pay figure. A BCR above 1 conveys the same information in ratio form: each dollar spent returns $1.60 in monetized benefit. Unlike the ICER, the CBA result is expressed entirely in currency, so the decision rule is simply NB > 0 (or BCR > 1) rather than comparison with a separate threshold. However, the result is only as credible as the WTP value used to monetize health outcomes — this is the critical assumption that should be varied in sensitivity analysis.
(2) Practical interpretation. The program appears worthwhile at the assumed WTP. Analysts and decision-makers must scrutinize what the benefit figure includes: were productivity losses valued at market wages or shadow prices? Were patient out-of-pocket savings included — and if so, were they also counted in the cost side? A CBA that double-counts or uses an implausibly high WTP figure can make almost any intervention look favorable. Reporting sensitivity of NB across a range of WTP values (for example, $50,000 to $200,000 per QALY equivalent) is essential for transparent decision-making.
Worked example
Scenario
A regional health department spends $200,000 to run a one-year workplace fall-prevention program at ten manufacturing plants. An analyst wants to know whether the program is worth the investment. To answer this using CBA, both the program cost and the benefits (injuries prevented) must be expressed in dollars. The analyst identifies 40 fewer lost-workday injuries in the treated plants compared to matched control plants during the same year. Each averted lost-workday injury is valued at $8,000 using published wage-replacement and medical-cost data (this is the human-capital approach to monetization). The analyst then computes net benefit and the benefit-cost ratio.
Dataset
Program inputs used to compute net benefit and BCR.
| item | value_dollars | note |
|---|---|---|
| Program cost (total) | 200000 | Staff, training materials, site visits for 10 plants over 1 year |
| Injuries averted (count) | 40 | Difference-in-differences estimate vs matched control plants |
| Dollar value per averted injury | 8000 | Wage replacement + averted medical costs, human-capital approach |
| Total monetized benefit | 320000 | 40 injuries x $8,000 each |
Steps
Identify total program cost: $200,000.
Count averted injuries: 40 fewer lost-workday injuries in the treated plants versus controls.
Assign a dollar value to each averted injury using the human-capital approach: $8,000 per injury (wage replacement costs plus averted medical spending).
Compute total monetized benefit: 40 injuries x $8,000 = $320,000.
Compute net benefit: $320,000 (benefit) - $200,000 (cost) = $120,000.
Compute benefit-cost ratio (BCR): $320,000 / $200,000 = 1.60.
Note the contrast with cost-effectiveness analysis: a cost-effectiveness analyst would report '$5,000 per injury avoided' (i.e., $200,000 / 40) and let the decision-maker judge whether that cost per event is acceptable; CBA instead assigns each injury a dollar value and collapses everything to a single net-benefit number, so no external judgment about what one injury is worth is needed from the decision-maker.
Result
Net benefit = $120,000 (positive, so the program returns more than it costs). BCR = 1.60, meaning every $1.00 spent on the program returns $1.60 in monetized benefits. The program is worthwhile on both metrics.
Runnable example
python implementation
Deterministic CBA net-benefit and benefit-cost ratio from two model inputs (no toy data is fabricated inside the analysis; supply these from your cohort + claims pipeline): arm_summary : one row per arm -> arm in {'comparator','intervention'}, mean_cost...
import pandas as pd
def cba_net_benefit(arm_summary: pd.DataFrame, valuation: dict) -> dict:
s = arm_summary.set_index("arm")
# Incremental contrasts: intervention minus comparator.
delta_cost = float(s.loc["intervention", "mean_cost"] - s.loc["comparator", "mean_cost"])
delta_effect = float(s.loc["intervention", "mean_effect"] - s.loc["comparator", "mean_effect"])
lam = float(valuation["lambda_per_effect"]) # human-capital wage value OR WTP/VSLY -- pre-specified, not mixed
monetized_benefit = lam * delta_effect # money value of the incremental health/productivity gain
# DOUBLE-COUNTING GUARD: do not add a productivity benefit here if that same productivity already nets out
# inside delta_cost (e.g. averted disability payments in the cost column). Resolve before calling this function.
nmb = monetized_benefit - delta_cost # incremental net monetary benefit; >0 favors intervention
# BCR convention: monetized benefit over *incremental* cost; only interpretable when delta_cost > 0.
bcr = monetized_benefit / delta_cost if delta_cost > 0 else float("nan")
return {
"perspective": valuation["perspective"],
"delta_cost": delta_cost,
"delta_effect": delta_effect,
"monetized_benefit": monetized_benefit,
"incremental_nmb": nmb,
"benefit_cost_ratio": bcr,
"favors_intervention": nmb > 0,
}python implementation
Probabilistic CBA: net-benefit acceptability over a range of lambda. This is the headline CBA output because lambda (the monetary value of one effect unit) is usually the dominant uncertainty. Plot p_nmb_positive against lambda for the net-benefit...
import numpy as np
import pandas as pd
def nmb_acceptability(cost_draws, effect_draws, lambda_grid) -> pd.DataFrame:
dc = np.asarray(cost_draws, dtype=float)
de = np.asarray(effect_draws, dtype=float)
if dc.shape != de.shape:
# Paired draws are required so the cost-effect correlation is preserved across the PSA.
raise ValueError("cost_draws and effect_draws must be paired (same shape) to preserve correlation")
rows = []
for lam in lambda_grid:
nmb = lam * de - dc # vectorized incremental NMB across all PSA draws
rows.append({
"lambda": float(lam),
"mean_nmb": float(nmb.mean()),
"p_nmb_positive": float((nmb > 0).mean()), # net-benefit acceptability at this lambda
})
return pd.DataFrame(rows)