Adding a new crop to GLOBIOM

GLOBIOM represents 18 crops globally and 27 crops for the European Union. The more detailed crop distribution maps generated with mapspamc can be used to add an additional crop for a specific country. Reasons for doing so may be that the crop is of large importance for the country in terms of production, consumption or trade. The first step is to ensure that the new crop is added to the updated land cover and crop distribution files that are created with the create_globiom_input() function. This is done by updating the table that maps the mapspamc crops to the 18 GLOBIOM crops, which is stored in crop2globiom - a data file that is part of the mapspam2globiom package. In the next step several adjustments need to be made in GLOBIOM.

In the example below, we will add coffee as a separate crop.

# Update crop2globiom.csv and map coff to coff (instead of the rest category) and overwrite
crop_map <- crop2globiom %>%
  mutate(globiom_crop = ifelse(crop == "coff", "Coff", globiom_crop))

When create_globiom_input() is run with the updated mapping, coff will be includes as a separate crop in the gdx file.

In GLOBIOM, a crop can enter the model either as a crop that is only produced in the country of interest and traded with the rest of the world, or a crop that is produced and consumed in the whole world and traded bilaterally. As the focus is here on country-level crop distribution maps, we take the example of including a specific crop in terms of area and production only for the country of interest, with trade to and from the rest of the world. This example starts from the point where the new crop distribution maps have been prepared and added to the GLOBIOM database to replace the global data. As described in the section on Post-processing, the new crop also needs to be added to the crop2globiom.csv file that contains the mapping between the crop distribution maps generated with mapspamc and the GLOBIOM crops.

To add a new crop, we take the following steps:

  1. Assigning the new crop in sets
  2. Supply
  3. Demand
    1. Adding demand in base year
    2. Shifting demand in scenarios
  4. Trade

In the remainder, we take the example of cocoa production in Indonesia. All our changes take place in the model folder

Assigning the new crop in sets

we have to add the new crop in the relevant sets where other crops are reported. This happens in the following places:

decl_Rsets.gms
-   CROP(SPECIES)
-   PRODUCT(ALLPRODUCT)
-   PRIMARY(PRODUCT)
-   FINALP(PRODUCT)
-   CROPS(PRODUCT)

decl_sets.gms
-   ALLITEM
-   SPECIES(ALLITEM)   
-   ALLPRODUCT(ALLITEM)
-   ALLCROPS(ALLPRODUCT)
-   Cropprodmap(SPECIES,ALLPRODUCT)

Supply

Production and productivity of all crops, including the new crop, has been scaled to FAOstat data as described in the Post-processing. Furthermore, in the base year, the producer price for the modeled crops is calibrated on FAOSTAT data. Therefore, the crop of interest should be added in the supply data (in 1000 tons) and production data (tonnes).

Data_supply.gms
TABLE SData(ANYREGION,ALLPRODUCT,CURVE)  Supply Data in 1000 units
Proddata_c.gms
PARAMETER
PRODATA_C(ANYREGION,ALLITEM,DataItems) Production data for crops (tonnes)
 /
   IndonesiaReg.Ccoa.YIELD                                              0.51
   IndonesiaReg.Ccoa.PRODQ                                         568535.80
   IndonesiaReg.Ccoa.AreaHarv                                     1138085.20

In addition to yield responses to prices, GLOBIOM has an assumption on technological change that reflect the increase of yield over time independently from market mechanisms, due to progress in e.g. breeding, introduction of new varieties, and technology diffusion. This exogenous yield change is stored in the parameter YLD_SSP_STAT(*,ANYREGION,ALLPRODUCT,ALLYEAR) and is dependent on the socio-economic pathways. For the year 2000, the exogenous yield change gets the value 1, after which it moves in a cumulative fashion. For the producing region and the crop to be added, the exogenous yield change needs to be added in the file data_yld_SSPs.gms, located in the finaldata folder.

TABLE YLD_SSP_STAT(*,ANYREGION,ALLPRODUCT,ALLYEAR) Crop yield shifter for SSPs - Static income groups (2000 = 1)
            2010      2020      2030      2040      2050
