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.012000081135760385; 0.00032240666778044494; … ; 0.0007405693234072917; 0.0003873919068890285;;], "C" => [3.776873051677981e-5 0.0001292342360815496 9.451131636723291e-5; 0.0001292342360815496 0.0006634915345548323 0.0004584068148662994; 9.451131636723291e-5 0.0004584068148662994 0.0005118635764975716], "xi_pi" => 0.27069145241767517, "H_act" => 2407.0, "tau_SIW" => 0.13125905411026118, "w_s" => [36.61817036798735, 71.91830383430711, 39.99641700580325, 109.47039651707667, 68.5642646528513, 56.367300892420964, 56.58274317188586, 79.62414999032679, 63.546796917949266, 100.22011498484432  …  46.37367531745915, 109.74126321275162, 78.47500882501018, 81.64866984646216, 44.68308489229937, 65.88934004714552, 70.21544934767446, 55.131622585431735, 32.09910959787357, 43.260654001722344], "tau_INC" => 0.23022077785229347, "theta_UB" => 0.3678063012661763, "alpha_pi_EA" => 0.3907295727474996, "tau_SIF" => 0.32866733106913065…), Dict{String, Any}("E_CB" => 1.6491452999999998e6, "D_RoW" => 0.0, "omega" => 0.85, "N_s" => [38.0, 3.0, 2.0, 2.0, 37.0, 43.0, 8.0, 7.0, 7.0, 2.0  …  75.0, 133.0, 141.0, 109.0, 44.0, 11.0, 9.0, 13.0, 3.0, 25.0], "C_E" => [78411.55029920492; 78995.96323389337; … ; 123297.29214420865; 126507.49355703771;;], "K_H" => 2.7681839e6, "L_G" => 2.1878273e6, "Y" => [734713.701620532, 737321.8018758808, 747260.0148220035, 752430.2203657621, 765958.3095431501, 760167.6875843588, 764610.8426417508, 765662.9517285468, 761462.1468332767, 766712.5857498571  …  829050.4100895637, 819639.3860918529, 813998.0930840202, 809831.7328500903, 803830.1115586597, 796022.7237400976, 796323.0316856719, 798048.9773508961, 796417.9091959497, 797782.7015557474], "Y_EA_series" => [624192.6873291301, 625785.5453713072, 633411.5720383556, 638571.1294078865, 645738.6115262785, 649898.6400086763, 652751.8280643593, 656692.6543866992, 657505.350515455, 664802.2772778393  …  796505.7253631696, 794793.4763099054, 792696.1566350177, 791910.8195728554, 788387.5980874739, 785766.9620978376, 789811.5880595791, 792211.6704171936, 794492.2628755281, 797782.7015557474], "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!((deepcopy(model) for _ in 1:n_sims), T);

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.26477e5 7.9238…
  "nominal_household_consu… => [0.001 0.001 0.001; 0.015744 0.0125969 -0.001815…
  "real_exports_growth"     => [0.026 0.026 0.026; -0.0421461 0.022649 -4.54308…
  "real_capitalformation_g… => [0.01 0.01 0.01; 0.088302 0.0400676 0.0340485; ……
  "nominal_exports"         => [4.73719e5 4.73719e5 4.73719e5; 464543.0 4.95329…
  "real_fixed_capitalforma… => [-0.022 -0.022 -0.022; 0.0402975 0.000537339 0.0…
  "nominal_imports"         => [4.26596e5 4.26596e5 4.26596e5; 4.31092e5 4.5947…
  "gdp_deflator_growth"     => [0.009 0.009 0.009; 0.0229796 0.0215714 0.032771…
  "gva_deflator_quarterly"  => [1.04343 1.04343 1.04343; 1.04828 1.04717 1.0555…
  "household_consumption_d… => [1.07058 1.07058 1.07058; 1.09675 1.09524 1.1072…
  "capitalformation_deflat… => [0.003 0.003 0.003; 0.0337427 0.0323197 0.043637…
  "gdp_deflator_growth_ea_… => [0.00524809 0.00524809 0.00524809; 0.00200292 0.…
  "real_gdp_ea_quarterly"   => [2.42026e6 2.42026e6 2.42026e6; 2.42463e6 2.4242…
  "gdp_deflator_quarterly"  => [1.05179 1.05179 1.05179; 1.05667 1.05556 1.0639…
  "capitalformation_deflat… => [1.0473 1.0473 1.0473; 1.05217 1.05106 1.05942; …
  "real_government_consump… => [-0.002 -0.002 -0.002; 0.00104488 -0.00120842 -0…
  "fixed_capitalformation_… => [1.03637 1.03637 1.03637; 1.05715 1.0557 1.06727…
  "real_capitalformation_q… => [67250.7 67250.7 67250.7; 68752.8 69840.4 66414.…
  "nominal_capitalformatio… => [0.013 0.013 0.013; 0.125135 0.0737063 0.0792986…
  ⋮                         => ⋮

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