Introduction

AMS-III.A quantifies emission reductions from replacing synthetic nitrogen fertilizer with biological inoculants on leguminous crops. The cdmAmsIIIa package implements the methodology using tidyverse-friendly helpers for applicability diagnostics, equation-level calculations, monitoring aggregation, and the end-to-end workflow.

Applicability Checks

Projects must demonstrate that legumes are a significant portion of the cropping system, inoculants meet regulatory requirements, and monitoring spans at least three periods per management unit.

monitoring <- simulate_ams_iiia_dataset(n_farms = 3, n_periods = 3, seed = 2024)

check_applicability_legume_share_iiia(
  monitoring,
  legume_area_col = "legume_area_ha",
  total_area_col = "total_area_ha",
  group_cols = "farm_id"
)
#> # A tibble: 3 × 3
#>   farm_id legume_share legume_share_applicable
#>   <chr>          <dbl> <lgl>                  
#> 1 farm_01        0.599 TRUE                   
#> 2 farm_02        0.524 TRUE                   
#> 3 farm_03        0.517 TRUE

check_applicability_inoculant_registration_iiia(
  monitoring,
  registration_col = "inoculant_registered",
  group_cols = "farm_id"
)
#> # A tibble: 3 × 2
#>   farm_id inoculant_registration_applicable
#>   <chr>   <lgl>                            
#> 1 farm_01 FALSE                            
#> 2 farm_02 TRUE                             
#> 3 farm_03 TRUE

check_applicability_monitoring_practices_iiia(
  monitoring,
  monitoring_unit_cols = "farm_id"
)
#> # A tibble: 3 × 3
#>   farm_id monitoring_periods_observed monitoring_practices_applicable
#>   <chr>                         <int> <lgl>                          
#> 1 farm_01                           3 TRUE                           
#> 2 farm_02                           3 TRUE                           
#> 3 farm_03                           3 TRUE

Simulated Dataset

The package provides a simulation utility to prototype workflows and tests.

monitoring |> 
  select(farm_id, monitoring_period, baseline_synthetic_n_kg, project_synthetic_n_kg, inoculant_rate_kg_per_ha, legume_area_ha, leakage_emissions_tco2e) |> 
  quiet_kable()
#> Warning: 'xfun::attr()' is deprecated.
#> Use 'xfun::attr2()' instead.
#> See help("Deprecated")
farm_id monitoring_period baseline_synthetic_n_kg project_synthetic_n_kg inoculant_rate_kg_per_ha legume_area_ha leakage_emissions_tco2e
farm_01 1 107.67545 26.26553 0.4660597 16.69985 0.2626553
farm_01 2 98.43687 21.30211 0.4903113 15.36214 0.2130211
farm_01 3 88.05652 28.48152 0.4760719 25.76192 0.2848152
farm_02 1 86.16819 29.43587 0.4247339 23.04182 0.2943587
farm_02 2 110.84577 34.87774 0.4118756 25.44086 0.3487774
farm_02 3 113.26239 15.43604 0.4436634 21.29716 0.1543604
farm_03 1 99.62365 29.14933 0.4747073 23.31043 0.2914933
farm_03 2 87.71338 22.23561 0.3689796 16.90595 0.2223561
farm_03 3 67.95224 21.92892 0.4153101 21.60994 0.2192892

Equation Walkthrough

We first compute baseline fertilizer emissions, then project-period residual fertilizer and inoculant emissions, and finally leakage.

baseline <- calculate_baseline_fertilizer_emissions_iiia(
  monitoring,
  fertilizer_use_col = "baseline_synthetic_n_kg",
  production_emission_factor_col = "baseline_production_ef_tco2_per_kg",
  field_emission_factor_col = "baseline_field_ef_tco2_per_kg",
  group_cols = "farm_id"
)

project_fertilizer <- calculate_project_residual_fertilizer_emissions_iiia(
  monitoring,
  fertilizer_use_col = "project_synthetic_n_kg",
  production_emission_factor_col = "project_production_ef_tco2_per_kg",
  field_emission_factor_col = "project_field_ef_tco2_per_kg",
  group_cols = "farm_id"
)

project_inoculant <- calculate_project_inoculant_emissions_iiia(
  monitoring,
  inoculant_rate_col = "inoculant_rate_kg_per_ha",
  area_planted_col = "legume_area_ha",
  inoculant_emission_factor_col = "inoculant_ef_tco2_per_kg",
  group_cols = "farm_id"
)

leakage <- calculate_leakage_emissions_iiia(
  monitoring,
  group_cols = "farm_id",
  leakage_col = "leakage_emissions_tco2e"
)

