The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Budget Impact Applications

Introduction

Our objective is to evaluate the budget impact of introducing a new intervention, assuming static or dynamic pricing. Uptake in budget impact models is already modeled in a dynamic fashion.

Methods and Assumptions

General assumptions

Budget impact models conventionally have no discounting and a shorter time horizon than cost-effectiveness models, so we will use a time horizon of 5 years here and a discount rate of 0%. We will compute a budget impact model using current pricing (per convention) as well as by using dynamic pricing according to the assumptions previously set.

Dynamic pricing

To recap, we had the following assumptions concerning pricing, with a date of calculation of 2025-09-01.

Dynamic uptake

We had the following assumptions concerning patient uptake.

Implementation

Set-up

First we load the packages necessary for this vignette.

library(dplyr)
library(lubridate)
library(heemod)
library(dynamicpv)

The underlying health economic model is built as described in vignette("cost-effectiveness-applications"). We require additional coding for the budget impact evaluation.

# BIM settings
bi_horizon_yrs <- 5
bi_horizon_wks <- round(bi_horizon_yrs / cycle_years)
bi_discount <- 0

# Newly eligible patients
newly_eligible <- rep(1, Ncycles)

# Time for uptake to occur
uptake_years <- 2
uptake_weeks <- round(uptake_years / cycle_years)

# Market share of new intervention
share_multi <- c((1:uptake_weeks)/uptake_weeks, rep(1, Ncycles-uptake_weeks))

# Newly eligible patients receiving each intervention, "world with"
uptake_new <- newly_eligible * share_multi
uptake_soc <- newly_eligible - uptake_new

Results

Static prices

First we consider static prices, i.e. we assume the prices of existing resources remain unchanged from now in the horizon of the budget impact model. Let us use that function to calculate budgetary costs for the world without the new intervention.

# World without new intervention

# SoC, drug acquisition costs
wout1_soc_daqcost <- dynpv(
    uptakes = newly_eligible,
    payoffs = hemout_soc$cost_daq_soc_rup,
    horizon = bi_horizon_wks,
    prices = prices_static,
    discrate = bi_discount
    )

# SoC, other costs
wout1_soc_othcost <- dynpv(
    uptakes = newly_eligible,
    payoffs = hemout_soc$cost_nondaq_rup,
    horizon = bi_horizon_wks,
    prices = prices_static,
    discrate = bi_discount
    )

# Total budgetary costs
budget_wout1 <- budget_wout1_soc <- wout1_soc_daqcost + wout1_soc_othcost

The total budgetary costs in the world without are $12,923,366 in respect of 522 patients.

Let us now calculate the budgetary costs in the world with the new intervention.

# World with

# SoC, drug acquisition costs
with1_soc_daqcost <- dynpv(
    uptakes = uptake_soc,
    payoffs = hemout_soc$cost_daq_soc_rup,
    horizon = bi_horizon_wks,
    prices = prices_static,
    discrate = bi_discount
    )

# SoC, other costs
with1_soc_othcost <- dynpv(
    uptakes = uptake_soc,
    payoffs = hemout_soc$cost_nondaq_rup,
    horizon = bi_horizon_wks,
    prices = prices_static,
    discrate = bi_discount
    )

# New intervention, drug acquisition costs
with1_new_daqcost <- dynpv(
    uptakes = uptake_new,
    payoffs = hemout_new$cost_daq_new_rup,
    horizon = bi_horizon_wks,
    prices = prices_static,
    discrate = bi_discount
    )

# New intervention, other costs
with1_new_othcost <- dynpv(
    uptakes = uptake_new,
    payoffs = hemout_new$cost_nondaq_rup,
    horizon = bi_horizon_wks,
    prices = prices_static,
    discrate = bi_discount
    )

# Total
budget_with1_soc <- with1_soc_daqcost + with1_soc_othcost
budget_with1_new <- with1_new_daqcost + with1_new_othcost
budget_with1 <- budget_with1_soc + budget_with1_new
#> Warning in addprod(e1, e2, mult = 1): Uptake vectors differ in length

Note the warning provided by dynamicpv. This is because the uptake vector for SoC, when trimmed of zeroes after uptake stops, has a different (shorter) length than the uptake vector for the new intervention. The calculation is still correct. However, the function is flagging for the user the different uptake vectors being used for different present value calculations.

# The uptake vector for the new intervention is long
length(trim_vec(uptake_new))
#> [1] 1044

