Overview

Monte Carlo simulation combines the uncertainties in activity data (Chapter 3), emission factors (Chapter 2) and allometric equations (Chapter 1) into a single conservativeness deduction, the share of emission reductions withheld from credit issuance under ART-TREES. This chapter sets out a simulation design that meets the standard, presents worked examples in which uncertainty fell by 20 to 50 per cent through targeted improvement, and gives the reasoning for choosing where to invest under the Section 8 requirements.

ART-TREES Section 8 requires Monte Carlo Approach 2 with at least 10,000 iterations, 90 per cent confidence intervals, and bootstrap sampling where the probability distribution of an input is unknown (ART, 2021). The simulation calculates the uncertainty adjustment factor (UAF) from the half-width of the confidence interval around simulated emissions.

\[ UA_t = 0.524417 \times \frac{HW_{90\%}}{1.645006} \]

Here \(HW_{90\%}\) is the half-width of the 90 per cent confidence interval around mean emissions, and the resulting UAF sets the conservativeness deduction applied to creditable emissions.

Environment Setup

View Code
easypackages::packages(
  "ropensci/allodb", "animation", "BIOMASS", "cols4all", "covr", "cowplot", "caret",
  "DescTools", "dataMaid", "dplyr", "FawR", "ForestToolsRS", "forestdata", 
  "flextable", "ggplot2", "giscoR", "ggfortify", "htmltools", "janitor", "jsonlite", 
  "lattice", "leaflet.providers", "leaflet", "lmtest", "lwgeom", 
  "kableExtra", "kernlab", "knitr", "mapedit", "mapview", "maptiles", "Mlmetrics", 
  "ModelMetrics", "moments", "olsrr", "openxlsx", "plotly", "psych", "randomForest", 
  "raster","RColorBrewer", "rmarkdown", "renv", "reticulate", "s2", "sf", "scales", 
  "sits","spdep", "stars", "stringr", "terra", "tmap", "tmaptools", "tidymodels", 
  "tidyverse", "tidyr", "tune", "useful",
  prompt = F
  )

4.1 Simulation Design

Temporal Dimensions

ART-TREES permits simulation over a single year or aggregation over several years, and single-year simulation tends to give lower uncertainty because errors do not accumulate across years. The advantages and disadvantages of each design are set out in section 4.3, and the single-year function below is the recommended form.

View Code
# Single-year simulation (RECOMMENDED)
simulate_single_year <- function(n_sim = 10000, year_data) {
  
    # Sample activity data uncertainty
  deforestation_ha <- rnorm(n_sim, 
    mean = year_data$deforestation_ha,
    sd = year_data$deforestation_ha * year_data$ad_uncertainty_pct / 100)
  
  # Sample emission factor uncertainty  
  ef_tco2_ha <- rnorm(n_sim,
    mean = year_data$ef_tco2_ha,
    sd = year_data$ef_tco2_ha * year_data$ef_uncertainty_pct / 100)
  
  # Calculate emissions distribution
  emissions_tco2 <- deforestation_ha * ef_tco2_ha
  
  # Compute 90% CI
  ci_90 <- quantile(emissions_tco2, probs = c(0.05, 0.95))
  hw_90 <- (ci_90[2] - ci_90[1]) / 2
  uaf <- 0.524417 * (hw_90 / mean(emissions_tco2)) / 1.645006
  
  return(list(
    mean_emissions = mean(emissions_tco2),
    hw_90_pct = (hw_90 / mean(emissions_tco2)) * 100,
    uaf = uaf,
    simulated_emissions = emissions_tco2
  ))
}

# Example year data
year_2024 <- list(
  deforestation_ha = 5000,
  ad_uncertainty_pct = 12,      # Input from Chapter 3 accuracy assessment
  ef_tco2_ha = 200,
  ef_uncertainty_pct = 18       # Input from Chapter 2 default values
)

