The Germany example is used to test the code of the package. It follows the examples in Eurostat Manual of Supply, Use and Input-Output Tables. by Jörg Beutel (Eurostat Manual).
The germany_1990
dataset is a simplified 6x6 sized SIOT taken from the Eurostat Manual (page 481). It is brought to a long form similar to the Eurostat bulk files. The testthat infrastructure of the iotables package is checking data processing functions and analytical calculations against these published results.
The following data processing functions select and order the data from the Eurostat-type bulk file.
de_use <- use_table_get ( source = "germany_1990", geo = "DE",
year = 1990, unit = "MIO_EUR",
households = FALSE, labelling = "iotables")
de_output <- output_get ( source = "germany_1990", geo = "DE",
year = 1990, unit = "MIO_EUR",
households = FALSE, labelling = "iotables")
print (de_output[c(1:4)])
#> iotables_row agriculture_group manufacturing_group construction_group
#> 16 output_bp 43910 1079446 245606
The input coefficient matrix shows what happens in the whole domestic economy when an industry is facing additional demand, increases production. In the Germany example, all results are rounded to 4 digits for easier comparison with the Eurostat manual.
The input coefficients for domestic intermediates are defined on page 486. You can check the following results against Table 15.8 of the Eurostat manual. (Only the top-right corner of the resulting input coefficient matrix is printed for readability.)
\(\sum_{i=1}^n X_i\)
The input_coefficient_matrix_create()
function relies on the following equation. The numbering of the equations is the numbering of the Eurostat Manual.
It checks the correct ordering of columns, and furthermore it fills up 0 values with 0.000001 to avoid division with zero.
#> iotables_row agriculture_group manufacturing_group
#> 1 agriculture_group 0.0258 0.0236
#> 2 manufacturing_group 0.1806 0.2822
#> 3 construction_group 0.0097 0.0068
Similarly, the output coefficient matrix is
#> iotables_row agriculture_group manufacturing_group
#> 1 agriculture_group 0.0258 0.5803
#> 2 manufacturing_group 0.0073 0.2822
#> 3 construction_group 0.0017 0.0299
The Leontieff matrix is derived from Leontieff equation system.
The Leontieff matrix is defined as (I-A) and it is created with the leontieff_matrix_create()
function.
The Leontieff inverse is (I-A)-1 and it is created with the leontieff_inverse_create()
function from the Leontieff-matrix.
L_de <- leontieff_matrix_create( technology_coefficients_matrix =
de_input_coeff )
I_de <- leontieff_inverse_create(L_de)
print (I_de[,1:3])
#> iotables_row agriculture_group manufacturing_group
#> 1 agriculture_group 1.03390950 0.03501839
#> 2 manufacturing_group 0.28968590 1.42923465
#> 3 construction_group 0.02070433 0.01910180
#> 4 trade_group 0.12698600 0.12146217
#> 5 business_services_group 0.18418167 0.20706399
#> 6 other_services_group 0.04945504 0.02953987
You can check the Leontieff matrix against Table 15.9 on page 487 of the Euorstat manual, and the Leontieff inverse against Table 15.10 on page 488. The ordering of the industries is different in the manual.
Technical indicators assume constant returns to scale and fixed relationship of all inputs to each industry. With these conditions the technical input coefficients show how much input products, labour or capital is required to produce a unit of industry output.
The helper function primary_input_get()
selects a row from the SIOT and brings it to a conforming form. The input_indicator_create()
creates the vector of technical input coefficients.
de_emp <- primary_input_get ( input = "employment_total",
source = "germany_1990", geo = "DE",
year = 1990,
households = FALSE, labelling = "iotables")
de_emp_indicator <- input_indicator_create (de_emp, de_output)
print ( de_emp_indicator[1:4])
#> iotables_row agriculture_group manufacturing_group
#> 19 employment_total_indicator 0.02496015 0.007764168
#> construction_group
#> 19 0.01317557
Often we want to analyze the effect of growing domestic demand on some natural units, such as employment or \(CO_2\) emissions. The only difficulty is that we need data that is aggregated / disaggregated precisely with the same industry breakup as our SIOT table.
European employment statistics have greated detail than our tables, so employment statistics must be aggregated to conform the 60 (61, 62) columns of the SIOT. There is a difference in the columns based on how national statistics offices treat imputed real estate income and household production, and trade margins. Czech SIOTs are smaller than most SIOTS because they do not have these columns and rows.
In another vignette we will show examples on how to work with these real-life data. For the sake of following the calculations, we are continuing with the simplified 1990 German data.
The gva_get()
helper function selects the gross value added row from a SIOT.
de_gva <- gva_get ( source = "germany_1990" )
de_gva_indicator <- input_indicator_create(
input_matrix = de_gva,
output_vector = de_output)
print( de_gva_indicator )
#> iotables_row agriculture_group manufacturing_group
#> 15 gva_bp_indicator 0.4933728 0.3659488
#> construction_group trade_group business_services_group
#> 15 0.4707703 0.5766124 0.5999044
#> other_services_group
#> 15 0.7172413
The input coefficients for value added are created with input_indicator_create
.
This is equal to the equation on page 495 of the Eurostat Manual.
You can create a matrix of input indicators, or direct effects on (final) demand with direct_effects_create()
. The function by default creates input requirements for final demand. With the code below it re-creates the Table 15.14 of the Eurostat manual.
io_table <- iotable_get ()
#Total column should not be missing:
io_table <- io_table [, 1:7]
io_table$total <- rowSums(io_table[, 2:7])
labelled_io_table <- io_table
direct_effects_de <- direct_effects_create ( labelled_io_table = io_table )
print ( direct_effects_de[1:6,1:4])
#> iotables_row agriculture_group manufacturing_group
#> 7 total 0.41528126 0.482855094
#> 8 import_goods_services 0.06665908 0.145169837
#> 9 net_tax_production 0.02468686 0.006026239
#> 10 intermediate_consumption_pp 0.50662719 0.634051171
#> 11 compensation_employees 0.21366431 0.274644586
#> 12 net_tax_production_other -0.04582100 0.001349766
#> construction_group
#> 7 0.468258104
#> 8 0.054668860
#> 9 0.006302778
#> 10 0.529229742
#> 11 0.320916427
#> 12 0.003920914
The ‘total’ row above is labelled as Domestic goods and services in the Eurostat Manual. The table can be found on p498.
The SIOTs contain (with various breakups) three types of income:
Employee wages, which is usually a proxy for all household income.
Gross operating surplus, which is a form of corporate sector income.
Taxes that are the income of government.
These together make gross value added (GVA). If you are working with SIOTs that use basic prices, then GVA = GDP at producers’ prices, or basic prices.
The GVA multiplier shows the additional gross value created in the economy if demand for the industry products is growing with unity. The wage multiplier (not shown here) shows the increase in household income.
The following equation is used to work with different income effects and multipliers:
B = vector of input coefficients for wages or GVA or taxes.
Z = direct and indirect requirements for wages (or other income)
The multiplier_create()
function performs the matrix multiplication, after handling many exceptions and problems with real-life data, such as different missing columns and rows in the national variations of the standard European table.
Please send a bug report on Github if you run into further real-life problems.
de_gva_multiplier <- multiplier_create(
Im = I_de,
input_vector = de_gva_indicator,
multiplier_name = 'gva_multiplier' )
print ( de_gva_multiplier )
#> iotables_row agriculture_group manufacturing_group construction_group
#> 1 gva_multiplier 0.8450443 0.7647388 0.8615076
#> trade_group business_services_group other_services_group
#> 1 0.902019 0.9392779 0.9199705
The indicator shows that manufacturing has the lowest, and other services has the highest gross value added component. This is hardly suprising, because manufacturing needs a lot of materials and imported components. When the demand for manufacturing in the domestic economy is growing by 1 unit, the gross value added is 0.3659488.
You can check these values against the Table 15.16 of the Eurostat Manual on page 501 (row 10).
You can recreate the whole matrix if possible income multipliers with input_multipliers_create()
.
#Total column should not be missing
io_table <- io_table [, 1:7]
io_table$total <- rowSums(io_table[, 2:7])
labelled_io_table <- io_table
direct_effects_de <- direct_effects_create ( labelled_io_table = io_table )
#remove the total column from direct effects to conform with the inverse [,-8]
multipliers <- input_multipliers_create(
direct_effects = direct_effects_de [, -8],
inverse = I_de,
labelled = TRUE)
print (multipliers[1:3, 1:3])
#> iotables_row agriculture_group manufacturing_group
#> 7 total 0.70488246 0.84135154
#> 8 import_goods_services 0.12215911 0.22059291
#> 9 net_tax_production 0.03283655 0.01473759
You can check these results against the Table 15.16 on p501 of the Eurostat manual. Again, the label ‘total’ refers to domestic intermediaries. The ordering of the rows is different from the Manual.
These multipliers are Type-I multipliers. The type-I GVA multiplier shows the total effect in the domestic economy. The initial extra demand creates new orders in the backward linking industries, offers new product to build on in the forward-linking industry and creates new corporate and employee income that can be spent. Type-II multipliers will be introduced in a forthcoming vignette [not yet available.]
The E matrix contains the input coefficients for labor (created by input_indicator_create()
). The following matrix equation defines the employment multipliers.
de_emp <- primary_input_get ( input = "employment_total",
source = "germany_1990", geo = "DE",
year = 1990,
households = FALSE, labelling = "iotables")
de_emp_indicator <- input_indicator_create (de_emp, de_output)
employment_multipliers <- multiplier_create (
input_vector = de_emp_indicator,
Im = I_de,
multiplier_name = "employment_multiplier",
digits = 4 )
print (employment_multipliers)
#> iotables_row agriculture_group manufacturing_group
#> 1 employment_multiplier 0.0326 0.0162
#> construction_group trade_group business_services_group
#> 1 0.0207 0.0237 0.0112
#> other_services_group
#> 1 0.0242
You can check against page 502 in the Eurostat manual that the highest employment multiplier is indeed \(z_i\) = 0.0326, the employment multiplier of agriculture.
For working with real-life, current employment data, there is a helper function to retrieve and process Eurostat employment statistics to a SIOT-conforming vector employment_get()
. This function will be explained in a separate vignette.
Output multipliers and forward linkages are calculated with the help of output coefficients for product as defined on p486 and p495 of the the Eurostat Manual. The Eurostat Manual uses the definition of output at basic prices to define output coefficients which is no longer part of SNA as of SNA2010.
\(x_i\): output of sector i
de_input_coeff <- input_coefficient_matrix_create(
de_use, de_output, digits = 4)
output_multipliers <- output_multiplier_create (
input_coefficient_matrix = de_input_coeff )
print (output_multipliers)
#> iotables_row agriculture_group manufacturing_group
#> 1 output_multipliers 1.704922 1.841421
#> construction_group trade_group business_services_group
#> 1 1.813747 1.603712 1.594974
#> other_services_group
#> 1 1.378375
These multipliers can be checked against the Table 15.15 on p500 of the Eurostat Manual.
When working with the type-II multipliers we need to include the household consumption column and the household earnings row in the tables. The dimensions of the table are growing by 1, so all matrixes and vectors need to be re-created. Not applicable cells, such as gross value added for households is filled up with zero values.
de_use_2 <- use_table_get ( source = "germany_1990", geo = "DE",
year = 1990, unit = "MIO_EUR",
households = TRUE, labelling = "iotables")
de_output_2 <- output_get ( source = "germany_1990", geo = "DE",
year = 1990, unit = "MIO_EUR",
households = TRUE, labelling = "iotables")
gva_de_2 <- gva_get (source = "germany_1990", geo = "DE",
year = 1990, unit = "MIO_EUR",
households = TRUE, labelling = "iotables")
de_input_coeff_2 <- input_coefficient_matrix_create( de_use_2, de_output_2)
gva_indicator_de_2 <- input_indicator_create(
input_matrix = gva_de_2,
output_vector = de_output_2)
L_de_2 <- leontieff_matrix_create( technology_coefficients_matrix =
de_input_coeff_2 )
I_de_2 <- leontieff_inverse_create(L_de_2)
gva_multiplier_2 <- multiplier_create( Im = I_de_2,
input_vector = gva_indicator_de_2)
print ( gva_multiplier_2 )
#> iotables_row agriculture_group manufacturing_group construction_group
#> 1 multiplier 1.347891 1.37633 1.51253
#> trade_group business_services_group other_services_group
#> 1 1.592361 1.3252 1.70378
#> consumption_expenditure_household
#> 1 1.205241
With the induced effects, the type-II multipliers are much larger. The Eurostat Manual does not cover type II multipliers, and this will be covered in a later vignette.
The backward linkages, i.e. demand side linkages, show how much incremental demand is created via suppliers when an industry is facing increased demand and produces more.
Forward linkages on the other hand show the effect of increased production, which gives either more or cheaper supplies for other industries that rely on the output of the given industry.
For example, when a new concert is put on stage, orders are filled for real estate, security services, catering, etc, which show in the backward linkages. The concert attracts visitors that creates new opportunities for the hotelling industry in forward linkages.
Currently iotables
only caclulates backward linkages, but the creation of forward linkages on the basis of output coefficients is simple. Both output coefficients and forward linkages will be added to the package soon.
de_bw <- backward_linkages(I_de)
print (de_bw)
#> iotables_row agriculture_group manufacturing_group
#> 1 backward linkages 1.704922 1.841421
#> construction_group trade_group business_services_group
#> 1 1.813747 1.603712 1.594974
#> other_services_group
#> 1 1.378375
You can check the results against Table 15.19 on page 506 of the Eurostat Manual.
Manufacturing has the highest backward linkages, and other services the least. An increased demand for manufacturing usually effects supplier industries. Service industry usually have a high labor input, and their main effect is increased spending of the wages earned in the services.
Forward linkages show the strength of the new business opportunities when industry i starts to increase its production. Whereas backward linkages show the increased demand of the suppliers in industry i, forward linkages show the increased availability of inputs for other industries that rely on industry i as a supplier.
#You need a table that has a total column and either the total
#intermediate use or final use
#This is usually the case with Eurostat tables, but with the Germany data
#file total must be added.
io_table <- iotable_get ()
io_table <- io_table [1:which(tolower(io_table[,1]) =="total" ), ]
output_bp <- dplyr::select ( io_table, output_bp )
io_table <- io_table [, 1:7]
io_table$total <- rowSums(io_table[, 2:7])
io_table <- cbind (io_table, output_bp)
de_out <- output_coefficient_matrix_create (
io_table, "final_demand", digits = 4
)
forward_linkages ( output_coefficient_matrix = de_out )
#> iotables_row forward_linkages
#> 1 agriculture_group 2.112754
#> 2 manufacturing_group 1.690891
#> 3 construction_group 1.355896
#> 4 trade_group 1.584989
#> 5 business_services_group 2.104036
#> 6 other_services_group 1.210504
#'
You can check forward linkages against the Table 15.20 of Eurostat Manual on page 507.