IndFarmCost provides a reproducible implementation of
the principal Indian farm cost concepts used in farm management and
cost-of-cultivation analysis. The package focuses on transparent
formulas and uses base R for all core calculations.
The package implements the following identities:
The exact valuation of individual inputs can vary with the survey/manual and reference period. Therefore, the package separates valuation of components from aggregation into cost concepts.
library(IndFarmCost)
dat <- farm_cost_example()
fc <- farm_costs(dat)
fc[1:4, c("farm_id", "crop", "A1", "A2", "B1", "B2", "C1", "C2", "C3")]
#> Indian farm cost concepts (farmcost)
#> farm_id crop A1 A2 B1 B2 C1 C2 C3
#> 1 F01 Wheat 35070 35070 37370 59370 44570 66570 73227
#> 2 F02 Wheat 36020 39520 38620 63120 44720 69220 76142
#> 3 F03 Wheat 37020 42020 40020 64520 44820 69320 76252
#> 4 F04 Wheat 38270 44770 41770 66270 45270 69770 76747farm_costs_aggregate(fc, by = "crop")
#> crop A1 A2 B1 B2 C1 C2 C3
#> 1 Paddy 41460 45585 44510 70385 50260 76135 83748.5
#> 2 Potato 78890 82265 82790 113540 90890 121640 133804.0
#> 3 Wheat 36595 40345 39445 63320 44845 68720 75592.0
farm_costs_aggregate(fc, by = c("state", "farm_size"), method = "median")
#> state farm_size A1 A2 B1 B2 C1 C2 C3
#> 1 Punjab Large 38270 44770 41770 66270 45270 69770 76747
#> 2 Punjab Marginal 35070 35070 37370 59370 44570 66570 73227
#> 3 Punjab Medium 37020 42020 40020 64520 44820 69320 76252
#> 4 Punjab Small 36020 39520 38620 63120 44720 69220 76142
#> 5 Uttar Pradesh Large 43310 50310 47010 73510 50810 77310 85041
#> 6 Uttar Pradesh Marginal 39710 39710 42210 66210 49810 73810 81191
#> 7 Uttar Pradesh Medium 41960 47460 45160 71660 50260 76760 84436
#> 8 Uttar Pradesh Small 40860 44860 43660 70160 50160 76660 84326
#> 9 West Bengal Large 82290 88290 86990 117490 92190 122690 134959
#> 10 West Bengal Marginal 75590 75590 78790 108790 89790 119790 131769
#> 11 West Bengal Medium 79940 84440 84040 115040 91040 122040 134244
#> 12 West Bengal Small 77740 80740 81340 112840 90540 122040 134244summarize_costs(fc)
#> concept n mean sd min q1 median q3 max cv_percent
#> 1 A1 12 52315.00 19822.70 35070 37957.50 41410 76127.5 82290 37.89104
#> 2 A2 12 56065.00 19939.10 35070 41442.50 46160 76877.5 88290 35.56425
#> 3 B1 12 55581.67 20346.50 37370 41332.50 44410 79427.5 86990 36.60650
#> 4 B2 12 82415.00 23370.50 59370 65787.50 70910 109802.5 117490 28.35710
#> 5 C1 12 61998.33 21470.59 44570 45157.50 50210 89977.5 92190 34.63091
#> 6 C2 12 88831.67 24470.61 66570 69657.50 76710 120352.5 122690 27.54717
#> 7 C3 12 97714.83 26917.67 73227 76623.25 84381 132387.8 134959 27.54717ret <- farm_returns(
fc,
main_output = "main_output_q",
main_price = "main_price_rs_q",
byproduct_output = "byproduct_output_q",
byproduct_price = "byproduct_price_rs_q"
)
head(ret[, c("gross_return", "net_C2", "net_C3", "bcr_C2", "bcr_C3")])
#> gross_return net_C2 net_C3 bcr_C2 bcr_C3
#> 1 127760 61190 54533 1.919183 1.744712
#> 2 133320 64100 57178 1.926033 1.750939
#> 3 138880 69560 62628 2.003462 1.821329
#> 4 144440 74670 67693 2.070231 1.882028
#> 5 136060 62250 54869 1.843382 1.675802
#> 6 141400 64740 57074 1.844508 1.676826byproduct_value <- dat$byproduct_output_q * dat$byproduct_price_rs_q
cost_of_production(fc, "main_output_q", concept = "C2",
byproduct_value = byproduct_value)[1:4]
#> [1] 1040.2222 1036.1702 980.4082 935.8824
break_even_price(fc, "main_output_q", concept = "C3",
byproduct_value = byproduct_value)[1:4]
#> [1] 1188.156 1183.447 1121.878 1072.686cost_sensitivity(dat, "fertilizer", changes = c(-0.20, -0.10, 0, 0.10, 0.20))
#> change change_percent A1 A2 B1 B2 C1 C2
#> 1 -0.2 -20 50581.67 54331.67 53848.33 80681.67 60265.00 87098.33
#> 2 -0.1 -10 51448.33 55198.33 54715.00 81548.33 61131.67 87965.00
#> 3 0.0 0 52315.00 56065.00 55581.67 82415.00 61998.33 88831.67
#> 4 0.1 10 53181.67 56931.67 56448.33 83281.67 62865.00 89698.33
#> 5 0.2 20 54048.33 57798.33 57315.00 84148.33 63731.67 90565.00
#> C3
#> 1 95808.17
#> 2 96761.50
#> 3 97714.83
#> 4 98668.17
#> 5 99621.50If a particular survey uses a different set of items in A1, pass the required column names explicitly:
my_a1 <- setdiff(standard_a1_components(), "insurance")
fc_custom <- farm_costs(dat, a1_cols = my_a1)
fc_custom[1:3, c("A1", "C2", "C3")]
#> Indian farm cost concepts (farmcost)
#> A1 C2 C3
#> 1 34620 66120 72732
#> 2 35570 68770 75647
#> 3 36520 68820 75702Alternatively, a pre-computed A1 column can be supplied through
a1_col. This design makes the package adaptable while
preserving the algebra linking A1, A2, B1, B2, C1, C2, and C3.