results <- simulate_single_year(year_data = year_2024)
cat(sprintf("Mean Emissions: %.0f tCO2\n", results$mean_emissions))
## Mean Emissions: 999597 tCO2
cat(sprintf("90%% CI Half-Width: %.1f%%\n", results$hw_90_pct))
## 90% CI Half-Width: 35.4%
cat(sprintf("Uncertainty Adjustment Factor: %.3f\n", results$uaf))
## Uncertainty Adjustment Factor: 0.113

Baseline Treatment

The baseline is the arithmetic mean of verified historical emissions, treated as a fixed value rather than a simulated one, so that it adds no variance of its own. Country X, for example, set its high forest low deforestation crediting level (HFLDCL) at 21,037,534 tCO₂ rather than simulating the variation between historical years (ART, 2021, Section 8.4).

4.2 Ranking Uncertainty Sources

Sensitivity Analysis

The sensitivity analysis below halves the activity data uncertainty, the emission factor uncertainty, and both together, and reports the UAF under each scenario so that the dominant source can be identified.

View Code
# Sensitivity analysis across uncertainty sources
sensitivity_analysis <- function(base_scenario, n_sim = 10000) {
  
  scenarios <- list(
    baseline = base_scenario,
    low_ad = modifyList(base_scenario, list(ad_uncertainty_pct = base_scenario$ad_uncertainty_pct * 0.5)),
    low_ef = modifyList(base_scenario, list(ef_uncertainty_pct = base_scenario$ef_uncertainty_pct * 0.5)),
    low_both = modifyList(base_scenario, list(
      ad_uncertainty_pct = base_scenario$ad_uncertainty_pct * 0.5,
      ef_uncertainty_pct = base_scenario$ef_uncertainty_pct * 0.5))
  )
  
  results <- lapply(scenarios, function(s) {
    sim <- simulate_single_year(n_sim, s)
    data.frame(
      scenario = deparse(substitute(s)),
      uaf = sim$uaf,
      hw_90_pct = sim$hw_90_pct
    )
  })
  
  do.call(rbind, results)
}

# Run sensitivity
sensitivity_results <- sensitivity_analysis(year_2024)
print(sensitivity_results)
##          scenario        uaf hw_90_pct
## baseline   X[[i]] 0.11329635  35.53912
## low_ad     X[[i]] 0.09896063  31.04225
## low_ef     X[[i]] 0.07895226  24.76597
## low_both   X[[i]] 0.05693012  17.85800

Where emission factor uncertainty dominates, as it usually does under Tier 1 defaults, investment in plot-based Tier 2 emission factors lowers the UAF by more than a small gain in classification accuracy would.

4.3 Reducing Uncertainty

Bootstrap Sampling

Where the probability distribution of an input is unknown, ART-TREES requires bootstrap resampling, which draws repeated samples from the observed errors instead of from an assumed distribution. The function below draws the true forest area from a binomial distribution set by the user’s accuracy of the map.

View Code
# Bootstrap activity data from confusion matrix
bootstrap_activity_data <- function(n_sim, confusion_matrix, mapped_area_ha) {
  
  # Extract user's accuracy (precision) for focal class
  users_accuracy <- confusion_matrix["Forest", "Forest"] / 
    sum(confusion_matrix["Forest", ])
  
  # Bootstrap from binomial distribution
  true_area_ha <- rbinom(n_sim, 
    size = mapped_area_ha, 
    prob = users_accuracy)
  
  return(true_area_ha)
}

Temporal Aggregation

Design Comparison

ART-TREES permits two temporal scopes for the simulation, a single monitoring year or the whole crediting period aggregated, and recent validation work in a jurisdictional program found that the single-year design gives substantially lower uncertainty than multi-year aggregation.

Multi-Year Aggregation

