Skip to content

Synthetic FCIP research inputs

Latest

Choose a tag to compare

@ftsiboe ftsiboe released this 06 Jul 11:10

Synthetic FCIP Research Inputs

⚠️ Disclaimer: These data are provided “as
is”
, without warranty of any kind. The authors make no
guarantees regarding accuracy or suitability for any purpose. Use of
these data and any results derived from them is entirely at the user’s
own risk. The contents of this release reflect independent research and
do not represent the official positions or policies of the USDA, the
Risk Management Agency (RMA), the Federal Crop Insurance Corporation
(FCIC), or any Approved Insurance Provider.

📘 Overview

This release provides analysis-ready synthetic research inputs for
the U.S. Federal Crop Insurance Program (FCIP). The assets are
project-agnostic and support FCIP research generally: peril-specific
product design, index insurance evaluation, loss attribution, and
producer-level policy simulation.

The core of the release is a set of pseudo-producer panels
constructed from unit-level Summary of Business (SOBTPU) experience,
cause-of-loss records, and calibrated yields, together with the
intermediate unit-level attribution products used to build them.
Pseudo-producers are defined at the cell
commodity year × state × county × commodity × type × practice, and can
be placed on RMA Rainfall Index (RI) grids either by probability
apportionment or by sampled whole-grid assignment.

The data are generated by the (private) rfcipCalibrate workflow;
because the workflow is private, everything needed for replication-grade
use — including the sampled grid assignments — is published here rather
than left to regeneration.

📄 Full methodology (record-linkage cascade, panel construction,
peril occurrence/severity, and placement design) is documented in the
companion article:
https://ftsiboe.github.io/book-fcip-field-guide/articles/008_synthetic-fcip.html

📁 Included Files

1. Unit-level prevented-planting identification

  • pp_units.rds Unit-level SOBTPU experience (buy-up business,
    insurance plans 1–3 and 90, catastrophic coverage excluded) with the
    prevented-planting (PP) identification cascade applied. Units are
    matched to cause-of-loss records within pools covered by the PP
    provision; each claimed unit is resolved by
    1. exact financial match, (2) sole claimant in pool, or (3) sole
      peril in pool, with the remainder unresolved.

Key columns (in addition to standard rfcip SOBTPU columns)

  • pp_status = How the unit was resolved: 1 exact financials, 2
    sole claimant, 3 sole peril, -1 claimed but ambiguous, 0 no
    claim or no PP in pool
  • pp_status_label = Human-readable version of pp_status
  • is_pp = Verdict: TRUE prevented planting, FALSE other peril,
    NA unresolved
  • pp_share_acres = Pool-level share of determined acres in
    Prevented stages
  • pp_share_indem = The unit’s PP indemnity share (verdict for
    resolved units, pool prorate for unresolved)
  • pp_05pct_buy_up_share, pp_10pct_buy_up_share = Indemnity
    shares under the 5% / 10% PP buy-up elections (stage codes PF /
    PT); nested inside pp_share_indem, so the basic-only share is
    recoverable by subtraction

2. Unit-level loss attribution (full peril taxonomy)

  • unit_cause_shares.rds A list of three data.tables keyed by
    unit_uid (ship the set together). Attribution runs over the full
    peril taxonomy interacted with the loss type: each cause is
    <peril>|pp (Prevented stages) or <peril>|prod (production losses),
    where perils follow damage_name_recode.

units

  • Filtered SOBTPU rows plus unit_uid, col_status /
    col_status_label (same resolution codes as pp_status),
    primary_cause (largest indemnity share), and
    primary_cause_share

cause_shares

  • unit_uid = Unit identifier (links to units)
  • cause = Peril × loss type (e.g. Excess Moisture|pp,
    Drought|prod)
  • share_indem = The unit’s indemnity share by cause (matched
    shares for resolved units, pool prorate for unresolved); sums to one
    within a unit
  • share_acres = Pool-level share of determined acres by cause

buyup_shares

  • unit_uid = Unit identifier
  • buyup = PP buy-up election ("05" / "10")
  • share_indem = The unit’s indemnity share in buy-up Prevented
    stages; nests inside the |pp cause shares

3. Cell-level peril probabilities

  • peril_probabilities.rds Long table of peril occurrence and
    severity at the pseudo-producer cell, derived from
    unit_cause_shares.rds. The two loss-type blocks come from fixed
    source levels with no fallback: the PP block (|pp causes and buy-up
    pseudo-causes) from county × practice experience (pooled across
    commodities), the production block (|prod causes) from county ×
    commodity × practice
    (pooled across types). Cells whose source level
    has no attributed experience carry no rows.

