Costing a reuse scenario

library(ambre)
set.seed(2024)

Safety is not the only thing that decides a reuse scheme – someone has to pay for it. Alongside the health assessment, ambre estimates what a scenario costs: the up-front investment and the yearly bill of the barriers it puts in place. This vignette walks through that costing. It pairs naturally with the risk side in vignette("b-initial-vs-new-scenario", package = "ambre") – the whole point being to weigh what each strategy buys against what it costs.

The three levers

run_economic_analysis() takes your scenario plus three financial parameters and boolean to indicate to calculate cost for initial situation supplementary process:

run_economic_analysis(scenario, membership_fee, 
                      price_per_m3, grant, initialSituation = FALSE)

What the model computes

Before any cost, run_economic_analysis() calls irrigation_need_calculation() to work out how much water each row needs (from its crop and area). It then splits the bill along two axes:

The per-barrier unit prices come from config_ambre$economic$cost, each with a unit string (€/m3, €/ha, €/ml of perimeter, €/p per person…):

config_ambre$economic$cost[, c("TreatmentName", "CostType", "value", "unit")] |>
  head(8)
#> # A tibble: 8 × 4
#>   TreatmentName            CostType value unit  
#>   <chr>                    <chr>    <dbl> <chr> 
#> 1 Q.1 - Activated Sludge   capex    NA    €/m3  
#> 2 Q.1 - Activated Sludge   opex     NA    €/m3/y
#> 3 Q.2 - Maturation Pond    capex     3.5  €/m3  
#> 4 Q.2 - Maturation Pond    opex      0.07 €/m3/y
#> 5 Q.3 - UV Reactor         capex     1.8  €/m3  
#> 6 Q.3 - UV Reactor         opex      0.21 €/m3/y
#> 7 Q.4 - Sand Filter and UV capex     2.8  €/m3  
#> 8 Q.4 - Sand Filter and UV opex      0.28 €/m3/y

Run it

Use a richer example than the two-row starter – the learning case has six rows:

scenario <- create_scenario(
  system.file("input_1culture_2pop.xlsx", package = "ambre")
)
plots <- run_economic_analysis(
  scenario,
  membership_fee = 200,   # €/ha/year
  price_per_m3   = 0.1,   # €/m3
  grant          = 0.5,    # half the capital cost is subsidised,
  initialSituation = FALSE # calcul the cost of Supplementary process
)

It returns two ggplots and the allocation key table. Annual cost compares the recurring yearly bill of the situation considered (initial situation or new scenario):

plots$annual

Capex compares their up-front investment:

plots$total_investement

This graph is display only if initialSituation = FALSE, as the initial situation corresponds to the current situation and therefore does not require any investment.

plots$allocation_key
#>   grant  CropName allocation
#> 1   0.5    Tomato     0.1111
#> 2   0.5 Corn seed     0.3889

This allocation key is calculated by default in function collective_treatment_cost, but it can be customised by the user using parameter allocation_key, which is set to NULL by default. This parameter accepts a vector of percentage values of the same size as the number of simulated crops.


crop <- scenario$CropName
allocation_custom <- data.frame(CropName = crop,
                                allocation = c(0.5, 0.5))
run_economic_analysis(
  scenario,
  membership_fee = 200,   
  price_per_m3   = 0.1,   
  grant          = 0,   
  initialSituation = FALSE, 
  allocation_key = allocation_custom # No subvention, collective treatment price 50% for each crop
)
#> $annual

#> 
#> $total_investement

#> 
#> $allocation_key
#>   grant  CropName allocation
#> 1     0    Tomato        0.5
#> 2     0 Corn seed        0.5

Getting the underlying numbers

The run_ function returns only plots. To get the figures behind them, call the costing functions yourself. They expect the scenario to carry its irrigation need first, so run irrigation_need_calculation() before them:

scenario_need <- irrigation_need_calculation(scenario)

water_price <- water_price(scenario = scenario_need,
                          price_per_m3 = 0.01,
                          membership_fee = 200)
supplementary_cost <- process_cost_calculation(scenario = scenario_need,
                                              membership_fee = 200,
                                              charge = 0.1,
                                              initialSituation = FALSE)

Each returns the scenario augmented with cost columns; the added columns are the ones to inspect:

setdiff(names(water_price), names(supplementary_cost))
#> [1] "water_charge"          "annual_membership_fee"

Caveats worth flagging

Adapting the cost base

The prices are not hard-coded in the functions – they live in a CSV. To cost a scheme for your own territory, edit data-raw/ambre_barriere_cout.csv (keeping the unit convention), then rebuild the bundled dataset by sourcing data-raw/config_ambre.R. The next run_economic_analysis() will use your numbers. The database and this rebuild step are described in vignette("h-config-ambre", package = "ambre").