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 et al. 2024; Enright et al. 2025; Do et al. 2021) Despite their utility, such models have been criticised as overly limited in scope, omitting important elements of value(Breslau et al. 2023; Shafrin et al. 2024)] and health equity(Avanceña and Prosser 2021). Anticipated pricing dynamics are routinely ignored, meaning that the long run opportunity cost for drugs may be misrepresented,(Neumann et al. 2022) and single cohort modeling is criticized as not tailored to properly inform decision-making that will impact future cohorts of patients(Hoyle and 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.(Schöttler et al. 2023; Whittington et al. 2025; Moreno and Ray 2016)
In a recent review, Puls et al listed four challenges in modeling life cycle drug pricing and offered some proposals.(Puls et al. 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 et al. 2025; Jofre-Bonet et al. 2025; Serra-Burriel et al. 2024; Laube et al. 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 and 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 et al. 2024)
There are now a growing number of publications of cost-effectiveness
evaluations with dynamic pricing and uptake.(Puls
et al. 2024; Schöttler et al. 2023; Whittington et al. 2025; Shafrin et
al. 2024; Moreno and Ray 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 and Anderson 2010; Shafrin et al.
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 et al. 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:
- patients who are in the third timestep of treatment that began in timestep 1, \((j,k) = (1, 3)\);
- patients who are in the second timestep of treatment that began in timestep 2, \((j,k) = (2, 2)\); and
- patients who are in the first timestep of treatment that began in timestep 3, \((j,k) = (3, 1)\).
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.
