Introduction

This vignette demonstrates how to reproduce the AMS-I.F calculations using cdmAmsIf. The methodology covers renewable electricity generation serving captive mini-grids or isolated distribution systems that displace fossil-fuel-based generation. The core steps include summing baseline electricity delivered, applying baseline emission factors, and accounting for any residual project emissions.

Applicability Checks

library(cdmAmsIf)
check_applicability_captive_capacity(capacity_kw = 12000)
## [1] TRUE
## [1] TRUE
check_applicability_captive_use_share(captive_use_share = 0.72)
## [1] TRUE

Simulated Dataset

set.seed(123)
example_data <- simulate_ams_if_dataset(n_grids = 4, n_periods = 6, start_year = 2024, start_month = 7)
quiet_kable(
  head(example_data),
  format = "html",
  digits = 3
)
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
grid_id monitoring_period year month day monitoring_date monitoring_label electricity_mwh baseline_emission_factor project_emission_factor baseline_electricity_mwh project_electricity_mwh baseline_emissions_tco2e project_emissions_tco2e emission_reductions_tco2e captive_use_share
grid_1 1 2024 7 15 2024-07-15 2024-07 3243.125 0.7 0.02 3243.125 92.661 2270.188 64.863 2205.325 0.638
grid_1 2 2024 8 19 2024-08-19 2024-08 1929.478 0.7 0.02 1929.478 55.128 1350.635 38.590 1312.045 0.723
grid_1 3 2024 9 14 2024-09-14 2024-09 4321.462 0.7 0.02 4321.462 123.470 3025.024 86.429 2938.594 0.602
grid_1 4 2024 10 3 2024-10-03 2024-10 3842.563 0.7 0.02 3842.563 109.788 2689.794 76.851 2612.943 0.735
grid_1 5 2024 11 10 2024-11-10 2024-11 2943.166 0.7 0.02 2943.166 84.090 2060.216 58.863 2001.353 0.764
grid_1 6 2024 12 18 2024-12-18 2024-12 2199.443 0.7 0.02 2199.443 62.841 1539.610 43.989 1495.621 0.687

The simulation includes monitoring metadata (monitoring_period, year, month, day, and monitoring_label) so that calculations can be aggregated over reporting periods while preserving grid-level identifiers.

Equation Walkthrough

baseline_supply <- calculate_baseline_electricity_supply(example_data, group_cols = "grid_id")
baseline_emissions <- calculate_baseline_emissions(
  baseline_supply,
  baseline_emission_factor = example_data$baseline_emission_factor[1]
)
project_emissions <- calculate_project_emissions(
  baseline_supply,
  project_emission_factor = example_data$project_emission_factor[1]
)
emission_reductions <- calculate_emission_reductions(baseline_emissions, project_emissions)
quiet_kable(head(emission_reductions), format = "html", digits = 3)
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
grid_id baseline_electricity_mwh baseline_emissions_tco2e project_emissions_tco2e emission_reductions_tco2e
grid_1 18479.24 12935.47 369.585 12565.88
grid_2 16586.65 11610.66 331.733 11278.92
grid_3 14860.47 10402.33 297.209 10105.12
grid_4 15343.04 10740.13 306.861 10433.27

Monitoring Period Aggregation

period_summary <- aggregate_monitoring_periods(
  supply_data = example_data,
  monitoring_cols = c("monitoring_label"),
  group_cols = "grid_id",
  electricity_col = "electricity_mwh",
  baseline_factor_col = "baseline_emission_factor"
)

quiet_kable(head(period_summary), format = "html", digits = 3)
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
grid_id monitoring_label baseline_emissions_tco2e project_emissions_tco2e emission_reductions_tco2e baseline_electricity_mwh baseline_emission_factor
grid_1 2024-07 2270.188 64.863 2205.325 3243.125 0.7
grid_1 2024-08 1350.635 38.590 1312.045 1929.478 0.7
grid_1 2024-09 3025.024 86.429 2938.594 4321.462 0.7
grid_1 2024-10 2689.794 76.851 2612.943 3842.563 0.7
grid_1 2024-11 2060.216 58.863 2001.353 2943.166 0.7
grid_1 2024-12 1539.610 43.989 1495.621 2199.443 0.7

Meta-Function

estimate_emission_reductions_ams_if(
  supply_data = example_data,
  baseline_emission_factor = example_data$baseline_emission_factor[1],
  project_emission_factor = example_data$project_emission_factor[1],
  group_cols = "grid_id"
)
## # A tibble: 4 × 5
##   grid_id baseline_electricity_mwh baseline_emissions_t…¹ project_emissions_tc…²
##   <chr>                      <dbl>                  <dbl>                  <dbl>
## 1 grid_1                    18479.                 12935.                   370.
## 2 grid_2                    16587.                 11611.                   332.
## 3 grid_3                    14860.                 10402.                   297.
## 4 grid_4                    15343.                 10740.                   307.
## # ℹ abbreviated names: ¹​baseline_emissions_tco2e, ²​project_emissions_tco2e
## # ℹ 1 more variable: emission_reductions_tco2e <dbl>

