From 68b18b04f4902b77362f2b72f64d5348861f1a3e Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer <jpfeifer@gmx.de> Date: Tue, 14 Feb 2017 12:42:13 +0100 Subject: [PATCH] Expand loglinear integration tests (cherry picked from commit 7c17e97546df6ab269be939e6f7e8b32f45b5cc0) --- tests/Makefile.am | 10 ++ tests/loglinear/example4_exp.mod | 16 ++- tests/loglinear/example4_exp_histval.mod | 92 +++++++++++++ tests/loglinear/example4_loglinear.mod | 28 ++++ .../loglinear/example4_loglinear_histval.mod | 124 ++++++++++++++++++ tests/loglinear/results_exp.mat | Bin 6212 -> 0 bytes 6 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 tests/loglinear/example4_exp_histval.mod create mode 100644 tests/loglinear/example4_loglinear_histval.mod delete mode 100644 tests/loglinear/results_exp.mat diff --git a/tests/Makefile.am b/tests/Makefile.am index 874d44a3ba..a7324875a3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -298,9 +298,12 @@ MODFILES = \ gradient/fs2000_numgrad_5.mod \ filter_step_ahead/fs2000_filter_step_ahead_bayesian.mod \ filter_step_ahead/fs2000_filter_step_ahead_ML.mod \ + loglinear/example4_exp.mod \ loglinear/example4_loglinear.mod \ loglinear/example4_loglinear_lagged_exogenous.mod \ loglinear/example4_loglinear_lagged_exogenous_a.mod \ + loglinear/example4_exp_histval.mod \ + loglinear/example4_loglinear_histval.mod \ smoother2histval/fs2000_simul.mod \ smoother2histval/fs2000_smooth.mod \ smoother2histval/fs2000_smooth_stoch_simul.mod \ @@ -463,9 +466,14 @@ deterministic_simulations/multiple_lead_lags/sim_lead_lag.o.trs: deterministic_s deterministic_simulations/multiple_lead_lags/ramst_augmented_histval.m.trs: ramst.m.trs deterministic_simulations/multiple_lead_lags/ramst_augmented_histval.o.trs: ramst.o.trs +loglinear/example4_loglinear.m.trs: loglinear/example4_exp.m.trs +loglinear/example4_loglinear.o.trs: loglinear/example4_exp.o.trs loglinear/example4_loglinear_lagged_exogenous_a.m.trs: loglinear/example4_loglinear_lagged_exogenous.m.trs loglinear/example4_loglinear_lagged_exogenous_a.o.trs: loglinear/example4_loglinear_lagged_exogenous.o.trs +loglinear/example4_loglinear_histval.m.trs: loglinear/example4_exp_histval.m.trs +loglinear/example4_loglinear_histval.o.trs: loglinear/example4_exp_histval.o.trs + observation_trends_and_prefiltering/ML/Trend_loglinear_no_prefilter_first_obs.m.trs: observation_trends_and_prefiltering/ML/Trend_loglinear_no_prefilter.m.trs observation_trends_and_prefiltering/ML/Trend_loglinear_no_prefilter_first_obs.o.trs: observation_trends_and_prefiltering/ML/Trend_loglinear_no_prefilter.o.trs observation_trends_and_prefiltering/ML/Trend_loglinear_no_prefilter.m.trs: observation_trends_and_prefiltering/ML/Trend_no_prefilter.m.trs @@ -964,6 +972,8 @@ clean-local: rm -f initval_file/ramst_initval_file_data_col_vec_mat.mat initval_file/ramst_initval_file_data_row_vec_mat.mat initval_file/ramst_initval_file_excel.xls + rm -f loglinear/results_exp_histval.mat loglinear/results_exp.mat + find . -name "*.tex" -type f -delete find . -name "*.aux" -type f -delete find . -name "*.log" -type f -delete diff --git a/tests/loglinear/example4_exp.mod b/tests/loglinear/example4_exp.mod index e53b68db74..4fd4811bf4 100644 --- a/tests/loglinear/example4_exp.mod +++ b/tests/loglinear/example4_exp.mod @@ -64,5 +64,19 @@ var e, u = phi*0.009*0.009; end; stoch_simul(order=1); +forecast; +conditional_forecast_paths; +var a; +periods 1 2 ; +values 0.01 -0.02; +var b; +periods 1 2; +values 0.05 0; +end; + +conditional_forecast(parameter_set=calibration, controlled_varexo=(u,e)); + oo_exp=oo_; -save results_exp.mat oo_exp +load('conditional_forecasts.mat') +conditional_forecasts_exp=forecasts; +save results_exp.mat oo_exp conditional_forecasts_exp \ No newline at end of file diff --git a/tests/loglinear/example4_exp_histval.mod b/tests/loglinear/example4_exp_histval.mod new file mode 100644 index 0000000000..e07a0a6fbf --- /dev/null +++ b/tests/loglinear/example4_exp_histval.mod @@ -0,0 +1,92 @@ +/* + * Example 1 from F. Collard (2001): "Stochastic simulations with DYNARE: + * A practical guide" (see "guide.pdf" in the documentation directory). + */ + +/* + * Copyright (C) 2001-2016 Dynare Team + * + * This file is part of Dynare. + * + * Dynare is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Dynare is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Dynare. If not, see <http://www.gnu.org/licenses/>. + */ + + +var y, c, k, a, h, b; +varexo e, u; + +parameters beta, rho, alpha, delta, theta, psi, tau; + +alpha = 0.36; +rho = 0.95; +tau = 0.025; +beta = 0.99; +delta = 0.025; +psi = 0; +theta = 2.95; + +phi = 0.1; + +model; +exp(c)*theta*exp(h)^(1+psi)=(1-alpha)*exp(y); +exp(k) = beta*(((exp(b)*exp(c))/(exp(b(+1))*exp(c(+1)))) + *(exp(b(+1))*alpha*exp(y(+1))+(1-delta)*exp(k))); +exp(y) = exp(a)*(exp(k(-1))^alpha)*(exp(h)^(1-alpha)); +exp(k) = exp(b)*(exp(y)-exp(c))+(1-delta)*exp(k(-1)); +a = rho*a(-1)+tau*b(-1) + e; +b = tau*a(-1)+rho*b(-1) + u; +end; + +initval; +y = log(1.08068253095672); +c = log(0.80359242014163); +h = log(0.29175631001732); +k = log(11.08360443260358); +a = 0; +b = 0; +end; +resid(1); +shocks; +var e; stderr 0.009; +var u; stderr 0.009; +var e, u = phi*0.009*0.009; +end; + +histval; +k(0) = log(11.08); +a(0) = log(1.2); +b(0) = log(1); +end; + +stoch_simul(order=1,periods=1000); +forecast; + +forecast; +conditional_forecast_paths; +var a; +periods 1 2 ; +values 0.01 -0.02; +var b; +periods 1 2; +values 0.05 0; +end; + +conditional_forecast(parameter_set=calibration, controlled_varexo=(u,e)); + +oo_exp=oo_; +load('conditional_forecasts.mat') +conditional_forecasts_exp=forecasts; + +oo_exp=oo_; +save results_exp_histval.mat oo_exp conditional_forecasts_exp diff --git a/tests/loglinear/example4_loglinear.mod b/tests/loglinear/example4_loglinear.mod index 482a39e7eb..81f4583a42 100644 --- a/tests/loglinear/example4_loglinear.mod +++ b/tests/loglinear/example4_loglinear.mod @@ -64,6 +64,18 @@ var e, u = phi*0.009*0.009; end; stoch_simul(loglinear,order=1); +forecast; + +conditional_forecast_paths; +var a; +periods 1 2 ; +values 0.01 -0.02; +var b; +periods 1 2; +values 0.05 0; +end; + +conditional_forecast(parameter_set=calibration, controlled_varexo=(u,e)); load results_exp; if max(max(abs(oo_.dr.ghx-oo_exp.dr.ghx)))>1e-10 @@ -99,6 +111,22 @@ for ii=1:length(oo_.autocorr) error('Option loglinear wrong, moments not equal') end end + +if max(max(abs(struct2array(oo_.forecast.Mean)-struct2array(oo_exp.forecast.Mean))))>1e-10 || ... + max(max(abs(struct2array(oo_.forecast.HPDinf)-struct2array(oo_exp.forecast.HPDinf))))>1e-10 || ... + max(max(abs(struct2array(oo_.forecast.HPDsup)-struct2array(oo_exp.forecast.HPDsup))))>1e-10 + error('Option loglinear wrong, forecast not equal') +end + +load('conditional_forecasts.mat') + +if max(max(abs(struct2array(forecasts.cond.Mean)-struct2array(conditional_forecasts_exp.cond.Mean))))>1e-10 || ... + max(max(abs(struct2array(forecasts.cond.ci)-struct2array(conditional_forecasts_exp.cond.ci))))>1e-10 || ... + max(max(abs(struct2array(forecasts.uncond.Mean)-struct2array(conditional_forecasts_exp.uncond.Mean))))>1e-10 || ... + max(max(abs(struct2array(forecasts.uncond.ci)-struct2array(conditional_forecasts_exp.uncond.ci))))>1e-10 + error('Option loglinear wrong, conditional forecast not equal') +end + stoch_simul(loglinear,order=1,periods=100000); if abs(mean(y)-0.0776)>0.02 error('Simulations are wrong') diff --git a/tests/loglinear/example4_loglinear_histval.mod b/tests/loglinear/example4_loglinear_histval.mod new file mode 100644 index 0000000000..752baa8bc3 --- /dev/null +++ b/tests/loglinear/example4_loglinear_histval.mod @@ -0,0 +1,124 @@ +/* + * Example 1 from F. Collard (2001): "Stochastic simulations with DYNARE: + * A practical guide" (see "guide.pdf" in the documentation directory). + */ + +/* + * Copyright (C) 2001-2010 Dynare Team + * + * This file is part of Dynare. + * + * Dynare is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Dynare is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Dynare. If not, see <http://www.gnu.org/licenses/>. + */ + + +var y, c, k, a, h, b; +varexo e, u; + +parameters beta, rho, alpha, delta, theta, psi, tau; + +alpha = 0.36; +rho = 0.95; +tau = 0.025; +beta = 0.99; +delta = 0.025; +psi = 0; +theta = 2.95; + +phi = 0.1; + +model; +c*theta*h^(1+psi)=(1-alpha)*y; +k = beta*(((b*c)/(b(+1)*c(+1))) + *(b(+1)*alpha*y(+1)+(1-delta)*k)); +y = a*(k(-1)^alpha)*(h^(1-alpha)); +k = b*(y-c)+(1-delta)*k(-1); +log(a) = rho*log(a(-1))+tau*log(b(-1)) + e; +log(b) = tau*log(a(-1))+rho*log(b(-1)) + u; +end; + +initval; +y = 1.08068253095672; +c = 0.80359242014163; +h = 0.29175631001732; +k = 11.08360443260358; +a = 1; +b = 1; +end; + +resid(1); +shocks; +var e; stderr 0.009; +var u; stderr 0.009; +var e, u = phi*0.009*0.009; +end; + +histval; +k(0) = 11.08; +a(0) = 1.2; +b(0) = 1; +end; + +stoch_simul(loglinear,order=1,periods=1000); +forecast; + +load results_exp_histval; +if max(max(abs(oo_.dr.ghx-oo_exp.dr.ghx)))>1e-10 + error('Option loglinear wrong, ghx not equal') +end +if max(max(abs(oo_.dr.ghu-oo_exp.dr.ghu)))>1e-10 + error('Option loglinear wrong, ghu not equal') +end +if max(max(abs(oo_.irfs.y_e-oo_exp.irfs.y_e)))>1e-10 + error('Option loglinear wrong, IRFs not equal') +end +if max(max(abs(oo_.irfs.y_u-oo_exp.irfs.y_u)))>1e-10 + error('Option loglinear wrong, ghu not equal') +end +if max(max(abs(oo_.mean-oo_exp.mean)))>1e-10 + error('Option loglinear wrong, mean not equal') +end +if max(max(abs(oo_.dr.ys-oo_exp.dr.ys)))>1e-10 + error('Option loglinear wrong, ys not equal') +end +if max(max(abs(oo_.steady_state-oo_exp.steady_state)))>1e-10 + error('Option loglinear wrong, steady_state not equal') +end + +if max(max(abs(struct2array(oo_.forecast.Mean)-struct2array(oo_exp.forecast.Mean))))>1e-10 || ... + max(max(abs(struct2array(oo_.forecast.HPDinf)-struct2array(oo_exp.forecast.HPDinf))))>1e-10 || ... + max(max(abs(struct2array(oo_.forecast.HPDsup)-struct2array(oo_exp.forecast.HPDsup))))>1e-10 + error('Option loglinear wrong, forecast not equal') +end + +conditional_forecast_paths; +var a; +periods 1 2 ; +values 0.01 -0.02; +var b; +periods 1 2; +values 0.05 0; +end; + +conditional_forecast(parameter_set=calibration, controlled_varexo=(u,e)); + + +load('conditional_forecasts.mat') + +if max(max(abs(struct2array(forecasts.cond.Mean)-struct2array(conditional_forecasts_exp.cond.Mean))))>1e-10 || ... + max(max(abs(struct2array(forecasts.cond.ci)-struct2array(conditional_forecasts_exp.cond.ci))))>1e-10 || ... + max(max(abs(struct2array(forecasts.uncond.Mean)-struct2array(conditional_forecasts_exp.uncond.Mean))))>1e-10 || ... + max(max(abs(struct2array(forecasts.uncond.ci)-struct2array(conditional_forecasts_exp.uncond.ci))))>1e-10 + error('Option loglinear wrong, conditional forecast not equal') +end diff --git a/tests/loglinear/results_exp.mat b/tests/loglinear/results_exp.mat deleted file mode 100644 index fad6d3f8f1d8ff6a74544ef4c6b7783094ffcc13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6212 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 QW`5S!1OFLrE9$-n0NOfhod5s; -- GitLab