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.
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 NAThe 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.
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 NAThe direct and comparison workflows lead to the same INR 6,500/ha net change.
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 haThis can be reported as both a component amount and a multiple of the amount in the central partial budget.
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)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.
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)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.0000The 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.
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.
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 FALSEDominance 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.
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.
CIMMYT. (1988). From agronomic data to farmer recommendations: An economics training manual (completely revised edition). CIMMYT. ISBN 968-6127-19-4.