"SSP2"."IndonesiaReg"."Ccoa"  1.000     1.000     1.000     1.000     1.000    

Demand

Food demand is in GLOBIOM endogenous and depends on population, gross domestic product (GDP) and own product price. Population and GDP are exogenous variables while prices are endogenous. A change in income per capita in the baseline drives a change in the food diet, associated to changing preferences.

The demand for non-producing regions can be set-up in two ways. If the new crop is introduced for the whole world (i.e. everywhere where in the base year the crop did grow, production is initialized), the demand will also be initialized at each of the regions in the world in the DDATA parameter above. In case the crop is only produced in the country of focus (i.e. other countries are likely also producing but for these countries no data is available), a demand is only created for the country of focus.

Adding demand in base year

The DDATA parameter captures the nonlinear demand function parameters including initial demand quantity, price and own-price elasticity by final product and region. Every producing region is automatically also a consuming region and therefore these items need to be filled-in for the region in data_demand.gms using the following format:

DData(ANYREGION,ALLPRODUCT,CURVE) Demand Data in 1000 units
                                        Quantity          Price       PriceEla           TFAC
"IndonesiaReg".Ccoa                        78.55         913.02          -0.59          10.00

Prices are another driver for a change in food consumption patterns. When the price of a product increases in GLOBIOM, the level of consumption of this product decreases, by a value determined by the price elasticity associated to this product in the region considered. The price elasticity indicates by how much the relative change in consumption is affected with respect to relative change in price. The values of these elasticities in GLOBIOM are sourced from the USDA demand elasticity database and should be added in the following place:

Data_ElaUSDA.gms (model folder\finaldata)
PARAMETER
DemandPriceEla_USDA(ANYREGION,ALLPRODUCT) price elasticity of demand
   IndonesiaReg.Ccoa                                                   -0.59

Data_crops.gms (data folder)
DData(REGION,CROPS,'PriceEla') = DemandPriceEla_USDA(REGION,CROPS);

Shifting demand for a new crop

After the initialization of the new crop in the DDATA, the demand change over the years is dependent on the price elasticity of demand. The price elasticity indicates by how much the relative change in consumption is affected with respect to relative change in price and is calculated as a function depending on population size, gross domestic product (GDP) and product prices. In GLOBIOM, the demand system is set-up in such a way that the price elasticity of developing countries converges to the price elasticity of the USA in 2000 at the same pace as their GDP per capita reach the USA GDP per capita value of 2000 (see GLOBIOM documentation for more information). However, one may want to diverge away from this assumption, for example when there is reason to believe that the price elasticity of the respective country does not follow the same trajectory as that of the US. This could for example be the case with products that are not used for food consumption, such as rubber and oil palm. In this case, alternative information, e.g. on the consumption of the specific crop per income class can be used to define how the price elasticity of demand may change over time for the product. The newly defined demand elasticity can then change based on the change in population and GDP in a similar fashion as the demand change:

Define_scenario.gms
DDATA(REGION,'ccoa',"Quantity")
         =  DDATA(REGION,'ccoa','quantity')
          * MACROSCEN_DATA(MacroScen,REGION,'POP_RelChng',ScenYear)
          *(MACROSCEN_DATA(MacroScen,REGION,'GDPpCAP_RelChng',ScenYear))
               **(CocoaDemGDPEla(REGION,'ccoa',MacroScen,ScenYear)) ;

Trade

Economic market balances in GLOBIOM are solved at the level of 37 economic regions. GLOBIOM represents international markets and their various products traded between regions, relying on international trade statistics for trade and tariffs. It endogenously computes bilateral trade flows through the minimization of total trading costs. In this framework, trade patterns are determined by initial trade flows, the evolution of relative costs of production between regions and the trading costs. It leads to one unique price for one good on the market and the absence of intra-industry trade between different regions. There are two ways to initialize the trade for a new crop. First, if production and consumption is introduced at the bilateral level, also trade can be introduced at the bilateral level. Second, if the crop is only produced in the country of focus (i.e. other countries are likely also producing but for these countries no data is available), a specific import/export is only created for the country of focus, which is equal to the combined import/export to the rest of the world. Here, we assume the second option applies.

