cdmAmsIIIa-methodology.RmdAMS-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.
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 TRUEThe 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 |
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.733Aggregate 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>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>
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. |
| calculate_project_residual_fertilizer_emissions_iiia | (data, fertilizer_use_col, production_emission_factor_col, field_emission_factor_col, group_cols) | Project residual fertilizer
emissions. |
| calculate_project_inoculant_emissions_iiia | (data, inoculant_rate_col, area_planted_col, inoculant_emission_factor_col, group_cols) | Project inoculant
emissions. |
| calculate_leakage_emissions_iiia | (data, leakage_col, group_cols) | Aggregate leakage
emissions. |
| calculate_emission_reductions_iiia | (baseline_emissions, project_emissions, leakage_emissions, group_cols) | Net emission
reductions. |
| aggregate_monitoring_periods_iiia | (data, group_cols, monitoring_col) | Summarise monitoring data across
periods. |
| estimate_emission_reductions_ams_iiia | (baseline_data, project_data, leakage_data, group_cols, …) | Run the AMS-III.A
workflow. |
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. |