Full prediction pipeline

import BeforeIT as Bit
using Dates, Plots, StatsPlots

We start from loading the calibration object for italy, which contains 4 datasets: calibration_data, figaro, data, and ea. These are saved within BeforeIT.jl for the Italian case, and would need to be appropriately generated for other countries.

cal = Bit.ITALY_CALIBRATION
fieldnames(typeof(cal))
(:calibration, :figaro, :data, :ea, :max_calibration_date, :estimation_date)

These are essentially 4 dictionaries with well defined keys, such as

println(keys(cal.calibration))
println(keys(cal.figaro))
println(keys(cal.data))
println(keys(cal.ea))
["social_benefits", "government_debt_quarterly", "capital_taxes", "interest_government_debt", "dwellings_eu7", "pension_benefits", "nace64_capital_consumption_eu20", "fixed_assets_eu7", "firm_interest", "dwellings", "nominal_nace64_output_eu20", "social_contributions", "nominal_nace64_output", "income_tax", "wages", "employees", "fixed_assets", "firms", "mixed_income", "nominal_nace64_output_eu7", "firm_debt_quarterly", "bank_equity_quarterly", "corporate_tax", "property_income", "household_cash_quarterly", "gross_capitalformation_dwellings", "gross_fixed_capitalformation", "unemployment_benefits", "population", "years_num", "government_deficit", "capital_consumption", "firm_cash_quarterly", "quarters_num", "nace64_capital_consumption"]
["intermediate_consumption", "household_consumption", "capitalformation", "operating_surplus", "compensation_employees", "imports", "government_consumption", "inventory_changes", "exports", "taxes_products_government", "fixed_capitalformation", "taxes_products", "years_num", "quarters_num", "taxes_production", "taxes_products_capitalformation", "taxes_products_household"]
["unemployment_rate", "nominal_nace10_gva_quarterly", "operating_surplus", "nominal_household_consumption_growth_quarterly", "nominal_exports", "real_capitalformation_growth", "household_consumption_deflator", "gdp_deflator_growth", "gva_deflator_quarterly", "capitalformation_deflator_growth", "nominal_final_consumption_growth_quarterly", "real_fixed_capitalformation_growth", "real_exports_growth", "nominal_imports", "nominal_nace10_gva_growth_quarterly", "gdp_deflator_quarterly", "capitalformation_deflator_quarterly", "real_government_consumption_growth_quarterly", "real_final_consumption", "real_capitalformation_quarterly", "nominal_capitalformation_growth", "fixed_capitalformation_deflator", "real_imports_growth", "nace10_gva_deflator", "real_household_consumption_growth", "fixed_capitalformation_deflator_growth", "real_gva", "nominal_final_consumption", "nominal_exports_quarterly", "real_household_consumption", "real_imports_quarterly", "real_nace10_gva_growth", "real_gva_growth_quarterly", "nominal_household_consumption_growth", "nominal_imports_quarterly", "employed_quarterly", "nace10_gva_deflator_growth", "nominal_capitalformation_growth_quarterly", "nace10_gva_deflator_quarterly", "real_government_consumption_growth", "nominal_government_consumption_quarterly", "final_consumption_deflator", "real_capitalformation_growth_quarterly", "compensation_employees", "gva_deflator_growth", "imports_deflator_quarterly", "real_household_consumption_growth_quarterly", "gdp_deflator_growth_quarterly", "nominal_gdp_quarterly", "exports_deflator_growth_quarterly", "government_consumption_deflator_growth_quarterly", "exports_deflator_quarterly", "real_exports_growth_quarterly", "wages", "nominal_nace10_gva", "gdp_deflator", "household_consumption_deflator_growth", "nominal_nace10_gva_growth", "nominal_gdp_growth", "nominal_household_consumption", "fixed_capitalformation_deflator_quarterly", "nominal_exports_growth_quarterly", "wages_quarterly", "nominal_exports_growth", "euribor", "years_num", "real_final_consumption_quarterly", "nominal_gva_quarterly", "quarters_num", "real_capitalformation", "nominal_government_consumption_growth", "real_final_consumption_growth", "nominal_imports_growth", "nominal_government_consumption", "imports_deflator_growth", "nominal_fixed_capitalformation_quarterly", "real_nace10_gva_quarterly", "nominal_final_consumption_quarterly", "compensation_employees_quarterly", "nominal_fixed_capitalformation_growth_quarterly", "real_gdp_growth", "real_government_consumption", "exports_deflator_growth", "nominal_gdp", "imports_deflator_growth_quarterly", "real_nace10_gva", "real_exports_quarterly", "government_consumption_deflator_growth", "real_fixed_capitalformation_growth_quarterly", "nominal_capitalformation_quarterly", "nominal_gdp_growth_quarterly", "employed", "imports_deflator", "euribor_yearly", "fixed_capitalformation_deflator_growth_quarterly", "real_imports", "real_final_consumption_growth_quarterly", "nominal_household_consumption_quarterly", "real_fixed_capitalformation", "household_consumption_deflator_growth_quarterly", "nominal_fixed_capitalformation_growth", "gva_deflator_growth_quarterly", "final_consumption_deflator_growth_quarterly", "unemployment_rate_quarterly", "nominal_gva_growth_quarterly", "nominal_government_consumption_growth_quarterly", "final_consumption_deflator_quarterly", "real_gva_growth", "government_consumption_deflator_quarterly", "real_gdp_growth_quarterly", "exports_deflator", "real_gdp_quarterly", "final_consumption_deflator_growth", "capitalformation_deflator_growth_quarterly", "real_fixed_capitalformation_quarterly", "real_gdp", "nominal_fixed_capitalformation", "real_nace10_gva_growth_quarterly", "nace10_gva_deflator_growth_quarterly", "real_government_consumption_quarterly", "government_consumption_deflator", "nominal_gva_growth", "household_consumption_deflator_quarterly", "real_household_consumption_quarterly", "capitalformation_deflator", "nominal_capitalformation", "operating_surplus_quarterly", "nominal_imports_growth_quarterly", "gva_deflator", "nominal_final_consumption_growth", "real_gva_quarterly", "nominal_gva", "real_imports_growth_quarterly", "real_exports"]
["nominal_nace10_gva_quarterly", "operating_surplus", "nominal_household_consumption_growth_quarterly", "nominal_exports", "real_capitalformation_growth", "household_consumption_deflator", "gdp_deflator_growth", "gva_deflator_quarterly", "capitalformation_deflator_growth", "nominal_final_consumption_growth_quarterly", "real_fixed_capitalformation_growth", "real_exports_growth", "nominal_imports", "nominal_nace10_gva_growth_quarterly", "gdp_deflator_quarterly", "capitalformation_deflator_quarterly", "real_government_consumption_growth_quarterly", "real_final_consumption", "real_capitalformation_quarterly", "nominal_capitalformation_growth", "fixed_capitalformation_deflator", "real_imports_growth", "nace10_gva_deflator", "real_household_consumption_growth", "fixed_capitalformation_deflator_growth", "real_gva", "nominal_final_consumption", "nominal_exports_quarterly", "real_household_consumption", "real_imports_quarterly", "real_nace10_gva_growth", "real_gva_growth_quarterly", "nominal_household_consumption_growth", "nominal_imports_quarterly", "employed_quarterly", "nace10_gva_deflator_growth", "nominal_capitalformation_growth_quarterly", "nace10_gva_deflator_quarterly", "real_government_consumption_growth", "nominal_government_consumption_quarterly", "final_consumption_deflator", "real_capitalformation_growth_quarterly", "compensation_employees", "gva_deflator_growth", "imports_deflator_quarterly", "real_household_consumption_growth_quarterly", "gdp_deflator_growth_quarterly", "nominal_gdp_quarterly", "exports_deflator_growth_quarterly", "government_consumption_deflator_growth_quarterly", "exports_deflator_quarterly", "real_exports_growth_quarterly", "wages", "nominal_nace10_gva", "gdp_deflator", "household_consumption_deflator_growth", "nominal_nace10_gva_growth", "nominal_gdp_growth", "nominal_household_consumption", "fixed_capitalformation_deflator_quarterly", "nominal_exports_growth_quarterly", "wages_quarterly", "nominal_exports_growth", "euribor", "years_num", "real_final_consumption_quarterly", "nominal_gva_quarterly", "quarters_num", "real_capitalformation", "nominal_government_consumption_growth", "real_final_consumption_growth", "nominal_imports_growth", "nominal_government_consumption", "imports_deflator_growth", "nominal_fixed_capitalformation_quarterly", "real_nace10_gva_quarterly", "nominal_final_consumption_quarterly", "compensation_employees_quarterly", "nominal_fixed_capitalformation_growth_quarterly", "real_gdp_growth", "real_government_consumption", "exports_deflator_growth", "nominal_gdp", "imports_deflator_growth_quarterly", "real_nace10_gva", "real_exports_quarterly", "government_consumption_deflator_growth", "real_fixed_capitalformation_growth_quarterly", "nominal_capitalformation_quarterly", "nominal_gdp_growth_quarterly", "employed", "imports_deflator", "euribor_yearly", "fixed_capitalformation_deflator_growth_quarterly", "real_imports", "real_final_consumption_growth_quarterly", "nominal_household_consumption_quarterly", "real_fixed_capitalformation", "household_consumption_deflator_growth_quarterly", "nominal_fixed_capitalformation_growth", "gva_deflator_growth_quarterly", "final_consumption_deflator_growth_quarterly", "nominal_gva_growth_quarterly", "nominal_government_consumption_growth_quarterly", "final_consumption_deflator_quarterly", "real_gva_growth", "government_consumption_deflator_quarterly", "real_gdp_growth_quarterly", "exports_deflator", "real_gdp_quarterly", "final_consumption_deflator_growth", "capitalformation_deflator_growth_quarterly", "real_fixed_capitalformation_quarterly", "real_gdp", "nominal_fixed_capitalformation", "real_nace10_gva_growth_quarterly", "nace10_gva_deflator_growth_quarterly", "real_government_consumption_quarterly", "government_consumption_deflator", "nominal_gva_growth", "household_consumption_deflator_quarterly", "real_household_consumption_quarterly", "capitalformation_deflator", "nominal_capitalformation", "operating_surplus_quarterly", "nominal_imports_growth_quarterly", "gva_deflator", "nominal_final_consumption_growth", "real_gva_quarterly", "nominal_gva", "real_imports_growth_quarterly", "real_exports"]