baseline
#> # A tibble: 3 × 2
#>   farm_id baseline_emissions_tco2e
#>   <chr>                      <dbl>
#> 1 farm_01                     4.12
#> 2 farm_02                     4.34
#> 3 farm_03                     3.57
project_fertilizer
#> # A tibble: 3 × 2
#>   farm_id project_fertilizer_emissions_tco2e
#>   <chr>                                <dbl>
#> 1 farm_01                               1.06
#> 2 farm_02                               1.12
#> 3 farm_03                               1.03
project_inoculant
#> # A tibble: 3 × 2
#>   farm_id project_inoculant_emissions_tco2e
#>   <chr>                               <dbl>
#> 1 farm_01                            0.0552
#> 2 farm_02                            0.0594
#> 3 farm_03                            0.0526
leakage
#> # A tibble: 3 × 2
#>   farm_id leakage_emissions_tco2e
#>   <chr>                     <dbl>
#> 1 farm_01                   0.760
#> 2 farm_02                   0.797
#> 3 farm_03                   0.733

Monitoring Period Aggregation

Aggregate the simulated data to farm-level totals before computing emission reductions.

period_results <- monitoring |>
  mutate(
    baseline_emissions_tco2e = baseline_synthetic_n_kg * (baseline_production_ef_tco2_per_kg + baseline_field_ef_tco2_per_kg),
    project_fertilizer_emissions_tco2e = project_synthetic_n_kg * (project_production_ef_tco2_per_kg + project_field_ef_tco2_per_kg),
    project_inoculant_emissions_tco2e = inoculant_rate_kg_per_ha * legume_area_ha * inoculant_ef_tco2_per_kg
  )

aggregate_monitoring_periods_iiia(
  period_results,
  group_cols = "farm_id",
  monitoring_col = "monitoring_period"
)
#> # A tibble: 3 × 5
#>   farm_id monitoring_periods baseline_emissions_tco2e project_fertilizer_emiss…¹
#>   <chr>                <int>                    <dbl>                      <dbl>
#> 1 farm_01                  3                     4.12                       1.06
#> 2 farm_02                  3                     4.34                       1.12
#> 3 farm_03                  3                     3.57                       1.03
#> # ℹ abbreviated name: ¹​project_fertilizer_emissions_tco2e
#> # ℹ 1 more variable: project_inoculant_emissions_tco2e <dbl>

Meta-Function

The meta helper orchestrates the workflow and outputs tidy emission reductions.

estimate_emission_reductions_ams_iiia(
  baseline_data = monitoring,
  project_data = monitoring,
  leakage_data = monitoring,
  group_cols = "farm_id",
  leakage_col = "leakage_emissions_tco2e"
)
#> # A tibble: 3 × 7
#>   farm_id baseline_emissions_tco2e project_fertilizer_e…¹ project_inoculant_em…²
#>   <chr>                      <dbl>                  <dbl>                  <dbl>
#> 1 farm_01                     4.12                   1.06                 0.0552
#> 2 farm_02                     4.34                   1.12                 0.0594
#> 3 farm_03                     3.57                   1.03                 0.0526
#> # ℹ abbreviated names: ¹​project_fertilizer_emissions_tco2e,
#> #   ²​project_inoculant_emissions_tco2e
#> # ℹ 3 more variables: leakage_emissions_tco2e <dbl>,
#> #   project_emissions_tco2e <dbl>, emission_reductions_tco2e <dbl>

Function Reference

reference <- tibble::tribble(
  ~Function, ~Signature, ~Purpose,
  "check_applicability_legume_share_iiia", "(data, legume_area_col, total_area_col, min_legume_share, group_cols)", "Verify legumes dominate the cropping pattern.",
  "check_applicability_inoculant_registration_iiia", "(data, registration_col, group_cols)", "Ensure inoculants meet regulatory standards.",
  "check_applicability_monitoring_practices_iiia", "(data, monitoring_unit_cols, min_periods)", "Confirm monitoring spans the minimum periods.",
  "calculate_baseline_fertilizer_emissions_iiia", "(data, fertilizer_use_col, production_emission_factor_col, field_emission_factor_col, group_cols)", "Baseline emissions from synthetic nitrogen use.<br>\\(BE_y = \\sum_i N_{i,y} \\times (EF^{prod}_{i,y} + EF^{field}_{i,y})\\)",
  "calculate_project_residual_fertilizer_emissions_iiia", "(data, fertilizer_use_col, production_emission_factor_col, field_emission_factor_col, group_cols)", "Project residual fertilizer emissions.<br>\\(PE^{fert}_y = \\sum_i N^{proj}_{i,y} \\times (EF^{prod}_{i,y} + EF^{field}_{i,y})\\)",
  "calculate_project_inoculant_emissions_iiia", "(data, inoculant_rate_col, area_planted_col, inoculant_emission_factor_col, group_cols)", "Project inoculant emissions.<br>\\(PE^{inoc}_y = \\sum_i R_{i,y} \\times A_{i,y} \\times EF^{inoc}_{i,y}\\)",
  "calculate_leakage_emissions_iiia", "(data, leakage_col, group_cols)", "Aggregate leakage emissions.<br>\\(LE_y = \\sum_i LE_{i,y}\\)",
  "calculate_emission_reductions_iiia", "(baseline_emissions, project_emissions, leakage_emissions, group_cols)", "Net emission reductions.<br>\\(ER_y = BE_y - (PE^{fert}_y + PE^{inoc}_y + LE_y)\\)",
  "aggregate_monitoring_periods_iiia", "(data, group_cols, monitoring_col)", "Summarise monitoring data across periods.<br>\\(ER_{p,y} = BE_{p,y} - (PE_{p,y} + LE_{p,y})\\)",
  "estimate_emission_reductions_ams_iiia", "(baseline_data, project_data, leakage_data, group_cols, ...)", "Run the AMS-III.A workflow.<br>\\(ER_y = BE_y - (PE_y + LE_y)\\)"
)