View Code
# Multi-year approach: Propagates uncertainty forward through years
multi_year_simulation <- function(n_sim = 10000, years_data) {
  cumulative_emissions <- numeric(n_sim)
  
  for (i in 1:n_sim) {
    # Sample each year, accumulating uncertainties
    year_emissions <- sapply(years_data, function(year) {
      defor <- rnorm(1, year$deforestation_ha, year$deforestation_ha * year$ad_unc / 100)
      ef <- rnorm(1, year$ef_tco2_ha, year$ef_tco2_ha * year$ef_unc / 100)
      defor * ef
    })
    cumulative_emissions[i] <- sum(year_emissions)
  }
  
  # UAF from cumulative distribution
  ci_90 <- quantile(cumulative_emissions, probs = c(0.05, 0.95))
  hw_90 <- (ci_90[2] - ci_90[1]) / 2
  uaf <- 0.524417 * (hw_90 / mean(cumulative_emissions)) / 1.645006
  
  return(list(uaf = uaf, mean_emissions = mean(cumulative_emissions)))
}

This design has a serious limitation, in that errors accumulate across years and widen the confidence interval, so that the half-width can exceed mean emissions in the early years of the trend and give a UA above 100 per cent.

Single-Year Design

The single-year design limits the simulation to one monitoring period, so that only that year’s errors enter the interval.

View Code
# Single-year approach: Isolates uncertainty to reporting period  
single_year_simulation <- function(n_sim = 10000, year_data) {
  
  # Sample activity data
  deforestation_ha <- rnorm(n_sim, 
    mean = year_data$deforestation_ha,
    sd = year_data$deforestation_ha * year_data$ad_uncertainty_pct / 100)
  
  # Sample emission factor
  ef_tco2_ha <- rnorm(n_sim,
    mean = year_data$ef_tco2_ha,
    sd = year_data$ef_tco2_ha * year_data$ef_uncertainty_pct / 100)
  
  # Emissions distribution
  emissions_tco2 <- deforestation_ha * ef_tco2_ha
  
  # Compute 90% CI
  ci_90 <- quantile(emissions_tco2, probs = c(0.05, 0.95))
  hw_90 <- (ci_90[2] - ci_90[1]) / 2
  uaf <- 0.524417 * (hw_90 / mean(emissions_tco2)) / 1.645006
  
  return(list(
    mean_emissions = mean(emissions_tco2),
    hw_90_pct = (hw_90 / mean(emissions_tco2)) * 100,
    uaf = uaf
  ))
}

# Example: 2024 monitoring period
year_2024 <- list(
  deforestation_ha = 5000,
  ad_uncertainty_pct = 12,      # Chapter 3 accuracy assessment
  ef_tco2_ha = 200,
  ef_uncertainty_pct = 18       # Chapter 2 IPCC defaults
)

results <- single_year_simulation(year_data = year_2024)
cat(sprintf("Mean Emissions: %.0f tCO2\n", results$mean_emissions))
## Mean Emissions: 1002646 tCO2
cat(sprintf("90%% CI Half-Width: %.1f%%\n", results$hw_90_pct))
## 90% CI Half-Width: 35.0%
cat(sprintf("Uncertainty Adjustment Factor: %.1f%%\n", results$uaf * 100))
## Uncertainty Adjustment Factor: 11.2%

In jurisdictional program testing, switching from the multi-year to the single-year design cut the UAF by 21 percentage points, from 104 per cent to 83 per cent.

Reference Level Treatment

The HFLDCL baseline is treated as a fixed, verified value rather than a simulated one, and it stays in effect for the crediting period.

View Code
# CORRECT: Deterministic baseline (Guyana-validated approach)
hfldcl_fixed <- 21037534  # Arithmetic mean of verified 2016-2020 period (tCO2)

# Simulate only crediting period emissions
n_sim <- 10000
emissions_2024 <- rnorm(n_sim, mean = 1000000, sd = 1000000 * 0.15)

# Reductions with fixed baseline
reductions_tco2 <- pmax(0, hfldcl_fixed - emissions_2024)

# UAF calculation
ci_90 <- quantile(reductions_tco2, probs = c(0.05, 0.95))
hw_90 <- (ci_90[2] - ci_90[1]) / 2
uaf <- 0.524417 * (hw_90 / mean(reductions_tco2)) / 1.645006

cat(sprintf("\nDeterministic Baseline UAF: %.1f%%\n", uaf * 100))
## 
## Deterministic Baseline UAF: 0.4%