The object also contains two time variables related to the data

println(cal.max_calibration_date)
println(cal.estimation_date)
2016-12-31T00:00:00
1996-12-31T00:00:00

We can calibrate the model on a specific quarter as follows

calibration_date = DateTime(2014, 03, 31)
parameters, initial_conditions = Bit.get_params_and_initial_conditions(cal, calibration_date; scale = 0.0001)
(Dict{String, Any}("c_E_g" => [0.012978039260418144; 0.0003985263617433438; … ; 0.0006434280333680591; 0.0004140786749482401;;], "C" => [3.77687305167792e-5 0.00012923423608098567 9.45113163679038e-5; 0.00012923423608098567 0.000663491534554835 0.0004584068148673688; 9.45113163679038e-5 0.0004584068148673688 0.0005118635764975763], "xi_pi" => 0.27069145241767517, "H_act" => 2464.0, "tau_SIW" => 0.12024155738392799, "w_s" => [34.19912455801983, 57.23394280739223, 44.771866333452124, 101.48895429083964, 64.62377814311719, 50.34006907590053, 55.862109337399566, 74.97225255201354, 63.965883485264875, 126.60613859988923  …  46.05980851796191, 101.2634324265654, 79.11535733332883, 84.34360135078879, 44.371623144064685, 64.94024492075526, 79.45345332747837, 46.952002203209084, 32.9849990106188, 44.18557952993271], "tau_INC" => 0.21340486996549685, "theta_UB" => 0.3806075386126977, "alpha_pi_EA" => 0.39072957274754566, "tau_SIF" => 0.33721096306965603…), Dict{String, Any}("E_CB" => 1.6491452999999998e6, "D_RoW" => 0.0, "omega" => 0.85, "N_s" => [38.0, 3.0, 2.0, 2.0, 36.0, 47.0, 10.0, 7.0, 8.0, 2.0  …  69.0, 142.0, 144.0, 106.0, 39.0, 11.0, 8.0, 12.0, 3.0, 21.0], "C_E" => [67322.12365514594; 67823.88544540048; … ; 105859.85758989945; 108616.05327341464;;], "K_H" => 2.5717239e6, "L_G" => 2.1878273e6, "Y" => [740219.8317233911, 742847.4777409812, 752860.170165778, 758069.1225361164, 771698.5946316253, 765864.5762888939, 770341.0294728338, 771401.0233309382, 767168.7365424639, 772458.5235747906  …  835263.5233195381, 825781.9707303252, 820098.4004474384, 815900.8164572986, 809854.217499621, 801988.3191442367, 802290.8776734269, 804029.7580115204, 802386.4662197371, 803761.4866782894], "Y_EA_series" => [628870.5450281317, 630475.340350907, 638158.518388488, 643356.7427844908, 650577.939824718, 654769.14461158, 657643.7151794002, 661614.0750498361, 662432.8617287059, 669784.473503791  …  802474.9405035005, 800749.8594232374, 798636.8219048253, 797845.5993283065, 794295.9739309835, 791655.6982331461, 795730.6356437061, 798148.704824881, 800446.3886192822, 803761.4866782892], "Y_EA" => 2.4202567e6…))