quiet_kable(reference, escape = FALSE)
#> Warning: 'xfun::attr()' is deprecated.
#> Use 'xfun::attr2()' instead.
#> See help("Deprecated")
Function Signature Purpose
check_applicability_legume_share_iiia (data, legume_area_col, total_area_col, min_legume_share, group_cols) Verify legumes dominate the cropping pattern.
check_applicability_inoculant_registration_iiia (data, registration_col, group_cols) Ensure inoculants meet regulatory standards.
check_applicability_monitoring_practices_iiia (data, monitoring_unit_cols, min_periods) Confirm monitoring spans the minimum periods.
calculate_baseline_fertilizer_emissions_iiia (data, fertilizer_use_col, production_emission_factor_col, field_emission_factor_col, group_cols) Baseline emissions from synthetic nitrogen use.
BEy=iNi,y×(EFi,yprod+EFi,yfield)BE_y = \sum_i N_{i,y} \times (EF^{prod}_{i,y} + EF^{field}_{i,y})
calculate_project_residual_fertilizer_emissions_iiia (data, fertilizer_use_col, production_emission_factor_col, field_emission_factor_col, group_cols) Project residual fertilizer emissions.
PEyfert=iNi,yproj×(EFi,yprod+EFi,yfield)PE^{fert}_y = \sum_i N^{proj}_{i,y} \times (EF^{prod}_{i,y} + EF^{field}_{i,y})
calculate_project_inoculant_emissions_iiia (data, inoculant_rate_col, area_planted_col, inoculant_emission_factor_col, group_cols) Project inoculant emissions.
PEyinoc=iRi,y×Ai,y×EFi,yinocPE^{inoc}_y = \sum_i R_{i,y} \times A_{i,y} \times EF^{inoc}_{i,y}
calculate_leakage_emissions_iiia (data, leakage_col, group_cols) Aggregate leakage emissions.
LEy=iLEi,yLE_y = \sum_i LE_{i,y}
calculate_emission_reductions_iiia (baseline_emissions, project_emissions, leakage_emissions, group_cols) Net emission reductions.
ERy=BEy(PEyfert+PEyinoc+LEy)ER_y = BE_y - (PE^{fert}_y + PE^{inoc}_y + LE_y)
aggregate_monitoring_periods_iiia (data, group_cols, monitoring_col) Summarise monitoring data across periods.
ERp,y=BEp,y(PEp,y+LEp,y)ER_{p,y} = BE_{p,y} - (PE_{p,y} + LE_{p,y})
estimate_emission_reductions_ams_iiia (baseline_data, project_data, leakage_data, group_cols, …) Run the AMS-III.A workflow.
ERy=BEy(PEy+LEy)ER_y = BE_y - (PE_y + LE_y)

Workflow Overview

workflow <- tibble::tribble(
  ~Step, ~Description,
  "1", "Assess applicability using legume share, inoculant registration, and monitoring checks.",
  "2", "Compile baseline fertilizer and project monitoring data for inoculated legumes.",
  "3", "Calculate baseline fertilizer emissions and project residual fertilizer emissions.",
  "4", "Quantify inoculant lifecycle emissions and leakage adjustments.",
  "5", "Aggregate monitoring periods to reporting units and compute net emission reductions with the meta helper."
)

quiet_kable(workflow)
#> Warning: 'xfun::attr()' is deprecated.
#> Use 'xfun::attr2()' instead.
#> See help("Deprecated")
Step Description
1 Assess applicability using legume share, inoculant registration, and monitoring checks.
2 Compile baseline fertilizer and project monitoring data for inoculated legumes.
3 Calculate baseline fertilizer emissions and project residual fertilizer emissions.
4 Quantify inoculant lifecycle emissions and leakage adjustments.
5 Aggregate monitoring periods to reporting units and compute net emission reductions with the meta helper.