Introduction

This vignette demonstrates how to reproduce the AMS-I.C calculations using cdmAmsIc. The methodology covers renewable thermal energy production (e.g. biomass boilers, solar thermal systems, geothermal heat) that displaces fossil-fuel-based heat generation. The core steps involve calculating baseline thermal output, estimating emissions using fossil heat factors, and incorporating any residual project emissions.

Applicability Checks

library(cdmAmsIc)
check_applicability_thermal_capacity(capacity_mwth = 12)
## [1] TRUE
check_applicability_renewable_supply(renewable_fraction = 0.85)
## [1] TRUE
check_applicability_fossil_displacement(fossil_heat_share = 0.75)
## [1] TRUE

Simulated Dataset

set.seed(123)
example_data <- simulate_ams_ic_dataset(n_facilities = 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")
facility_id monitoring_period year month day monitoring_date monitoring_label thermal_energy_mwh baseline_emission_factor project_emission_factor baseline_thermal_output_mwh project_thermal_output_mwh baseline_emissions_tco2e project_emissions_tco2e emission_reductions_tco2e
facility_1 1 2024 7 15 2024-07-15 2024-07 2175.050 0.27 0.01 2175.050 80.557 587.264 21.751 565.513
facility_1 2 2024 8 19 2024-08-19 2024-08 1229.224 0.27 0.01 1229.224 45.527 331.891 12.292 319.598
facility_1 3 2024 9 14 2024-09-14 2024-09 2951.453 0.27 0.01 2951.453 109.313 796.892 29.515 767.378
facility_1 4 2024 10 3 2024-10-03 2024-10 2606.645 0.27 0.01 2606.645 96.542 703.794 26.066 677.728
facility_1 5 2024 11 10 2024-11-10 2024-11 1959.079 0.27 0.01 1959.079 72.558 528.951 19.591 509.361
facility_1 6 2024 12 18 2024-12-18 2024-12 1423.599 0.27 0.01 1423.599 52.726 384.372 14.236 370.136

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

Equation Walkthrough

baseline_output <- calculate_baseline_thermal_output(example_data, group_cols = "facility_id")
baseline_emissions <- calculate_baseline_emissions(
  baseline_output,
  baseline_emission_factor = example_data$baseline_emission_factor[1]
)
project_emissions <- calculate_project_emissions(
  baseline_output,
  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")
facility_id baseline_thermal_output_mwh baseline_emissions_tco2e project_emissions_tco2e emission_reductions_tco2e
facility_1 12345.05 3333.164 123.451 3209.713
facility_2 10982.39 2965.245 109.824 2855.421
facility_3 9739.54 2629.676 97.395 2532.280
facility_4 10246.99 2766.688 102.470 2664.218

Monitoring Period Aggregation

period_summary <- aggregate_monitoring_periods(
  thermal_data = example_data,
  monitoring_cols = c("monitoring_label"),
  group_cols = "facility_id",
  energy_col = "thermal_energy_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")
facility_id monitoring_label baseline_emissions_tco2e project_emissions_tco2e emission_reductions_tco2e baseline_thermal_output_mwh baseline_emission_factor
facility_1 2024-07 587.264 21.751 565.513 2175.050 0.27
facility_1 2024-08 331.891 12.292 319.598 1229.224 0.27
facility_1 2024-09 796.892 29.515 767.378 2951.453 0.27
facility_1 2024-10 703.794 26.066 677.728 2606.645 0.27
facility_1 2024-11 528.951 19.591 509.361 1959.079 0.27
facility_1 2024-12 384.372 14.236 370.136 1423.599 0.27

Meta-Function

estimate_emission_reductions_ams_ic(
  thermal_data = example_data,
  baseline_emission_factor = example_data$baseline_emission_factor[1],
  project_emission_factor = example_data$project_emission_factor[1],
  group_cols = "facility_id"
)
## # A tibble: 4 × 5
##   facility_id baseline_thermal_output_mwh baseline_emissions_tco2e
##   <chr>                             <dbl>                    <dbl>
## 1 facility_1                       12345.                    3333.
## 2 facility_2                       10982.                    2965.
## 3 facility_3                        9740.                    2630.
## 4 facility_4                       10247.                    2767.
## # ℹ 2 more variables: project_emissions_tco2e <dbl>,
## #   emission_reductions_tco2e <dbl>

Function Reference

function_reference <- tibble::tibble(
  Function = c(
    "`calculate_baseline_thermal_output()`",
    "`calculate_baseline_emissions()`",
    "`calculate_project_emissions()`",
    "`calculate_emission_reductions()`",
    "`aggregate_monitoring_periods()`",
    "`estimate_emission_reductions_ams_ic()`",
    "`simulate_ams_ic_dataset()`"
  ),
  Signature = c(
    "`calculate_baseline_thermal_output(thermal_data, energy_col = \"thermal_energy_mwh\", group_cols = NULL)`",
    "`calculate_baseline_emissions(baseline_output, baseline_emission_factor, output_col = \"baseline_emissions_tco2e\")`",
    "`calculate_project_emissions(baseline_output, 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(thermal_data, monitoring_cols = c(\"year\", \"month\"), group_cols = \"facility_id\")`",
    "`estimate_emission_reductions_ams_ic(thermal_data, baseline_emission_factor, project_emission_factor = 0, group_cols = NULL)`",
    "`simulate_ams_ic_dataset(n_facilities = 10, n_periods = 12, start_year = 2023, start_month = 1, mean_thermal_mwh = 12000, sd_thermal_mwh = 1800, baseline_emission_factor = 0.27, project_emission_factor = 0.01)`"
  ),
  Purpose = c(
    "Summed baseline thermal output for each group or monitoring period.<br>\\(Q^{BL}_y = \\sum_i Q_{i,y}\\)",
    "Baseline emissions using the displaced fossil heat factor.<br>\\(BE_y = Q^{BL}_y \\times EF^{BL}\\)",
    "Project emissions representing auxiliary fossil energy use.<br>\\(PE_y = Q^{BL}_y \\times EF^{PR}\\)",
    "Emission reductions for each monitoring period.<br>\\(ER_y = BE_y - PE_y\\)",
    "Aggregates monitoring data to reporting periods.<br>\\(ER_{p,y} = BE_{p,y} - PE_{p,y}\\)",
    "Meta-calculation composing the core equations.<br>\\(ER_y = BE_y - PE_y\\)",
    "Simulation with monitoring metadata for testing and demos."
  )
)

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_thermal_output() calculate_baseline_thermal_output(thermal_data, energy_col = "thermal_energy_mwh", group_cols = NULL) Summed baseline thermal output for each group or monitoring period.
QyBL=iQi,yQ^{BL}_y = \sum_i Q_{i,y}
calculate_baseline_emissions() calculate_baseline_emissions(baseline_output, baseline_emission_factor, output_col = "baseline_emissions_tco2e") Baseline emissions using the displaced fossil heat factor.
BEy=QyBL×EFBLBE_y = Q^{BL}_y \times EF^{BL}
calculate_project_emissions() calculate_project_emissions(baseline_output, project_emission_factor = 0, output_col = "project_emissions_tco2e") Project emissions representing auxiliary fossil energy use.
PEy=QyBL×EFPRPE_y = Q^{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 for each monitoring period.
ERy=BEyPEyER_y = BE_y - PE_y
aggregate_monitoring_periods() aggregate_monitoring_periods(thermal_data, monitoring_cols = c("year", "month"), group_cols = "facility_id") Aggregates monitoring data to reporting periods.
ERp,y=BEp,yPEp,yER_{p,y} = BE_{p,y} - PE_{p,y}
estimate_emission_reductions_ams_ic() estimate_emission_reductions_ams_ic(thermal_data, baseline_emission_factor, project_emission_factor = 0, group_cols = NULL) Meta-calculation composing the core equations.
ERy=BEyPEyER_y = BE_y - PE_y
simulate_ams_ic_dataset() simulate_ams_ic_dataset(n_facilities = 10, n_periods = 12, start_year = 2023, start_month = 1, mean_thermal_mwh = 12000, sd_thermal_mwh = 1800, baseline_emission_factor = 0.27, project_emission_factor = 0.01) Simulation with monitoring metadata for testing and demos.