We run the model for a number of quarters

T = 20
n_sims = 3
model = Bit.Model(parameters, initial_conditions)
model_vector = Bit.ensemblerun(model, T, n_sims);

We obtain predictions from the model simulations

real_data = cal.data
predictions_dict = Bit.get_predictions_from_sims(Bit.DataVector(model_vector), real_data, calibration_date)
Dict{String, Any} with 107 entries:
  "operating_surplus"       => [7.74594e5 7.74594e5 7.74594e5; 8.26911e5 7.6722…
  "nominal_household_consu… => [0.001 0.001 0.001; 0.0128968 -0.00567744 0.0105…
  "real_exports_growth"     => [0.026 0.026 0.026; -0.0597992 -0.023821 -0.0352…
  "real_capitalformation_g… => [0.01 0.01 0.01; 0.0822691 -0.00483171 0.0499619…
  "nominal_exports"         => [4.73719e5 4.73719e5 4.73719e5; 4.63628e5 4.6959…
  "real_fixed_capitalforma… => [-0.022 -0.022 -0.022; 0.0253106 -0.0230632 0.03…
  "nominal_imports"         => [4.26596e5 4.26596e5 4.26596e5; 4.4545e5 4.38616…
  "gdp_deflator_growth"     => [0.009 0.009 0.009; 0.0401405 0.0146823 0.019584…
  "gva_deflator_quarterly"  => [1.04343 1.04343 1.04343; 1.05036 1.05013 1.0511…
  "household_consumption_d… => [1.07058 1.07058 1.07058; 1.11514 1.08785 1.0931…
  "capitalformation_deflat… => [0.003 0.003 0.003; 0.0510841 0.0253582 0.030311…
  "gdp_deflator_growth_ea_… => [0.00524809 0.00524809 0.00524809; 0.00717803 0.…
  "real_gdp_ea_quarterly"   => [2.42026e6 2.42026e6 2.42026e6; 2.406e6 2.4253e6…
  "gdp_deflator_quarterly"  => [1.05179 1.05179 1.05179; 1.05877 1.05854 1.0595…
  "capitalformation_deflat… => [1.0473 1.0473 1.0473; 1.05426 1.0539 1.05502; ……
  "real_government_consump… => [-0.002 -0.002 -0.002; -0.000580911 -0.0121535 -…
  "fixed_capitalformation_… => [1.03637 1.03637 1.03637; 1.07489 1.04858 1.0536…
  "real_capitalformation_q… => [67250.7 67250.7 67250.7; 68762.5 67288.0 69641.…
  "nominal_capitalformatio… => [0.013 0.013 0.013; 0.137512 0.0203936 0.0818205…
  ⋮                         => ⋮

Finally, we can plot the predictions against the real data

p1 = Bit.plot_model_vs_real(predictions_dict, real_data, "real_gdp_quarterly"; crop = true)
p2 = Bit.plot_model_vs_real(predictions_dict, real_data, "real_household_consumption_quarterly"; crop = true)
p3 = Bit.plot_model_vs_real(predictions_dict, real_data, "real_fixed_capitalformation_quarterly"; crop = true)
p4 = Bit.plot_model_vs_real(predictions_dict, real_data, "real_government_consumption_quarterly"; crop = true)
p5 = Bit.plot_model_vs_real(predictions_dict, real_data, "real_exports_quarterly"; crop = true)
p6 = Bit.plot_model_vs_real(predictions_dict, real_data, "real_imports_quarterly"; crop = true)

plot(p1, p2, p3, p4, p5, p6, layout = (3, 2), legend = false)
Example block output