diff --git a/matlab/ols/sur.m b/matlab/ols/sur.m index 1e4c817c2..4838013ce 100644 --- a/matlab/ols/sur.m +++ b/matlab/ols/sur.m @@ -55,6 +55,10 @@ if nargin < 4 else model_name = ['sur_model_number_' num2str(length(fieldnames(oo_.sur)) + 1)]; end +else + if ~isvarname(model_name) + error('the fourth argument, if passed, must be a string') + end end if nargin < 3 @@ -64,7 +68,9 @@ end if nargin < 2 param_names = {}; else - assert(iscellstr(param_names), 'the 2nd argument must be a cellstr'); + if ~iscellstr(param_names) + error('the 2nd argument must be a cellstr') + end end maxit = 100; diff --git a/tests/Makefile.am b/tests/Makefile.am index 920117d2a..9f710ff92 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -423,6 +423,7 @@ MODFILES = \ dynare-command-options/ramst.mod OLS_MODFILES = \ + ecb/SUR/sur_noniterative.mod \ ecb/SUR/panel_var_diff_NB_simulation_test.mod \ ecb/SUR/panel_var_diff_NB_simulation_zero_eq.mod \ ecb/pooled_ols/panel_var_diff_NB_simulation_test.mod \ diff --git a/tests/ecb/SUR/sur_noniterative.mod b/tests/ecb/SUR/sur_noniterative.mod new file mode 100644 index 000000000..edf3ffc43 --- /dev/null +++ b/tests/ecb/SUR/sur_noniterative.mod @@ -0,0 +1,217 @@ +// --+ options: json=compute +-- + +/* REMARK +** ------ +** +** You need to have the first line on top of the mod file. The options defined on this line are passed +** to the dynare command (you can add other options, separated by spaces or commas). The option defined +** here is mandatory for the decomposition. It forces Dynare to output another representation of the +** model in JSON file (additionaly to the matlab files) which is used here to manipulate the equations. +*/ + +var +U2_Q_YED +U2_G_YER +U2_STN +U2_ESTN +U2_EHIC +DE_Q_YED +DE_G_YER +DE_EHIC + +; + +varexo +res_U2_Q_YED +res_U2_G_YER +res_U2_STN +res_U2_ESTN +res_U2_EHIC +res_DE_Q_YED +res_DE_G_YER +res_DE_EHIC +; + +parameters +u2_q_yed_ecm_u2_q_yed_L1 +u2_q_yed_ecm_u2_stn_L1 +u2_q_yed_u2_g_yer_L1 +u2_q_yed_u2_stn_L1 +u2_g_yer_ecm_u2_q_yed_L1 +u2_g_yer_ecm_u2_stn_L1 +u2_g_yer_u2_q_yed_L1 +u2_g_yer_u2_g_yer_L1 +u2_g_yer_u2_stn_L1 +u2_stn_ecm_u2_q_yed_L1 +u2_stn_ecm_u2_stn_L1 +u2_stn_u2_q_yed_L1 +u2_stn_u2_g_yer_L1 +u2_estn_u2_estn_L1 +u2_ehic_u2_ehic_L1 + +de_q_yed_ecm_de_q_yed_L1 +de_q_yed_ecm_u2_stn_L1 +de_q_yed_de_g_yer_L1 +de_q_yed_u2_stn_L1 +de_g_yer_ecm_de_q_yed_L1 +de_g_yer_ecm_u2_stn_L1 +de_g_yer_de_q_yed_L1 +de_g_yer_de_g_yer_L1 +de_g_yer_u2_stn_L1 +de_ehic_de_ehic_L1 + + +; + +u2_q_yed_ecm_u2_q_yed_L1 = -0.82237516589315 ; +u2_q_yed_ecm_u2_stn_L1 = -0.323715338568976 ; +u2_q_yed_u2_g_yer_L1 = 0.0401361895021084 ; +u2_q_yed_u2_stn_L1 = 0.058397703958446 ; +u2_g_yer_ecm_u2_q_yed_L1 = 0.0189896046977421 ; +u2_g_yer_ecm_u2_stn_L1 = -0.109597659887432 ; +u2_g_yer_u2_q_yed_L1 = 0.0037667967632025 ; +u2_g_yer_u2_g_yer_L1 = 0.480506381923644 ; +u2_g_yer_u2_stn_L1 = -0.0722359286123494 ; +u2_stn_ecm_u2_q_yed_L1 = -0.0438500662608356 ; +u2_stn_ecm_u2_stn_L1 = -0.153283917138772 ; +u2_stn_u2_q_yed_L1 = 0.0328744983772825 ; +u2_stn_u2_g_yer_L1 = 0.292121949736756 ; +u2_estn_u2_estn_L1 = 1 ; +u2_ehic_u2_ehic_L1 = 1 ; + +de_q_yed_ecm_de_q_yed_L1 = -0.822375165893149 ; +de_q_yed_ecm_u2_stn_L1 = -0.323715338568977 ; +de_q_yed_de_g_yer_L1 = 0.0401361895021082 ; +de_q_yed_u2_stn_L1 = 0.0583977039584461 ; +de_g_yer_ecm_de_q_yed_L1 = 0.0189896046977422 ; +de_g_yer_ecm_u2_stn_L1 = -0.109597659887433 ; +de_g_yer_de_q_yed_L1 = 0.00376679676320256; +de_g_yer_de_g_yer_L1 = 0.480506381923643 ; +de_g_yer_u2_stn_L1 = -0.0722359286123494 ; +de_ehic_de_ehic_L1 = 1 ; + + +model(linear); +[name = 'eq1'] +diff(U2_Q_YED) = u2_q_yed_ecm_u2_q_yed_L1 * (U2_Q_YED(-1) - U2_EHIC(-1)) + + u2_q_yed_ecm_u2_stn_L1 * (U2_STN(-1) - U2_ESTN(-1)) + + u2_q_yed_u2_g_yer_L1 * diff(U2_G_YER(-1)) + + u2_q_yed_u2_stn_L1 * diff(U2_STN(-1)) + + res_U2_Q_YED ; +[name = 'eq2'] +diff(U2_G_YER) = u2_g_yer_ecm_u2_q_yed_L1 * (U2_Q_YED(-1) - U2_EHIC(-1)) + + u2_g_yer_ecm_u2_stn_L1 * (U2_STN(-1) - U2_ESTN(-1)) + + u2_g_yer_u2_q_yed_L1 * diff(U2_Q_YED(-1)) + + u2_g_yer_u2_g_yer_L1 * diff(U2_G_YER(-1)) + + u2_g_yer_u2_stn_L1 * diff(U2_STN(-1)) + + res_U2_G_YER ; +[name = 'eq3'] +diff(U2_STN) = u2_stn_ecm_u2_q_yed_L1 * (U2_Q_YED(-1) - U2_EHIC(-1)) + + u2_stn_ecm_u2_stn_L1 * (U2_STN(-1) - U2_ESTN(-1)) + + u2_stn_u2_q_yed_L1 * diff(U2_Q_YED(-1)) + + u2_stn_u2_g_yer_L1 * diff(U2_G_YER(-1)) + + res_U2_STN ; +[name = 'eq4'] +U2_ESTN = u2_estn_u2_estn_L1 * U2_ESTN(-1) + + res_U2_ESTN ; +[name = 'eq5'] +U2_EHIC = u2_ehic_u2_ehic_L1 * U2_EHIC(-1) + + res_U2_EHIC ; +[name = 'eq6'] +diff(DE_Q_YED) = de_q_yed_ecm_de_q_yed_L1 * (DE_Q_YED(-1) - DE_EHIC(-1)) + + de_q_yed_ecm_u2_stn_L1 * (U2_STN(-1) - U2_ESTN(-1)) + + de_q_yed_de_g_yer_L1 * diff(DE_G_YER(-1)) + + de_q_yed_u2_stn_L1 * diff(U2_STN(-1)) + + res_DE_Q_YED ; +[name = 'eq7'] +diff(DE_G_YER) = de_g_yer_ecm_de_q_yed_L1 * (DE_Q_YED(-1) - DE_EHIC(-1)) + + de_g_yer_ecm_u2_stn_L1 * (U2_STN(-1) - U2_ESTN(-1)) + + de_g_yer_de_q_yed_L1 * diff(DE_Q_YED(-1)) + + de_g_yer_de_g_yer_L1 * diff(DE_G_YER(-1)) + + de_g_yer_u2_stn_L1 * diff(U2_STN(-1)) + + res_DE_G_YER ; +[name = 'eq8'] +DE_EHIC = DE_EHIC(-1) + res_DE_EHIC ; + + + +end; + +shocks; +var res_U2_Q_YED = 0.005; +var res_U2_G_YER = 0.005; +var res_U2_STN = 0.005; +var res_U2_ESTN = 0.005; +var res_U2_EHIC = 0.005; +var res_DE_Q_YED = 0.005; +var res_DE_G_YER = 0.005; +var res_DE_EHIC = 0.005; +end; + +NSIMS = 1000; + +options_.noprint = 1; +calibrated_values = M_.params; +verbatim; +Sigma_e = M_.Sigma_e; +end; +assert(NSIMS > 1); +options_.bnlms.set_dynare_seed_to_default = false; + +nparampool = length(M_.params); +BETA = zeros(NSIMS, nparampool); +for i=1:NSIMS + firstobs = rand(3, length(M_.endo_names)); + M_.params = calibrated_values; + M_.Sigma_e = Sigma_e; + simdata = simul_backward_model(dseries(firstobs, dates('1995Q1'), M_.endo_names), 10000); + simdata = simdata(simdata.dates(5001:6000)); + names=regexp(simdata.name, 'res\w*'); + idxs = []; + for j=1:length(names) + if isempty(names{j}) + idxs = [idxs j]; + end + end + sur(simdata{idxs}, {}, {}, 'mymodel', true); + BETA(i, :) = M_.params'; +end + +tmp = mean(BETA)' - calibrated_values; +good = [-0.000851256219733 + -0.000643255670073 + -0.000078774226193 + -0.000420026410496 + 0.000262319820667 + -0.000245434738588 + -0.000076193984629 + -0.001732502219600 + -0.001142802053612 + 0.000120684867379 + -0.000577323101449 + -0.000750502207473 + -0.000277709424315 + -0.000622119904600 + -0.000635564841533 + -0.000249342272071 + -0.000443999454424 + -0.000187590389264 + -0.000441672489341 + -0.000015259855753 + 0.000091236076295 + -0.000236028177813 + -0.000838101091676 + 0.000815800740293 + 0]; +if sum(abs(tmp-good)) > 1e-14 + error(['sum of tmp - good was: ' num2str(sum(abs(tmp-good)))]); +end + +for i=1:nparampool + figure + hold on + title(strrep(M_.param_names(i,:), '_', '\_')); + histogram(BETA(:,i),50); + line([calibrated_values(i) calibrated_values(i)], [0 NSIMS/10], 'LineWidth', 2, 'Color', 'r'); + hold off +end