First, net trade of the country of focus is initialized. Net trade is computed as the difference between domestic production and consumption based on FAO food commodity balance over 1998-2002. It is computed at the regional level, so it excludes intra-regional trade flows. It is expressed in thousands of tons for crops. In GLOBIOM, this means the following items are initialized:

data_fbs.gms
PARAMETER
FBS_DATA_DET(ANYREGION,ALLPRODUCT,DataItems) Calorie consumption and production per crop (kcal per capita per day)
 /
   IndonesiaReg.Ccoa.ProdCal                                          3.6200
   IndonesiaReg. Ccoa.ConsCal                                         3.6200
/

PARAMETER
FBS_DATA_DET_N(*,ALLPRODUCT) Calorie supplied (kcal per capita per day)
 /
   World. Ccoa                                                         1.3986
/

PARAMETER
SUADATA_C(ANYREGION,ALLPRODUCT,SUADataItem) SUA data for crops (1000 tones)
 /
   "IndonesiaReg"."Ccoa".PRODQ                                        586.27
   "IndonesiaReg"."Ccoa".ConsQ                                        252.63
   "IndonesiaReg"."Ccoa".FoodQ                                        252.63
   "IndonesiaReg"."Ccoa".PureFoodQ                                    215.70
   "IndonesiaReg"."Ccoa".OtherNUses                                    34.48
   "IndonesiaReg"."Ccoa".NetExports                                   333.64

In case the crop is only produced in the country of focus, trade is also only set up for the country of focus with the rest of the world. In this case, trade from the country of focus is initialized with a parameter for exogenous exports or imports, say trade_exo:

3_precompute:
TRADE_EXO(REGION,CROPS)
 =  PRODUCTION(‘IndonesiaReg’,’Ccoa’))
 -  DDATA(‘IndonesiaReg’,’Ccoa’,"Quantity")
 -  SUADATA_C(‘IndonesiaReg’,’Ccoa’,'FeedQ')
 -  ABS_FUEL_REQ(‘IndonesiaReg’,’Ccoa’);

Where TRADE_EXO is defined as production (PRODUCTION - the sum of the area multiplied by the yield) minus consumption (DDATA), feed demand (SUADATA_C) and bioenergy demand (ABS_FUEL_REQ). In case of exports, the production is larger than the sum of consumption, feed and bioenergy demand and TRADE_EXO is positive. In the case of imports, production is smaller than the sum of consumption, feed and bioenergy demand and TRADE_EXO is negative.

To account for this outside demand in the model, TRADE_EXO is added to the objective function and the ds_balance:

4_model.gms:
Objective_equ
…
+ sum((REGION,PRODUCT),
TRADE_EXO(REGION,PRODUCT)
 * PRICE_EXP_EXO(REGION,PRODUCT))

Where PRICE_EXP_EXO is equal to DDATA(REGION,CROPS,"Price").

Ds_balance
…
    + TRADE_EXO (REGION,PRODUCT)   

Subsequently, the outside demand and expectation on the country of focus’ reaction on outside demand needs to be captured by shifting the TRADE_EXO parameter through time. Depending on the crop and country of focus, a suitable way of extrapolation can be invented. For example, a usual extrapolation rule could be x(t) = [x(baseyear) + dx]^(timeTrend), or export quantity in long run moves with the shifter factor based on historical FAO data. To calculate this shifter factor, a new parameter, e.g. world_conso_shifter_yr needs to be created and expressed per time-step:

6_scenarios:
PARAMETER
World_Conso_shifter_yr(PRODUCT,ALLSCENYEAR)  

The TRADE_EXO of year t-1 are subsequently stored in a new parameter called TRADE_EXO_Base(REGION,PRODUCT) = TRADE_EXO(REGION,PRODUCT);

This parameter is then shifted with the World_Conso_Shifter_yr in the define_scenario.gms.

Define_scenario.gms:
TRADE_EXO(REGION,PRODUCT)  = TRADE_EXO_Base(REGION,PRODUCT) ;

TRADE_EXO(REGION,PRODUCT) = TRADE_EXO(REGION,PRODUCT) *  World_Conso_shifter_yr(PRODUCT,SCENYEAR) ;