Mathematical Framework

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

Introduction and Motivation

Single cohort cost-effectiveness models are routinely used in the decision making of Health Technology Assessment (HTA) bodies, and are widely published in the scientific literature.[@espinosa_2024; @enright_2025; @do_2021] Despite their utility, such models have been criticised as overly limited in scope, omitting important elements of value[@breslau_2023; @shafrin_2024]] and health equity[@avancena_2021]. Anticipated pricing dynamics are routinely ignored, meaning that the long run opportunity cost for drugs may be misrepresented,[@neumann_2022] and single cohort modeling is criticized as not tailored to properly inform decision-making that will impact future cohorts of patients[@hoyle_anderson_2010]. Case studies have shown how modeling pricing and uptake as dynamic can have substantial effects on reported Incremental Cost-Effectiveness Ratio (ICER) values. Without accounting for these effects, ICERs are overstated and unrepresentative.[@schottler_2023; @whittington_2025a; @moreno_2016]

In a recent review, Puls et al listed four challenges in modeling life cycle drug pricing and offered some proposals.[@puls_2024] Pricing changes before Loss of Exclusivity (LoE) events are ‘usually small’ but local pricing data can be informative, whereas after LoE, changes to pricing ‘should be informed by country-specific and historical estimates of average price reductions’, such as may be found in recent reviews.[@lin_2025; @bonet_2025; @serra_2024; @laube_2024] Following earlier recommendations by by Hoyle and Anderson, cost-effectiveness evaluations should include future incident cohorts in addition to the present, prevalent cohort,[@hoyle_anderson_2010] though assumptions may need to be simplified to facilitate calculation. Reporting should include individual and multiple cohorts, assuming uniform or utilization-informed weightings.[@puls_2024]

There are now a growing number of publications of cost-effectiveness evaluations with dynamic pricing and uptake.[@puls_2024; @schottler_2023; @whittington_2025a; @shafrin_2024; @moreno_2016] The purpose of this R package is to provide a simple tool to conduct calculations of present values that allow for dynamic pricing and dynamic uptake. The mathematical framework presented in this vignette formalizes what others have developed and applied,[@hoyle_anderson_2010;@shafrin_2024] and provides the technical basis of the calculations within the dynamicpv package. Other vignettes cover calculations of Net Present Values, and illustrate how cost-effectiveness and budget impact models can account for dynamic pricing and uptake. The present scope of the package is models in discrete time only.

What are dynamic pricing and dynamic uptake?

Dynamic pricing is pricing of a resource (e.g. acquisition cost of a medicine, wages of a professional) that changes in time. The opposite of dynamic pricing is static pricing. We may assume prices are static in nominal terms - they are constant and do not change value in time at all; or we may assume prices are static in real terms, in which case, were it not for price inflation, prices would be constant. Alternatively, pricing can be expected to be quite irregular - such as when drug prices dramatically reduce after branded products lose exclusivity. Reflecting these dynamics complicates calculations of Net Present Value, but is more realistic.

Dynamic uptake refers to the modeling of multiple series of payoffs/cashflows over time, rather than the modeling of just one series of payoffs/cashflows at a time. This may arise, for example, in considering the treatment costs of multiple cohorts of patients beginning their treatment courses at different times, leading to the term 'stacked cohorts'. There are also analogies to 'run-off triangles' used by insurance actuaries to model the emergence of insurance claims over time following claim events. This is already commonly a consideration in budget impact models in healthcare, but also relevant to cost-effectiveness.[@sullivan_2014]

Framework

The framework for these calculations is centered around the idea of costs and outcomes accruing to patients as they receive treatment, or more generally experience the consequences of an intervention. Time may be partitioned therefore between the time to begin treatment and the time since starting treatment.

More formally, suppose $j=1, ..., J$ indexes the time at which the patient begins treatment (e.g. a new intervention or Standard of Care, SoC). Suppose $k=1, ..., K$ indexes time since initiating treatment. Time is $t=j+k-1$, and we are interested in $t=1,...,T$, where $T$ is the time horizon of the decision-maker.

This can be illustrated through an example. Suppose then we are considering a cashflow in timestep $t=3$. This will comprise:

The Present Value of a cashflow $p_k$ for the $u_j$ patients who began treatment at time $j$ and who are in their $k$th timestep of treatment is as follows

$$ PV(j,k) = u_j \cdot p_k \cdot R_{j+k-1} \cdot (1+i)^{2-j-k} $$

where $i$ is the risk-free discount rate per timestep, and $p_k$ is the cashflow amount in today's money, and $p_k \cdot R_{j+k-1}$ is the nominal amount of the cashflow at the time it is incurred.

The total present value is therefore the sum over all $j$ and $k$ within the time horizon $T$. The full function used by the package allows for additional offsetting of the price uprating factor $R$ by time $l$. This can be useful for calculating present values at different present times.

$$ TPV(l) = \sum_{j=1}^{T} \sum_{k=1}^{T-j+1} PV(j, k, l) = \sum_{j=1}^{T} \sum_{k=1}^{T-j+1} u_j \cdot p_k \cdot R_{j+k+l-1} \cdot (1+i)^{2-j-k} $$

Overview of package

The dynamicpv::dynpv() function operationalizes the formula above. It produces output of the class 'dynpv', to which the following methods may be applied.

| Method | Description | Value | |--------|-------------|-------| | mean() | Mean present value per uptaking patient | $TPV(l) / \sum_{j=1}^{T} u_j =$ total()/uptake() | | ncoh() | Number of cohorts of uptaking patients | $n({u_j})$ | | ntimes() | Number of times at which present value calculations are performed | $n({l})$ | | sum_by_coh() | Present value for each uptake cohort j and calculation time l | $\sum_{k=1}^{T-j+1} PV(j,k,l)$ | | summary() | Summarize a dynpv object | Text | | total() | Total present value | $TPV(l)$ | | uptake() | Total number of uptaking patients | $\sum_{j=1}^{T} u_j$ |

Also, methods + and - can be used to add and subtract two dynpv objects. It is important to note when interpreting the mean() that the arithmetic operations add/subtract the total() and uptake() values of the objects.

The dynamicpv::futurepv() function calculates the present value of a series of payoffs for a single given cohort, entering at given future time, allowing for dynamic pricing. This function is a wrapper for dynpv() restricted to evaluation of a single cohort.

References



Try the dynamicpv package in your browser

Any scripts or data that you put into this service are public.

dynamicpv documentation built on Jan. 16, 2026, 1:07 a.m.