Either the historical mean or a reference level verified by the validation and verification body (VVB) may serve as the fixed value. Under ART’s definitions an audit statement is irreversible and an issuance is not fungible, so a verified reference level removes a compliance concern and avoids inflating the UAF through repeated revision.

Credit Recovery Provision

Every 5 years the deduction is recalculated so that credits withheld in excess can be recovered.

\[ \text{Recovered Credits}_t = \sum_{i=1}^{5} (UA_{i,annual} - UA_{cumulative}) \times \text{Emissions}_i \]

The provision rewards continued improvement in method, because each reduction in annual uncertainty returns credits already deducted.

4.4 Worked Example

Multi-Source Integration

The worked example below is a jurisdictional program simulation that combines the uncertainties from all three earlier chapters into one crediting period.

View Code
# Complete jurisdictional simulation
jurisdictional_simulation <- function(n_sim = 10000) {
  
  # Activity Data (Chapter 3: ±12% from accuracy assessment)
  deforestation_2024_ha <- rnorm(n_sim, mean = 5000, sd = 5000 * 0.12)
  
  # Emission Factors (Chapter 2: Tier 1 ±18%)
  # Aboveground biomass removal
  agb_loss_tco2_ha <- rnorm(n_sim, mean = 180, sd = 180 * 0.18)
  
  # Belowground biomass (Chapter 2: root-shoot ratio ±15%)
  bgb_loss_tco2_ha <- rnorm(n_sim, mean = 40, sd = 40 * 0.15)
  
  # Total emission factor
  total_ef_tco2_ha <- agb_loss_tco2_ha + bgb_loss_tco2_ha
  
  # Calculate emissions distribution
  emissions_tco2 <- deforestation_2024_ha * total_ef_tco2_ha
  
  # Reference level (deterministic)
  hfldcl_tco2 <- 21037534  # Mean of 2016-2020
  
  # Emission reductions
  reductions_tco2 <- pmax(0, hfldcl_tco2 - emissions_tco2)
  
  # Uncertainty metrics
  ci_90 <- quantile(reductions_tco2, probs = c(0.05, 0.95))
  hw_90 <- (ci_90[2] - ci_90[1]) / 2
  uaf <- 0.524417 * (hw_90 / mean(reductions_tco2)) / 1.645006
  
  # Creditable emissions after conservativeness deduction
  creditable <- mean(reductions_tco2) * (1 - uaf)
  
  return(list(
    mean_reductions = mean(reductions_tco2),
    uaf = uaf,
    hw_90_pct = (hw_90 / mean(reductions_tco2)) * 100,
    creditable_tco2 = creditable,
    deduction_pct = uaf * 100
  ))
}

# Execute simulation
program_results <- jurisdictional_simulation()

cat(sprintf("Mean Emission Reductions: %.0f tCO2\n", program_results$mean_reductions))
## Mean Emission Reductions: 19937713 tCO2
cat(sprintf("90%% CI Half-Width: %.1f%%\n", program_results$hw_90_pct))
## 90% CI Half-Width: 1.7%
cat(sprintf("Uncertainty Deduction: %.1f%%\n", program_results$deduction_pct))
## Uncertainty Deduction: 0.6%
cat(sprintf("Creditable Emissions: %.0f tCO2\n", program_results$creditable_tco2))
## Creditable Emissions: 19827599 tCO2

4.5 Compliance Checklist

  • At least 10,000 iterations per crediting year
  • 90 per cent confidence intervals from the 5th and 95th percentiles
  • Bootstrap sampling for unknown distributions
  • Conservative bias, with systematic underestimation permitted
  • Whole-chain integration of activity data and emission factors
  • Documentation of simulation code and random seed

4.6 Chapter Summary

Monte Carlo simulation combines the component uncertainties into the conservativeness deduction that sets credit issuance, and effort is best spent on the dominant source, which is the emission factor in a Tier 1 program and the activity data in a system built on high-resolution imagery. Single-year simulation, a fixed reference level and steady improvement of each input lower the deduction, raise revenue and meet the ART-TREES Section 8 requirements.