Agricultural Policy Analysis with agriPAM

Chiranjit Mazumder, Himadri Sekhar Roy, Utkarsh Tiwari, Pramit Pandit, and Bikramjeet Ghose

2026-08-30

Purpose

A Policy Analysis Matrix (PAM) compares two enterprise budgets for the same production system. The private budget uses observed market prices and measures incentives faced by producers. The social budget uses efficiency prices and measures the value of outputs and inputs to the economy. Their difference captures policy and market-failure transfers.

library(agriPAM)

The PAM accounting identities

The conventional structure is:

Valuation Revenue Tradable inputs Domestic factors Profit
Private \(A\) \(B\) \(C\) \(D=A-B-C\)
Social \(E\) \(F\) \(G\) \(H=E-F-G\)
Transfer \(I=A-E\) \(J=B-F\) \(K=C-G\) \(L=D-H=I-J-K\)

agriPAM retains the six additive accounts and derives every profit, transfer, and ratio from them. This design prevents contradictory totals after grouping or scenario analysis.

Constructing a PAM directly

paddy <- pam(
  private_revenue = 150000,
  private_tradable_inputs = 42000,
  private_domestic_factors = 61000,
  social_revenue = 140000,
  social_tradable_inputs = 46000,
  social_domestic_factors = 55000,
  id = "Paddy",
  unit = "ha",
  currency = "INR"
)

pam_matrix(paddy)
#>          Revenue Tradable inputs Domestic factors Profit
#> Private   150000           42000            61000  47000
#> Social    140000           46000            55000  39000
#> Transfer   10000           -4000             6000   8000
#> attr(,"id")
#> [1] "Paddy"
pam_indicators(paddy)
#>      id     npco      npci      epc       pcr       drc       pc        srp
#> 1 Paddy 1.071429 0.9130435 1.148936 0.5648148 0.5851064 1.205128 0.05714286
#>         scb
#> 1 0.7214286

All revenue and cost components must be finite and non-negative. Profits and transfers can be negative. When a ratio denominator is zero, the corresponding ratio is reported as NA rather than as an infinite value.

Starting with an itemised farm budget

pam_from_budget() accepts one row per budget item. Each row must identify the quantity, private price, social price, and one of three account categories: output, tradable_input, or domestic_factor.

budget <- agri_pam_example("budget")
head(budget)
#>    crop                     item        category quantity private_price
#> 1 Paddy              Main output          output      5.2         22000
#> 2 Paddy               By-product          output      3.0          3000
#> 3 Paddy                     Seed  tradable_input     60.0            55
#> 4 Paddy Fertiliser and chemicals  tradable_input      1.0         18500
#> 5 Paddy       Fuel and machinery  tradable_input      1.0          6500
#> 6 Paddy                   Labour domestic_factor    110.0           450
#>   social_price
#> 1        23000
#> 2         2500
#> 3           48
#> 4        20500
#> 5         7200
#> 6          500

crops <- pam_from_budget(
  budget,
  quantity = "quantity",
  private_price = "private_price",
  social_price = "social_price",
  category = "category",
  id = "crop",
  unit = "ha",
  currency = "INR"
)

pam_values(crops)
#>         id private_revenue private_tradable_inputs private_domestic_factors
#> 1    Paddy          123400                   28300                    67500
#> 2    Wheat          111475                   23600                    53720
#> 3 Chickpea          112500                   19625                    45300
#> 4  Mustard           97050                   18400                    44920
#>   private_profit social_revenue social_tradable_inputs social_domestic_factors
#> 1          27600         127100                  30580                   71000
#> 2          34155         113450                  25500                   56000
#> 3          47575         119740                  20300                   47100
#> 4          33730         102750                  19700                   46640
#>   social_profit
#> 1         25520
#> 2         31950
#> 3         52340
#> 4         36410

The included values are synthetic and are intended only to demonstrate the workflow.

Interpreting the indicators

