Model description#
Background and overview#
Adaptive Regional Input-Output (ARIO) is an I-O model, designed to compute indirect costs from exogenous shocks. Its first version dates back to 2008 and has originally been developed to assess the indirect costs of natural disasters [Hallegatte, 2008]. In this paper we present BoARIO, a generic python implementation, similar to the one described in [Hallegatte, 2013] with some additions (e.g. inspired by [Guan et al., 2020]).
The economy is modelled as a set of economic sectors and a set of regions. In the following, we call an industry a specific (sector, region) couple. Each economic sector produces its generic product and draws inputs from an inventory. Each industry answers to a total demand consisting of a final demand (household consumption, public spending and private investments) coming from all regions (i.e. both local demand and exports), intermediate demand (inventory resupply). An initial equilibrium state of the economy is built based on multi-regional input-output tables (MRIO tables). Apart from parameters specific to the MRIOT region-sector typology, BoARIO supposedly handles any MRIOT in the same manner.
Multiple kinds of shocks can be implemented:
On the production capacity directly (one or multiple industries are arbitrarily forced to produce less)
On the productive capital (one or multiple industries arbitrarily lose some part of their factors of production and are thus forced to both produce less and to build back their capital stock).
On the households (households of affected regions lose some part of their goods and seek to get them back).
The model then describes how exogenous shocks propagates across the economy at each time step (a day in this study): the imbalance between production and demand is resolved by a proportional rationing scheme, which then leads some industries and households to not receive the totality of their orders. Industries can buffer these unfilled orders with their “inventories” of input and increase or shift their resupply demand. Currently, households simply register the loss as final consumption not met and do not postpone their demand. During the simulation, industries adjust their production and orders based on both demand and their inventories.
Direct economic impact consists in the valuation of the initial exogenous shock, while total economic impact includes also indirect costs consequent to the propagation.
Total economic impact can be measured in two ways:
Final demand not met, i.e. goods that households couldn’t buy due to rationing.
Relative production change, i.e. diminished or increased production of industries relative to their initial production.
Notations#
Notation |
Description |
Dimension |
Attribute (argument) name |
---|---|---|---|
\(\sectorsset{} = \{ S_1, \ldots, S_n\}\) |
Set of sectors indices |
\(|\sectorsset| = n\) |
|
\(\regionsset = \{ R_1, \ldots, R_m\}\) |
Set of regions indices (countries) |
\(|\regionsset| = m\) |
|
\(\rfirmsset = \{f^R_1, \ldots, f^R_n\}\) |
Set of industries of country \(R\) (\(f^R_{S}\) is the industry of sector \(S\) of region \(R\)) |
\(|\rfirmsset{}| = n\) |
|
\(\firmsset = \{\rfirmsset{R_1}, \ldots, \rfirmsset{R_{m}}\}\) |
Global set of industries (a sector in a region) indices. |
\(|\firmsset| = n \times m = p\) |
|
\(\ioz^{RR'}\) |
Inter-regional transaction matrix (flows are from region \(R\) to \(R'\) and industry \(f\) to \(f'\)) |
\(\ioz^{RR'} = (z_{ff'}^{RR'})_{\substack{f \in \rfirmsset{R}\\f' \in \rfirmsset{R'}\\(R,R') \in \regionsset}}\) |
|
\(\ioz = \begin{bmatrix} \ioz^{R_1,R_1} & \cdots & \ioz^{R_1,R_m}\\ \vdots & \ddots & \vdots\\ \ioz^{R_m,R_1} & \cdots & \ioz^{R_m,R_m} \end{bmatrix}\) |
Global transaction matrix |
\(\ioz = (z_{ff'})_{f,f' \in \firmsset}\) |
|
\(\ioy^{RR'}\) |
Inter-regional final demand matrix (flow from industry \(f\) of region \(R\) towards final demand of region \(R'\)) |
\(\ioy^{RR'} = (y_{f}^{RR'})_{\substack{f \in \rfirmsset\\(R,R') \in \regionsset}}\) |
|
\(\ioy= \begin{bmatrix} \ioy^{R_1,R_1} & \cdots & \ioy^{R_1,R_m}\\ \vdots & \ddots & \vdots\\ \ioy^{R_m,R_1} & \cdots & \ioy^{R_m,R_m} \end{bmatrix}\) |
Global final demand matrix (total flow from firm indexed by \(f\) toward final demand) |
\(\ioy = (y_{f})_{f \in \firmsset}\) |
|
\(\iov^R = \begin{bmatrix} v^{R}_{1} & \cdots & v^{R}_{n} \end{bmatrix}\) |
Regional value added vector |
\(\iov^R = (v_{f}^R)_{\substack{f \in \rfirmsset{R}\\R \in \regionsset}}\) |
|
\(\iov = \begin{bmatrix} \iov^{R_1} & \cdots & \iov^{R_m}\\ \end{bmatrix}\) |
Global value added vector |
\(\iov = (v_{f})_{f \in \firmsset}\) |
|
\(\iok^R = \begin{bmatrix} k^{R}_{1} & \cdots & k^{R}_{n} \end{bmatrix}\) |
Regional capital stock vector |
\(\iok^R = (k_{f}^R)_{\substack{f \in \rfirmsset{R}\\R \in \regionsset}}\) |
|
\(\iok = \begin{bmatrix} \iok^{R_1} & \cdots & \iok^{R_m}\\ \end{bmatrix}\) |
Global capital stock vector |
\(\iok = (k_{f})_{f \in \firmsset}\) |
|
\(\iox\) |
Production vector |
\(\iox = (x_{f})_{f \in \firmsset}\) |
|
\(\ioa^{RR'}\) |
Inter-regional technical coefficients matrix |
\(\ioa^{RR'} = (a_{f,f'}^{RR'})_{\substack{f \in \rfirmsset{R}\\f' \in \rfirmsset{R'}\\(R,R') \in \regionsset}}\) |
|
\(\ioa= \begin{bmatrix} \ioa^{R_1,R_1} & \cdots & \ioa^{R_1,R_m}\\ \vdots & \ddots & \vdots\\ \ioa^{R_m,R_1} & \cdots & \ioa^{R_m,R_m} \end{bmatrix}\) |
Global technical coefficients matrix |
\(\ioa = (a_{f,f'})_{f,f' \in \firmsset}\) |
|
\(\ioava = (a^{\textrm{va}}_{f})_{f \in \firmsset}\) |
Global value added technical coefficients matrix |
||
\(\ioinv\) |
Inventories/Inputs stock matrix |
\(\ioinv = (\omega^f_{i})_{\substack{f \in \firmsset\\ i \in \sectorsset}}\) |
|
\(\Damage_{\textrm{Tot}} = \begin{bmatrix} \gamma_{1} \cdots \gamma_{p = n \times m} \end{bmatrix}\) |
Per industry capital lost due to event(s) (destroyed or unavaillable) |
scalar |
|
\(\cdot(t)\) |
Value of <\(\cdot\)> at step \(t\), where <\(\cdot\)> can be any scalar, vector or matrix |
||
\(\psi\) |
Inventories heterogeneity parameter |
scalar in \([0,1]\) |
|
\(\alpha^b\) |
Base overproduction capacity (same for all sectors and regions) |
scalar |
|
\(\alpha^{\textrm{max}}\) |
Maximum overproduction capacity |
scalar |
|
\(\tau_{\alpha}\) |
Overproduction increase/decrease characteristic time |
scalar |
|
\(\tau_{\textrm{INV}}\) |
Characteristic time of inventory restoration |
scalar |
|
\(\tau_{\textrm{REBUILD}}\) |
Characteristic time of rebuilding |
scalar |
|
\(\mathbf{s}\) |
Initial/Objective inventory vector |
\(\mathbf{s} = (s_{i})_{i \in \sectorsset}\) |
|
\(\mathbf{\kappa}\) |
Capital stock to value added ratio |
\(\mathbf{\kappa} = (\kappa_{i})_{i \in \sectorsset}\) |
|
Note
We use sets of indices for industries, sectors and regions to simplify the notation of matrix elements. As such we use both \(\sum_{f' \in \firmsset} (z_{ff'})\) and \(\sum_{1 \leq f' \leq p} (z_{ff'})\) to designate the sum of all flows from industry \(f\) (resp. indexed by \(f\)) to other industries.
Note
Additionally, we use \(A = B \odot C\), the Hadamard product (element wise product) (i.e. \(a_{ij} = b_{ij} \cdot c_{ij}\))
Mathematical formalism#
Initial state#
The initial state refers to an economic equilibrium before any exogenous shocks. Initial values for intermediate orders \(\ioorders\), final consumption \(\ioy\), and production \(\iox\) are derived from MRIO tables. Inventories \(\ioinv\) are stocks of inputs an industry can draw into and \(\ioinv(t=0)\) is initialized using the initial intermediate orders \(\ioorders(0) = \ioz\) : by default, it is assumed that every industry has \(\mathbf{s}\) days of inputs ahead in their stocks.
Initial production \(\iox_0\), technical matrix \(\ioa\) and value added technical matrix \(\ioava\) are consistent with Leontief I-O theory:
Where:
\(\mathbf{i}\) is a summation column vector of size \(s \times r\) (number of sectors times regions)
\(\mathbf{\hat{x}_0}\) is the diagonal matrix with the elements of \(\iox_0\)
Note
We divide these yearly values by the iotable_year_to_temporal_unit_factor
parameter in order to obtain an approximation of the productions and demands per temporal unit (most often days).
We also require technology and transactions information at the sector level, regardless of the region of provenance, so we compute the following :
Where :
\(\mathbf{I_{\textrm{sum}}}\) is a row summation matrix which aggregates by sector.
Note
\(\otimes\) is the Kronecker product which repeats each row of \(\ioz^{\sectorsset}\) \(m\) times.
\(\oslash\) is the matrix element-wise division, defined such that dividing by zero gives zero. (If initial order to an industry was null, the share ordered is also null)
Hence, \(\ioa^{\sectorsset}\) and \(\ioz^{\sectorsset}\) are respectfully the technical matrix and the intermediate demand matrix, that are aggregated by sector.
\(\ioz^{\textrm{Share}}\) represents for each firm and for each of their input, the share of the total ordered to a supplier, initially (i.e. \(\ioz\) normalized for each input). Or alternatively, the initial “market shares”.
As stated previously, the initial inventory matrix \(\ioinv\) is initialized as follows :
Such that \(\omega_{if}(0) = s_i \cdot x_{f}(0) \cdot a_{if}\) is the exact amount of product \(i\) required by industry \(f\) to produce \(x_{f}(0)\) (i.e. the initial equilibrium production of \(f\)) during \(s_i\) temporal units. Or, alternatively, that \(f\) could (technically) produce during \(s_i\) temporal units without receiving input from any industry producing \(i\).
As such, all industries start with a stock of each of their intermediate inputs equal to the amount required for \(s_i\) temporal units of production at initial production capacity.
Note
At the moment \(s_i\) does not differ on a per-industry basis, only on a per-product basis.
The order matrix \(\ioorders\) is initialized to be equal to \(\ioz\) :
And where \(o_{ff'}\) is the order made by firm \(f'\) to firm \(f\).
Model dynamics#
Production module#
In ARIO, production is demand-driven, which means production cannot be greater than demand. Another limit is the production capacity, which can change (positively or negatively) either due to a shock (e.g. productive capital destroyed) or due to the overproduction mechanism. Finally production can be constrained by the state of the inventory of inputs of an industry, the general philosophy being that industries will aim to have enough inputs to produce at their current production level for a given number of days, reducing their production level if that is not the case.
Here is how, at each temporal unit \(t\), the vecto of actual (or realised) production for each industry \(f \in \firmsset\), denoted \(\iox^a(t)\), is computed in BoARIO:
Let \(\mathbf{\alpha} = (\alpha_{f})_{f \in \firmsset}\) be the vector of overproduction such that \(\alpha_{f}\) is the overproduction factor of industry \(f\) and let \(\Delta_{f}(t)\) be the initial loss of production capacity of industry \(f_S^R\) : Production capacity of industry \(f\) at step \(t\) before constraints is:
Once we have production capacity, we can compute actual production:
First we compute the total demand directed towards each industry with Eq. \(\text{Total demand matrix}\). Then we compute optimal production without inventory constraints for each industry as the minimum between production capacity (possibly reduced by damages) and total demand, assuming an industry will not produce more than its clients demand (Eq. \(\text{Optimal production}\)).
We define inventory constraints \(\ioinv^{\textrm{Cons}}\) for each input, as a share \(\psi\) of the amount of stocks required to produce \(s_p^f\) temporal units of production at the level of production of the previous step (Eq. \(\text{Inventory constraints}\)).
See also
You can take a look at the documentation of the method
here: calc_production()
(as well as the source code, via the source
button)
Hint
ARIOBaseModel
offers a simplified version of the model where \(\psi = 1\) (among other simplifications).
If the inventory of product \(p \in \sectorsset\) of an industry \(f\) is lower than its required level, then \(f\)’s production is reduced. An inventory shortage of \(x\) % (w.r.t. its constraint) leads to a \(x\) % reduction of production.
Distribution and inventory module#
The distribution module defines how actual production is allocated towards the various demands:
If \(d_f^{\textrm{Tot}}(t) = x_f(t)\), each client receive their order. If \(d_f^{\textrm{Tot}}(t) > x_f(t)\), each client receive a share of their order as per a proportional rationing scheme:
Where \(\damage_f\) is the total rebuilding demand towards industry \(f\) and \(\tau_{\textrm{REBUILD}}\) is the rebuilding characteristic time.
Inventory resupply#
From the received orders (or answered intermediate demand), the model can infer the changes in inputs inventories:
Recovery#
See also
You can take a look at the documentation of the method here: distribute_production()
(as well as the source code, via the source
button)
Order module#
After distribution, the model can compute the orders made by each industries towards their suppliers in order to resupply their inventories of inputs.
Industries seek to restore the inventory of each of their input to their goal level, that is the initial level w.r.t. its current optimal production level (see Production module).
Attention
As such, this goal can vary during simulation as it depends on \(\iox^{\textrm{Opt}}_t\) (and not \(\iox_0\)).
Note
In ARIOBaseModel
, the total order matrix is simply the difference between \(\ioinv^{*}(t)\) and
\(\ioinv(t)\), whereas in ARIOPsiModel
, only a fraction of missing inventories are ordered,
but in addition, the totality of inputs used for production during this step is also ordered.
This difference is highlighted in red in the next equations (the red part is added in the ARIOPsiModel
case)
In Eq. \(\text{Inventory goals}\) we compute inventory goals based on optimal production. (Note that, in the version with
psi
, \(\Omega^* = \frac{\Omega^{\textrm{Cons}}}{\psi}\))In Eq. \(\text{Inventory gaps}\) we compute the inventory gaps. \((\mathbf{A} - \mathbf{B})_{\geq 0}\) denotes the resulting matrix of \(\mathbf{A} - \mathbf{B}\) where negative values are replaced by 0.
In Eq. \(\text{Intermediate total demand orders}\) we compute aggregate orders for intermediate demand.
In Eq. \(\text{Intermediate demand orders}\) we compute the actual order matrix, by distributing total orders along the different suppliers. The model has two variants based on the value of \(\color{green}{\ioz^{\textrm{*}}}\), which are described bellow.
Overproduction module#
In ARIO, industries can temporarily increase their production capacity via an overproduction mechanism: if demand is higher than production, industries start to adapt their production level. We use the same definition as in [Hallegatte, 2013], which uses a scarcity index \(\zeta(t)\):
Event impact#
Currently, the model allows representing the impact of an event via three effects :
A decrease of the production capacity of the impacted industries consequent to the destruction of productive capital.
An additional final demand corresponding to the capital destroyed and addressed towards the rebuilding sectors.
An arbitrary reduction of the production capacity for a given period.
See How to define Events.
Production capacity decrease#
In the following we assume an event happens at \(t=E\), causing \(\Damage_{\textrm{Tot}} = \begin{bmatrix} \gamma_{1} \cdots \gamma_{p} \end{bmatrix}\) damages to the different industries.
We define \(\Delta_{f}(t=E)\), the initial (in the sens when event occurs) loss of production capacity of industry \(f\), as the fraction of its capital destroyed over its capital stock:
Hint
In [Hallegatte, 2013], estimate of the capital stock \(k_f\) of an industry \(f\) is computed by multiplying its value added by its so called capital to value added ratio.
In BoARIO, the default behavior is the same as in [Hallegatte, 2008], i.e. capital is four times higher than value added: \(k_f = 4 \times v_f\). You can also pass a per sector capital to value added ratio as a dictionary, or directly pass your own capital vector (see Changing the model parameters)
We update \(\Delta_f\) during every step according to how much damages remain :