--- title: "Costing a reuse scenario" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Costing a reuse scenario} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", message = FALSE, warning = FALSE, fig.width = 7, fig.height = 4.5, out.width = "100%" ) ``` ```{r setup} 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: ```{r signature, eval = FALSE} run_economic_analysis(scenario, membership_fee, price_per_m3, grant, initialSituation = FALSE) ``` - **`membership_fee`** -- annual membership fee to ASA (Association Syndicale Autorisée). - **`price_per_m3`** -- a volumetric charge on the water actually used (`€/m3`), applied to the scenario's computed irrigation need. - **`grant`** -- the share of the investment covered by a subsidy, as a **fraction between 0 and 1**. A `grant` of 0.5 means public money pays half the capital cost, so users finance the remaining `(1 - grant)`. - **initialSituation** -- TRUE to calculate cost of the processes indicated in InitialProcessName column of the scenario of FALSE to calculate cost of the processes indicated in SupplementaryProcessName column. ## 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: - **capex vs opex** -- the one-off capital cost of installing a barrier versus its recurring operating cost. Capital costs are spread over a **20-year** amortization when turned into an annual figure. - **collective vs individual** -- treatment shared across the scheme versus barriers installed per crop. The shared cost is allocated in proportion to the user-financed area, `(1 - grant) x area`. The per-barrier unit prices come from `config_ambre$economic$cost`, each with a `unit` string (`€/m3`, `€/ha`, `€/ml` of perimeter, `€/p` per person...): ```{r cost-table} config_ambre$economic$cost[, c("TreatmentName", "CostType", "value", "unit")] |> head(8) ``` ## Run it Use a richer example than the two-row starter -- the learning case has six rows: ```{r scenario} scenario <- create_scenario( system.file("input_1culture_2pop.xlsx", package = "ambre") ) ``` ```{r run, results = "hide"} 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 `ggplot`s and the allocation key table. **Annual cost** compares the recurring yearly bill of the situation considered (initial situation or new scenario): ```{r annual} plots$annual ``` **Capex** compares their up-front investment: ```{r capex} 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. ```{r allocation-key} plots$allocation_key ``` 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. ```{r run-custom} 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 ) ``` ## 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: ```{r numbers, results = "hide"} 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: ```{r numbers-cols} setdiff(names(water_price), names(supplementary_cost)) ``` ## Caveats worth flagging - **The situations are modelled asymmetrically.** The initial and supplementary process cases do not carry exactly the same cost structure, so read the comparison as orders of magnitude rather than a precise like-for-like tender. ## 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")`.