pam_indicators(crops)
#>         id      npco      npci       epc       pcr       drc        pc
#> 1    Paddy 0.9708891 0.9254415 0.9852880 0.7097792 0.7355988 1.0815047
#> 2    Wheat 0.9825914 0.9254902 0.9991472 0.6113229 0.6367254 1.0690141
#> 3 Chickpea 0.9395357 0.9667488 0.9339803 0.4877524 0.4736525 0.9089606
#> 4  Mustard 0.9445255 0.9340102 0.9470199 0.5711380 0.5615894 0.9263938
#>           srp       scb
#> 1  0.01636507 0.7992132
#> 2  0.01943587 0.7183781
#> 3 -0.03979455 0.5628863
#> 4 -0.02608273 0.6456448
pam_classify(crops)
#>         id privately_profitable socially_profitable competitive
#> 1    Paddy                 TRUE                TRUE        TRUE
#> 2    Wheat                 TRUE                TRUE        TRUE
#> 3 Chickpea                 TRUE                TRUE        TRUE
#> 4  Mustard                 TRUE                TRUE        TRUE
#>   comparative_advantage output_protected tradable_inputs_subsidised
#> 1                  TRUE            FALSE                       TRUE
#> 2                  TRUE            FALSE                       TRUE
#> 3                  TRUE            FALSE                       TRUE
#> 4                  TRUE            FALSE                       TRUE
#>   effectively_protected
#> 1                 FALSE
#> 2                 FALSE
#> 3                 FALSE
#> 4                 FALSE

The main interpretation rules, conditional on economically meaningful positive value-added denominators, are:

Indicator Common decision rule Interpretation
DRC below 1 comparative advantage in domestic resources
PCR below 1 private value added covers domestic-factor cost
NPCO above 1 private output price exceeds social output price
NPCI below 1 private tradable-input cost is below its social cost
EPC above 1 positive net protection of value added
PC above 1 policies raise private relative to social profit
SRP above 0 positive net transfer relative to social revenue
SCB below 1 social benefits exceed social costs

These thresholds are diagnostics, not substitutes for inspecting the underlying budgets, price construction, and institutional setting.

Parity prices

The social output or input price can begin with a border price. Import parity adds domestic transfer costs; export parity subtracts them.

parity_price(
  border_price = 300,
  exchange_rate = 83,
  transport = 1200,
  handling = 300,
  direction = "import"
)
#> [1] 26400

Any conversion from border to farm-gate prices should document units, location, quality adjustment, exchange-rate convention, transport, processing, and marketing margins. Taxes and subsidies are excluded from an undistorted social price.

Aggregating production systems

Ratios should not ordinarily be averaged across systems. pam_aggregate() first sums the six accounts and then recalculates each ratio.

groups <- c("Cereal", "Cereal", "Pulse", "Oilseed")
regional <- pam_aggregate(crops, groups)
pam_indicators(regional)
#>        id      npco      npci       epc       pcr       drc        pc
#> 1  Cereal 0.9764082 0.9254636 0.9918957 0.6624949 0.6884588 1.0745606
#> 2   Pulse 0.9395357 0.9667488 0.9339803 0.4877524 0.4736525 0.9089606
#> 3 Oilseed 0.9445255 0.9340102 0.9470199 0.5711380 0.5615894 0.9263938
#>           srp       scb
#> 1  0.01781334 0.7610892
#> 2 -0.03979455 0.5628863
#> 3 -0.02608273 0.6456448

Reporting checklist

A defensible empirical application should report:

  1. The activity unit and reference period.
  2. Output, tradable-input, and domestic-factor classification rules.
  3. Private price sources and sampling design.
  4. Social price construction, parity-price assumptions, and exchange rate.
  5. Treatment of land, labour, capital, by-products, taxes, and subsidies.
  6. PAM accounts alongside ratios, not ratios alone.
  7. Sensitivity or uncertainty results for influential assumptions.

The companion vignette, vignette("uncertainty", package = "agriPAM"), develops the last point.