Farm Partial-Budget Analysis with farmPartial

Chiranjit Mazumder, Utkarsh Tiwari, and Anbukkani Perumal

1. What a partial budget measures

A partial budget estimates the economic effect of a limited change in the farm plan. It includes only returns and costs that differ between the baseline and the alternative. Let

Then the expected change in net return is

\[ \Delta NR = (AR + RC) - (AC + RR). \]

This framing is useful for questions such as whether to change tillage practice, adopt a new input, alter irrigation management, or introduce a small equipment investment when most of the farm business remains unchanged.

library(farmPartial)

2. Direct four-component analysis

The package contains an internally generated wheat example in INR per hectare. It is intended only to demonstrate the method.

changes <- wheat_example("changes")
changes
#>                        item    change_type amount
#> 1       Higher grain return   added_return   6000
#> 2   Lower irrigation energy   reduced_cost   1800
#> 3    Saved land preparation   reduced_cost   3000
#> 4 Precision seed drill hire     added_cost   2000
#> 5      Additional herbicide     added_cost   1200
#> 6   Extra management labour     added_cost    600
#> 7        Lower straw return reduced_return    500

pb <- partial_budget(changes, currency = "INR", unit = "per ha")
pb
#> Farm partial budget
#> Currency/scale: INR per ha
#> Added returns:       6,000.00
#> Reduced costs:       4,800.00
#> Added costs:         3,800.00
#> Reduced returns:     500.00
#> Net change:          6,500.00
#> Decision signal:     favorable
budget_summary(pb)
#>   currency   unit  decision added_returns reduced_costs total_favorable_changes
#> 1      INR per ha favorable          6000          4800                   10800
#>   added_costs reduced_returns total_adverse_changes delta_returns delta_costs
#> 1        3800             500                  4300          5500       -1000
#>   net_change change_benefit_cost_ratio marginal_rate_return_pct
#> 1       6500                  2.511628                       NA
plot(pb)
Favorable and adverse changes in the illustrative wheat partial budget.
Favorable and adverse changes in the illustrative wheat partial budget.

The example has INR 10,800/ha of favorable changes and INR 4,300/ha of adverse changes, producing an expected net increase of INR 6,500/ha. That result is conditional on the values entered; it is not a statement that the alternative is universally preferable.

3. Start from baseline and alternative plans

When the two plans are already available as farm-budget tables, compare_budgets() automatically classifies their differences.

baseline <- wheat_example("baseline")
alternative <- wheat_example("alternative")
pb_compare <- compare_budgets(baseline, alternative)
pb_compare$comparison
#>                        item category baseline alternative delta
#> 1              Grain return   return   125000      131000  6000
#> 2                 Herbicide     cost     2200        3400  1200
#> 3         Irrigation energy     cost     8500        6700 -1800
#> 4          Land preparation     cost     5000        2000 -3000
#> 5         Management labour     cost     3000        3600   600
#> 6 Precision seed drill hire     cost        0        2000  2000
#> 7              Straw return   return    18000       17500  -500
budget_summary(pb_compare)
#>   currency   unit  decision added_returns reduced_costs total_favorable_changes
#> 1      INR per ha favorable          6000          4800                   10800
#>   added_costs reduced_returns total_adverse_changes delta_returns delta_costs
#> 1        3800             500                  4300          5500       -1000
#>   net_change change_benefit_cost_ratio marginal_rate_return_pct
#> 1       6500                  2.511628                       NA

The direct and comparison workflows lead to the same INR 6,500/ha net change.

4. Break-even analysis

A break-even value asks how far one component could move before the economic advantage disappears, with other entries held fixed.

break_even_component(pb, "Additional herbicide")
#>                   item change_type current_amount current_net_change
#> 1 Additional herbicide  added_cost           1200               6500
#>   break_even_multiplier break_even_amount feasible_nonnegative currency   unit
#> 1              6.416667              7700                 TRUE      INR per ha

This can be reported as both a component amount and a multiple of the amount in the central partial budget.

5. One-way and two-way sensitivity

s1 <- sensitivity_analysis(
  pb,
  "Higher grain return",
  multipliers = seq(0.6, 1.4, by = 0.1)
)
s1
#> One-way partial-budget sensitivity analysis
#>                 item multiplier amount net_change delta_returns delta_costs
#>  Higher grain return        0.6   3600       4100          3100       -1000
#>  Higher grain return        0.7   4200       4700          3700       -1000
#>  Higher grain return        0.8   4800       5300          4300       -1000
#>  Higher grain return        0.9   5400       5900          4900       -1000
#>  Higher grain return        1.0   6000       6500          5500       -1000
#>  Higher grain return        1.1   6600       7100          6100       -1000
#>  Higher grain return        1.2   7200       7700          6700       -1000
#>  Higher grain return        1.3   7800       8300          7300       -1000
#>  Higher grain return        1.4   8400       8900          7900       -1000
#>  favorable
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
plot(s1)

s2 <- two_way_sensitivity(
  pb,
  "Higher grain return",
  "Additional herbicide",
  multipliers_x = seq(0.6, 1.4, by = 0.1),
  multipliers_y = seq(0.6, 1.4, by = 0.1)
)
plot(s2)
Two-way sensitivity of net change to an added return and an added cost.
Two-way sensitivity of net change to an added return and an added cost.