Function Reference

function_reference <- tibble::tibble(
  Function = c(
    "`calculate_baseline_electricity_supply()`",
    "`calculate_baseline_emissions()`",
    "`calculate_project_emissions()`",
    "`calculate_emission_reductions()`",
    "`aggregate_monitoring_periods()`",
    "`estimate_emission_reductions_ams_if()`",
    "`simulate_ams_if_dataset()`"
  ),
  Signature = c(
    "`calculate_baseline_electricity_supply(supply_data, electricity_col = \"electricity_mwh\", group_cols = NULL)`",
    "`calculate_baseline_emissions(baseline_supply, baseline_emission_factor, output_col = \"baseline_emissions_tco2e\")`",
    "`calculate_project_emissions(baseline_supply, project_emission_factor = 0, output_col = \"project_emissions_tco2e\")`",
    "`calculate_emission_reductions(baseline_emissions, project_emissions, baseline_col = \"baseline_emissions_tco2e\", project_col = \"project_emissions_tco2e\", output_col = \"emission_reductions_tco2e\")`",
    "`aggregate_monitoring_periods(supply_data, monitoring_cols = c(\"year\", \"month\"), group_cols = \"grid_id\")`",
    "`estimate_emission_reductions_ams_if(supply_data, baseline_emission_factor, project_emission_factor = 0, group_cols = NULL)`",
    "`simulate_ams_if_dataset(n_grids = 10, n_periods = 12, start_year = 2023, start_month = 1, mean_supply_mwh = 18000, sd_supply_mwh = 2500, baseline_emission_factor = 0.7, project_emission_factor = 0.02)`"
  ),
  Purpose = c(
    "Summed baseline electricity supply for each group or monitoring period.<br>\\(E^{BL}_y = \\sum_i E_{i,y}\\)",
    "Baseline emissions derived from fossil electricity emission factors.<br>\\(BE_y = E^{BL}_y \\times EF^{BL}\\)",
    "Project emissions reflecting auxiliary fossil generation.<br>\\(PE_y = E^{BL}_y \\times EF^{PR}\\)",
    "Emission reductions obtained from the difference between baseline and project emissions.<br>\\(ER_y = BE_y - PE_y\\)",
    "Monitoring-period aggregation consistent with methodology equations.<br>\\(ER_{p,y} = BE_{p,y} - PE_{p,y}\\)",
    "Meta-calculation wrapper chaining the equation helpers.<br>\\(ER_y = BE_y - PE_y\\)",
    "Data generator for examples, testing, and onboarding."
  )
)

quiet_kable(function_reference, format = "html", escape = FALSE)
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Function Signature Purpose
calculate_baseline_electricity_supply() calculate_baseline_electricity_supply(supply_data, electricity_col = "electricity_mwh", group_cols = NULL) Summed baseline electricity supply for each group or monitoring period.
EyBL=iEi,yE^{BL}_y = \sum_i E_{i,y}
calculate_baseline_emissions() calculate_baseline_emissions(baseline_supply, baseline_emission_factor, output_col = "baseline_emissions_tco2e") Baseline emissions derived from fossil electricity emission factors.
BEy=EyBL×EFBLBE_y = E^{BL}_y \times EF^{BL}
calculate_project_emissions() calculate_project_emissions(baseline_supply, project_emission_factor = 0, output_col = "project_emissions_tco2e") Project emissions reflecting auxiliary fossil generation.
PEy=EyBL×EFPRPE_y = E^{BL}_y \times EF^{PR}
calculate_emission_reductions() calculate_emission_reductions(baseline_emissions, project_emissions, baseline_col = "baseline_emissions_tco2e", project_col = "project_emissions_tco2e", output_col = "emission_reductions_tco2e") Emission reductions obtained from the difference between baseline and project emissions.
ERy=BEyPEyER_y = BE_y - PE_y
aggregate_monitoring_periods() aggregate_monitoring_periods(supply_data, monitoring_cols = c("year", "month"), group_cols = "grid_id") Monitoring-period aggregation consistent with methodology equations.
ERp,y=BEp,yPEp,yER_{p,y} = BE_{p,y} - PE_{p,y}
estimate_emission_reductions_ams_if() estimate_emission_reductions_ams_if(supply_data, baseline_emission_factor, project_emission_factor = 0, group_cols = NULL) Meta-calculation wrapper chaining the equation helpers.
ERy=BEyPEyER_y = BE_y - PE_y
simulate_ams_if_dataset() simulate_ams_if_dataset(n_grids = 10, n_periods = 12, start_year = 2023, start_month = 1, mean_supply_mwh = 18000, sd_supply_mwh = 2500, baseline_emission_factor = 0.7, project_emission_factor = 0.02) Data generator for examples, testing, and onboarding.