Columns

  • pooling = "year" (realized, per commodity year) or
    "climatology" (all years pooled)
  • commodity_year = Commodity year (NA for climatology rows)
  • state_code, county_code, commodity_code,
    type_code, practice_code = Cell keys
  • cause = Peril × loss type, plus the buy-up pseudo-causes
    pp_05pct_buyup / pp_10pct_buyup
  • is_buyup = Flags the buy-up pseudo-causes (they nest inside the
    |pp causes; exclude them when summing across causes)
  • occurrence = Liability-weighted probability the cause strikes:
    liability on units with a positive indemnity share for the cause, over
    the source level’s total liability
  • severity = Damage rate given a strike: the cause’s indemnity
    dollars over that hit liability. occurrence × severity recovers the
    cause’s loss cost

4. Candidate RI grids

  • crop_ri_candidates.rds County × commodity candidate RI grids
    with crop-cover assignment probabilities. Cropland Data Layer (CDL)
    cover weights on the PRISM raster are mapped to the official RMA RI
    grid and normalized within county × commodity. Nested format: one row
    per state_code × county_code × commodity_code with an
    ri_candidates list-column.

ri_candidates list-column

  • grid_id = RI grid identifier (GRIDCODE from the official RMA RI
    grid shapefile)
  • weight = Crop-cover weight of the grid within the county ×
    commodity
  • probability = Normalized assignment probability (sums to one
    within county × commodity)

5. Pseudo-producer panel, apportioned

  • synthetic_data.rds The smooth benchmark panel: one row per cell
    × candidate grid, with each cell split fractionally across its
    candidate RI grids by crop-cover probability. Totals are conserved
    exactly; within-county placement risk is smoothed away. Each cell ×
    grid carries a single representative election — the
    (unit_structure_code, insurance_plan_code, coverage_level_percent)
    triple covering the most probability-weighted reported acres in the
    cell.

Key columns

  • grid_id + cell keys (commodity_year, state_code,
    county_code, commodity_code, type_code, practice_code)
  • unit_structure_code, insurance_plan_code,
    coverage_level_percent = Representative election (acre-weighted
    mode; ties broken by larger liability, then lowest codes)
  • net_reporting_level_amount, liability_amount,
    total_premium_amount, subsidy_amount,
    indemnity_amount, potential_liability = Summed exposure
    and experience (probability weighted across grids)
  • pp_acres, pp_05pct_acres, pp_10pct_acres,
    pp_indemnity_amount = Prevented-planting quantities
  • pp_resolved_share_indem, pp_unresolved_share_indem,
    is_pp_share_indem = Cell-level indemnity shares by PP resolution
    status / verdict
  • rate_yield, approved_yield, average_yield,
    adjusted_yield, calibrated_yield = Acre-weighted per-acre
    yields (calibrated by the rfcipCalibrate yield workflow)
  • simulation_weight, revealed_budget = Carried from the
    calibrated-yield inputs
  • occurrence_<cause>_yr, severity_<cause>_yr,
    occurrence_<cause>_clim, severity_<cause>_clim = Wide
    peril probabilities from peril_probabilities.rds (_yr = realized
    year, _clim = climatology). Cause names are slugified (lowercase,
    non-alphanumerics to _; e.g. Excess Moisture|pp
    excess_moisture_pp). Zeros mean either the peril never struck or the
    source level has no attributed experience

6. Pseudo-producer panel, grid-free

  • agent_panel.rds The sampled-assignment companion to
    synthetic_data.rds: pseudo-producers are NOT located on grids and
    retain their observed election mix (one row per cell × observed
    (unit_structure_code, insurance_plan_code, coverage_level_percent)
    triple, no representative collapse). Carries the same exposure,
    experience, PP, and yield columns as the apportioned panel (unweighted
    sums), without the peril probability columns.

Key column

  • agent_uid = Content-based identifier (cell keys + election
    triple, |-separated); stable across rebuilds and immune to row
    order. Links to the sampled grid assignments below

7. Sampled whole-grid assignments

  • agent_grid_assignments_<lo>_<hi>.zip Sampled whole-grid RI
    assignments for the grid-free panel, bundled in chunks of 100
    replications per zip (GitHub caps release assets at 2 GB). Each
    replication places every agent entirely in ONE RI grid, drawn from its
    county × commodity candidate grids with the release probabilities —
    the sampled-placement alternative to probability apportionment, which
    preserves within-county placement risk.

Contents of each zip

  • rep_###.rds = One file per replication: agent_uid, grid_id
  • agents_key.rds = Sorted vector of all agent_uid values
    (integrity key; verify it matches agent_panel.rds before use).
    Included in every chunk so any single chunk is self-contained

Replications are reproducible in isolation: replication r is drawn
under seed 20260703 + r, so a given replication is identical
regardless of how many replications exist, and the set can be extended
without disturbing existing ones.