# The uptake vector for the SoC is short, once trimmed of excess zeros
length(trim_vec(uptake_soc))
#> [1] 103

The budgetary costs in the world with the new intervention are $26,964,789, comprising $3,508,178 in respect of the costs of 103 patients being treated with the SoC, and $23,456,610 in respect of the costs of 419 patients being treated with the SoC.

# Budget impact
bi1_soc <- budget_with1_soc - budget_wout1_soc
#> Warning in addprod(e1, e2, mult = -1): Uptake vectors differ in length
bi1_new <- budget_with1_new
bi1 <- budget_with1 - budget_wout1

summary(bi1)
#> Summary of Dynamic Pricing and Uptake
#>      Number of cohorts:             261 
#>      Number of times:               1 
#>      Total uptake:                  0 
#>      Total present value:           14041423 
#>      Mean present value:            Inf

The total budget impact is $14,041,423, representing an increase of 109%.

Dynamic prices

Now let us recalculate the budget impact, assuming dynamic pricing in drug acquisition costs. This is simple with dynamicpv()::dynpv() because we just change the prices argument from prices_static to either prices_dyn_soc or prices_dyn_new for the drug acquisition costs. We will keep other costs unchanged.

# World without new intervention

# SoC, drug acquisition costs
wout2_soc_daqcost <- dynpv(
    uptakes = newly_eligible,
    payoffs = hemout_soc$cost_daq_soc_rup,
    horizon = bi_horizon_wks,
    prices = prices_dyn_soc,
    discrate = bi_discount
    )

# SoC, other costs - unchanged from static calculations
wout2_soc_othcost <- wout1_soc_othcost

# Total budgetary costs
budget_wout2 <- budget_wout2_soc <- wout2_soc_daqcost + wout2_soc_othcost

The total budgetary costs in the world without are $11,516,132 in respect of 522 patients.

Let us now calculate the budgetary costs in the world with the new intervention.

# World with

# SoC, drug acquisition costs
with2_soc_daqcost <- dynpv(
    uptakes = uptake_soc,
    payoffs = hemout_soc$cost_daq_soc_rup,
    horizon = bi_horizon_wks,
    prices = prices_dyn_soc,
    discrate = bi_discount
    )

# SoC, other costs
with2_soc_othcost <- with1_soc_othcost

# New intervention, drug acquisition costs
with2_new_daqcost <- dynpv(
    uptakes = uptake_new,
    payoffs = hemout_new$cost_daq_new_rup,
    horizon = bi_horizon_wks,
    prices = prices_dyn_new,
    discrate = bi_discount
    )

# New intervention, other costs
with2_new_othcost <- with1_new_othcost

# Total
budget_with2_soc <- with2_soc_daqcost + with2_soc_othcost
budget_with2_new <- with2_new_daqcost + with2_new_othcost
budget_with2 <- budget_with2_soc + budget_with2_new
#> Warning in addprod(e1, e2, mult = 1): Uptake vectors differ in length

Notice that there is a similar warning as earlier. The budgetary costs in the world with the new intervention are $28,535,724, comprising $3,460,107 in respect of the costs of 103 patients being treated with the SoC, and $25,075,617 in respect of the costs of 419 patients being treated with the new treatment.

# Budget impact
bi2_soc <- budget_with2_soc - budget_wout2_soc
#> Warning in addprod(e1, e2, mult = -1): Uptake vectors differ in length
bi2_new <- budget_with2_new
bi2 <- budget_with2 - budget_wout2

summary(bi2)
#> Summary of Dynamic Pricing and Uptake
#>      Number of cohorts:             261 
#>      Number of times:               1 
#>      Total uptake:                  0 
#>      Total present value:           17019592 
#>      Mean present value:            Inf

The total budget impact is $17,019,592, representing an increase of 148%.

Summary

Budget Impact model results with and without dynamic drug pricing
Static drug pricing Dynamic drug pricing
World without new intervention
Standard of Care 12,923,366 11,516,132
New intervention 0 0
Total 12,923,366 11,516,132
World with new intervention
Standard of Care 3,508,178 3,460,107
New intervention 23,456,610 25,075,617
Total 26,964,789 25,075,617
Budget impact
Standard of Care -9,415,187 -8,056,025
New intervention 23,456,610 25,075,617
Absolute impact 14,041,423 17,019,592
Relative impact (%) 109% 148%

Discussion

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.