Sensitivity analysis is especially important when partial-budget conclusions depend on output prices, yields, hired labor costs, energy prices, or other values that can vary substantially.

6. Named scenarios

Scenario analysis changes several components together, which is often more realistic than moving one item at a time.

scenario_spec <- data.frame(
  scenario = c(
    "Output stress", "Input stress",
    "Combined stress", "Combined stress"
  ),
  item = c(
    "Higher grain return", "Additional herbicide",
    "Higher grain return", "Additional herbicide"
  ),
  multiplier = c(0.75, 1.30, 0.75, 1.30)
)

scenario_results <- scenario_analysis(pb, scenario_spec)
scenario_results
#> Partial-budget scenario analysis
#>         scenario net_change delta_returns delta_costs change_benefit_cost_ratio
#>             Base       6500          5500       -1000                  2.511628
#>    Output stress       5000          4000       -1000                  2.162791
#>     Input stress       6140          5500        -640                  2.317597
#>  Combined stress       4640          4000        -640                  1.995708
#>  favorable
#>       TRUE
#>       TRUE
#>       TRUE
#>       TRUE
plot(scenario_results)

7. Monte Carlo uncertainty analysis

For uncertain inputs, assign probability distributions to selected components. Unspecified items stay fixed at their central values.

uncertainty <- data.frame(
  item = c("Higher grain return", "Additional herbicide"),
  distribution = c("normal", "triangular"),
  mean = c(6000, NA),
  sd = c(900, NA),
  min = c(NA, 900),
  mode = c(NA, 1200),
  max = c(NA, 1700)
)

sim <- simulate_partial_budget(pb, uncertainty, n = 3000, seed = 2026)
summary(sim)
#>                 metric     value
#> 1      mean_net_change 6419.0656
#> 2    median_net_change 6403.7974
#> 3        sd_net_change  898.6293
#> 4       interval_lower 4689.1106
#> 5       interval_upper 8153.4361
#> 6 probability_positive    1.0000
plot(sim)
Monte Carlo distribution of the partial-budget net change.
Monte Carlo distribution of the partial-budget net change.

The probability of a positive net change is often more decision-relevant than a single deterministic estimate. The interval returned here is an uncertainty interval induced by the assumed component distributions, not a sampling confidence interval.

8. Annualizing a capital change

When a new farm practice requires equipment that lasts several years, a one-year partial budget should usually include an annualized capital charge rather than the entire purchase price.

annualize_investment(
  purchase = 120000,
  salvage = 20000,
  life = 8,
  rate = 0.08
)
#> [1] 19001.48

9. Dominance and marginal analysis for trials

Treatment-level economic analysis can be paired with partial-budget reasoning. The following example adjusts experimental yield downward by 10 percent before calculating gross and net benefits.

trials <- trial_budget(
  treatment = c("Farmer practice", "Treatment A", "Treatment B", "Treatment C"),
  yield = c(3.0, 3.4, 3.8, 4.1),
  price = 22000,
  variable_cost = c(18000, 22000, 28000, 39000),
  yield_adjustment = 0.90
)
trials
#>         treatment observed_yield yield_adjustment adjusted_yield price
#> 1 Farmer practice            3.0              0.9           2.70 22000
#> 2     Treatment A            3.4              0.9           3.06 22000
#> 3     Treatment B            3.8              0.9           3.42 22000
#> 4     Treatment C            4.1              0.9           3.69 22000
#>   gross_benefit variable_cost net_benefit
#> 1         59400         18000       41400
#> 2         67320         22000       45320
#> 3         75240         28000       47240
#> 4         81180         39000       42180
dominance_analysis(trials)
#>         treatment observed_yield yield_adjustment adjusted_yield price
#> 1 Farmer practice            3.0              0.9           2.70 22000
#> 2     Treatment A            3.4              0.9           3.06 22000
#> 3     Treatment B            3.8              0.9           3.42 22000
#> 4     Treatment C            4.1              0.9           3.69 22000
#>   gross_benefit variable_cost net_benefit dominated
#> 1         59400         18000       41400     FALSE
#> 2         67320         22000       45320     FALSE
#> 3         75240         28000       47240     FALSE
#> 4         81180         39000       42180      TRUE
marginal_analysis(trials, minimum_mrr = 50)
#>         treatment variable_cost net_benefit delta_variable_cost
#> 1 Farmer practice         18000       41400                  NA
#> 2     Treatment A         22000       45320                4000
#> 3     Treatment B         28000       47240                6000
#>   delta_net_benefit marginal_rate_return_pct meets_minimum_mrr
#> 1                NA                       NA                NA
#> 2              3920                       98              TRUE
#> 3              1920                       32             FALSE

Dominance removes an alternative when another achieves at least as much net benefit at no greater variable cost, with a strict improvement in at least one dimension. Marginal analysis then asks how much additional net benefit is generated by the extra cost of moving between remaining alternatives.

10. Interpretation limits

A favorable partial budget is evidence about incremental profitability under the assumptions entered. It does not prove that the farmer has enough labor, credit, water, machinery capacity, or risk tolerance to implement the change. If the proposed change reorganizes many interacting enterprises or changes binding resource constraints, a whole-farm model or investment appraisal may be more appropriate.

Reference

CIMMYT. (1988). From agronomic data to farmer recommendations: An economics training manual (completely revised edition). CIMMYT. ISBN 968-6127-19-4.