Methodology notes

  • Unit-to-record matching cascade. Both attribution products link
    SOBTPU units to cause-of-loss records within pools (the identifier
    columns shared by both data sets): (1) exact one-to-one match on
    rounded liability, premium, subsidy, and indemnity, with ties excluded
    on both sides; (2) a pool with exactly one indemnified unit absorbs
    all of the pool’s records; (3) a pool with exactly one record left
    explains all remaining claimants. Unresolved pools are prorated by
    residual indemnity shares.
  • Filters. Insurance plans 1–3 and 90 (APH/YP, RP, RP-HPE, and their
    predecessors); catastrophic coverage excluded; units with zero or
    non-finite liability dropped.
  • Cells, not producers. Pseudo-producers are county-level
    aggregates, not actual farms. No producer-level microdata are used or
    disclosed.

Download and use in R

Files in this release can be downloaded directly from GitHub using
piggyback.

Example: the apportioned panel

file_name <- "synthetic_data.rds"
directory <- "data"

if (!dir.exists(directory)) {
  dir.create(directory, recursive = TRUE)
}

piggyback::pb_download(
  file = file_name,
  dest = directory,
  repo = "ftsiboe/USFarmSafetyNetLab",
  tag = "synthetic_fcip",
  overwrite = TRUE
)

synthetic_data <- readRDS(file.path(directory, file_name))
str(synthetic_data)

Example: grid-free panel + one sampled replication

directory <- "data"
if (!dir.exists(directory)) dir.create(directory, recursive = TRUE)

for (f in c("agent_panel.rds", "agent_grid_assignments_0001_0100.zip")) {
  piggyback::pb_download(
    file = f, dest = directory,
    repo = "ftsiboe/USFarmSafetyNetLab",
    tag = "synthetic_fcip", overwrite = TRUE)
}
utils::unzip(file.path(directory, "agent_grid_assignments_0001_0100.zip"),
             exdir = directory)

agent_panel <- readRDS(file.path(directory, "agent_panel.rds"))

# Integrity check: the assignments must match the panel's agent set.
key <- readRDS(file.path(directory, "agent_grid_assignments", "agents_key.rds"))
stopifnot(identical(key, sort(agent_panel$agent_uid)))

# Join replication 1's whole-grid placements onto the panel.
rep1 <- readRDS(file.path(directory, "agent_grid_assignments", "rep_001.rds"))
panel_r1 <- merge(agent_panel, rep1, by = "agent_uid")

Example: unit-level attribution

piggyback::pb_download(
  file = "unit_cause_shares.rds", dest = "data",
  repo = "ftsiboe/USFarmSafetyNetLab",
  tag = "synthetic_fcip", overwrite = TRUE)

unit_cause_shares <- readRDS(file.path("data", "unit_cause_shares.rds"))
units        <- unit_cause_shares$units
cause_shares <- unit_cause_shares$cause_shares  # join on unit_uid

Data sources

These files are derived from publicly available source materials,
including:

  • USDA Risk Management Agency (RMA): Summary of Business (SOBTPU),
    cause-of-loss (COLSOM) records, stage-code listings, and
    prevented-planting actuarial data master (ADM) extracts — available at
    the RMA data repository
  • USDA NASS Cropland Data Layer (CDL): crop-cover weights used in
    the candidate-grid probabilities
  • PRISM Climate Group: the raster grid used to map crop cover to RI
    grids
  • Official RMA RI grid: official_RMA_RI_grid shapefile published
    by Grazing Management Systems (2009, Edition 1.0,
    http://prfri-rma-map.tamu.edu/default.aspx)

How the data are produced

File Source Derivation
pp_units.rds RMA SOBTPU + COLSOM + stage listing + PP ADM Unit-to-record matching cascade within PP-provision pools; verdict, acre share, and buy-up shares per unit
unit_cause_shares.rds RMA SOBTPU + COLSOM + stage listing Same cascade over all pools; indemnity shares by peril × loss type (|pp / |prod), plus buy-up shares
peril_probabilities.rds unit_cause_shares.rds Occurrence (hit liability / total liability) and severity (indemnity / hit liability) by cause; PP block at county × practice, prod block at county × commodity × practice; year and climatology poolings
crop_ri_candidates.rds CDL + PRISM + RMA RI grid CDL cover weights on the PRISM raster mapped to RI grids and normalized within county × commodity
synthetic_data.rds pp_units.rds + calibrated yields + candidates + peril_probabilities.rds Units pooled to cells, apportioned across candidate grids by probability; representative election per cell × grid; wide peril probabilities attached
agent_panel.rds pp_units.rds + calibrated yields Units pooled to cell × observed election; content-based agent_uid
agent_grid_assignments_*.zip agent_panel.rds + crop_ri_candidates.rds Inverse-CDF sampling of one whole grid per agent per replication; seed 20260703 + r

Citation

When using these files in research, reports, or publications, please
cite: