From 3b4ef0df49f4e95640f0a790ac201936003d1051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Wed, 30 Mar 2022 18:01:22 +0200 Subject: [PATCH] =?UTF-8?q?Add=20new=20=E2=80=9Clog=E2=80=9D=20option=20to?= =?UTF-8?q?=20=E2=80=9Cvar=E2=80=9D=20statement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ref. #349 --- doc/manual/source/the-model-file.rst | 26 +++++- matlab/subst_auxvar.m | 7 +- preprocessor | 2 +- tests/Makefile.am | 10 ++- tests/log_transform/example1.mod | 50 ++++++++++++ tests/log_transform/fs2000_nonstationary.mod | 78 ++++++++++++++++++ tests/log_transform/nk_ramsey.mod | 85 ++++++++++++++++++++ tests/log_transform/ramst.mod | 51 ++++++++++++ 8 files changed, 302 insertions(+), 7 deletions(-) create mode 100644 tests/log_transform/example1.mod create mode 100644 tests/log_transform/fs2000_nonstationary.mod create mode 100644 tests/log_transform/nk_ramsey.mod create mode 100644 tests/log_transform/ramst.mod diff --git a/doc/manual/source/the-model-file.rst b/doc/manual/source/the-model-file.rst index 6542289c2..8ccd7895c 100644 --- a/doc/manual/source/the-model-file.rst +++ b/doc/manual/source/the-model-file.rst @@ -124,7 +124,9 @@ not recommended as it already denotes the inverse operator. Commands for declaring variables and parameters are described below. .. command:: var VAR_NAME [$TEX_NAME$] [(long_name=QUOTED_STRING|NAME=QUOTED_STRING)]...; + var(log) VAR_NAME [$TEX_NAME$] [(long_name=QUOTED_STRING|NAME=QUOTED_STRING)]...; var(deflator=MODEL_EXPR) VAR_NAME (... same options apply) + var(log, deflator=MODEL_EXPR) VAR_NAME (... same options apply) var(log_deflator=MODEL_EXPR) VAR_NAME (... same options apply) |br| This required command declares the endogenous variables in @@ -138,14 +140,28 @@ for declaring variables and parameters are described below. in the order of declaration, in a column cell array ``M_.endo_names``. - *Options* - If the model is nonstationary and is to be written as such in the ``model`` block, Dynare will need the trend deflator for the appropriate endogenous variables in order to stationarize the model. The trend deflator must be provided alongside the variables that follow this trend. + *Options* + + .. option:: log + + In addition to the endogenous variable(s) thus declared, this option + also triggers the creation of auxiliary variable(s) equal to the log of + the corresponding endogenous variable(s). For example, given a + ``var(log) y`` statement, two endogenous will be created (``y`` and + ``LOG_y``), and an auxiliary equation linking the two will also be + added (equal to ``LOG_y = log(y)``). Moreover, every occurence of ``y`` + in the model will be replaced by ``exp(LOG_y)``. This option is for + example useful when one wants to perform a loglinear approximation of + some variable(s) in the context of a first-order stochastic + approximation; or when one wants to ensure the variable(s) stay(s) in + the definition domain of the function defining the steady state or the + dynamic residuals when the nonlinear solver is used. .. option:: deflator = MODEL_EXPR @@ -155,6 +171,8 @@ for declaring variables and parameters are described below. the ``trend_var, log_trend_var, var`` and ``parameters`` commands. The deflator is assumed to be multiplicative; for an additive deflator, use ``log_deflator``. + This option can be used together with the ``log`` option (the latter + must come first). .. option:: log_deflator = MODEL_EXPR @@ -162,6 +180,10 @@ for declaring variables and parameters are described below. be additive instead of multiplicative (or, to put it otherwise, the declared variable is equal to the log of a variable with a multiplicative trend). + This option cannot be used together with the ``log`` option, because it + would not make much sense from an economic point of view (the + corresponding auxiliary variable would correspond to the log taken + two times on a variable with a multiplicative trend). .. _long-name: diff --git a/matlab/subst_auxvar.m b/matlab/subst_auxvar.m index 43aeff443..488a10070 100644 --- a/matlab/subst_auxvar.m +++ b/matlab/subst_auxvar.m @@ -11,7 +11,7 @@ function str = subst_auxvar(var_index, aux_lead_lag, M_) % OUTPUTS % - str [string] name of auxiliary -% Copyright (C) 2001-2021 Dynare Team +% Copyright (C) 2001-2022 Dynare Team % % This file is part of Dynare. % @@ -61,8 +61,9 @@ if ~isempty(aux_index) end return case 7 - % currently unused - error('This type of auxiliary variable should not occur, please contact the developers.') + % Log-transformation of a variable + str = sprintf('log(%s(%d))', M_.endo_names{M_.aux_vars(aux_index).orig_index}, aux_lead_lag); + return; case 8 % Diff operator str = sprintf('diff(%s)', M_.endo_names{M_.aux_vars(aux_index).orig_index}); diff --git a/preprocessor b/preprocessor index 46cc47266..71edfd05e 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit 46cc47266bac728eeb0758d3b7cff18f841437bb +Subproject commit 71edfd05e4cc28cb3e36e217aaa0e0cbdc030fd2 diff --git a/tests/Makefile.am b/tests/Makefile.am index df950cf4f..fd5c2a426 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -461,7 +461,11 @@ MODFILES = \ bgp/solow-1/solow.mod \ bgp/nk-1/nk.mod \ bgp/ramsey-1/ramsey.mod \ - dynare-command-options/ramst.mod + dynare-command-options/ramst.mod \ + log_transform/example1.mod \ + log_transform/ramst.mod \ + log_transform/fs2000_nonstationary.mod \ + log_transform/nk_ramsey.mod ECB_MODFILES = \ var-expectations/1/example1.mod \ @@ -938,6 +942,10 @@ pruning/AS_pruned_state_space_red_shock.o.trs: pruning/AnSchorfheide_pruned_stat ramst_model_edit.m.trs: ramst.m.trs ramst_model_edit.o.trs: ramst.o.trs +log_transform/ramst.m.trs: ramst.m.trs +log_transform/ramst.o.trs: ramst.o.trs + + observation_trends_and_prefiltering/MCMC: m/observation_trends_and_prefiltering/MCMC o/observation_trends_and_prefiltering/MCMC m/observation_trends_and_prefiltering/MCMC: $(patsubst %.mod, %.m.trs, $(filter observation_trends_and_prefiltering/MCMC/%.mod, $(MODFILES))) o/observation_trends_and_prefiltering/MCMC: $(patsubst %.mod, %.o.trs, $(filter observation_trends_and_prefiltering/MCMC/%.mod, $(MODFILES))) diff --git a/tests/log_transform/example1.mod b/tests/log_transform/example1.mod new file mode 100644 index 000000000..8d0edffa7 --- /dev/null +++ b/tests/log_transform/example1.mod @@ -0,0 +1,50 @@ +// Test for var(log) in a stochastic context + +var(log) c, y, k; +var 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*(((exp(b)*c)/(exp(b(+1))*c(+1))) + *(exp(b(+1))*alpha*y(+1)+(1-delta)*k)); +y = exp(a)*(k(-1)^alpha)*(h^(1-alpha)); +k = exp(b)*(y-c)+(1-delta)*k(-1); +a = rho*a(-1)+tau*b(-1) + e; +b = tau*a(-1)+rho*b(-1) + u; +end; + +initval; +y = 1.08068253095672; +c = 0.80359242014163; +h = 0.29175631001732; +k = 11.08360443260358; +a = 0; +b = 0; +e = 0; +u = 0; +end; + +shocks; +var e; stderr 0.009; +var u; stderr 0.009; +var e, u = phi*0.009*0.009; +end; + +stoch_simul; + +if isempty(strmatch('LOG_y', M_.endo_names)) + error('Log-transformed variable not created') +end diff --git a/tests/log_transform/fs2000_nonstationary.mod b/tests/log_transform/fs2000_nonstationary.mod new file mode 100644 index 000000000..ba26e0421 --- /dev/null +++ b/tests/log_transform/fs2000_nonstationary.mod @@ -0,0 +1,78 @@ +// Test for var(log, deflator=…) + +/* + * Copyright (C) 2004-2022 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 . + */ + +var gM gA; +trend_var(growth_factor=gA) A; +trend_var(growth_factor=gM) M; +var(log, deflator=A) k c y; +var(deflator=M(-1)/A) P; +var(deflator=M(-1)) W l d; +var R n; +varexo e_a e_m; + +parameters alp bet gam mst rho psi del; + +alp = 0.33; +bet = 0.99; +gam = 0.003; +mst = 1.011; +rho = 0.7; +psi = 0.787; +del = 0.02; + +model; +gA = exp(gam+e_a); +log(gM) = (1-rho)*log(mst) + rho*log(gM(-1))+e_m; +c+k = k(-1)^alp*(A*n)^(1-alp)+(1-del)*k(-1); +P*c = M; +P/(c(+1)*P(+1))=bet*P(+1)*(alp*k^(alp-1)*(A(+1)*n(+1))^(1-alp)+(1-del))/(c(+2)*P(+2)); +(psi/(1-psi))*(c*P/(1-n))=W; +R = P*(1-alp)*k(-1)^alp*A^(1-alp)*n^(-alp)/W; +W = l/n; +M-M(-1)+d = l; +1/(c*P)=bet*R/(c(+1)*P(+1)); +y = k(-1)^alp*(A*n)^(1-alp); +end; + +initval; +k = 6; +gM = mst; +P = 2.25; +c = 0.45; +W = 4; +R = 1.02; +d = 0.85; +n = 0.19; +l = 0.86; +y = 0.6; +gA = exp(gam); +end; + +shocks; +var e_a; stderr 0.014; +var e_m; stderr 0.005; +end; + +steady; + +check; + +stoch_simul; diff --git a/tests/log_transform/nk_ramsey.mod b/tests/log_transform/nk_ramsey.mod new file mode 100644 index 000000000..eb6392c60 --- /dev/null +++ b/tests/log_transform/nk_ramsey.mod @@ -0,0 +1,85 @@ +// Tests var(log) in combination with ramsey_model + +//------------------------------------------------------------------------------------------------------------------------ +//1. Variable declaration +//------------------------------------------------------------------------------------------------------------------------ + +var pai, n, r, a; +var(log) c; +//4 variables + 1 shock + +varexo u; + + + + +//------------------------------------------------------------------------------------------------------------------------ +// 2. Parameter declaration and calibration +//------------------------------------------------------------------------------------------------------------------------- + +parameters beta, rho, epsilon, omega, phi, gamma; + +beta=0.99; +gamma=3; //Frish elasticity +omega=17; //price stickyness +epsilon=8; //elasticity for each variety of consumption +phi=1; //coefficient associated to labor effort disutility + +rho=0.95; //coefficient associated to productivity shock + + +//----------------------------------------------------------------------------------------------------------------------- +// 3. The model +//----------------------------------------------------------------------------------------------------------------------- + + +model; + + +a=rho*(a(-1))+u; + +1/c=beta*(1/(c(+1)))*(r/(pai(+1))); //euler + + +omega*pai*(pai-1)=beta*omega*(c/(c(+1)))*(pai(+1))*(pai(+1)-1)+epsilon*exp(a)*n*(c/exp(a)*phi*n^gamma-(epsilon-1)/epsilon); //NK pc +//pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega-exp(a)*n*(epsilon-1)/(omega*c); //NK pc + +(exp(a))*n=c+(omega/2)*((pai-1)^2); + +end; + +//-------------------------------------------------------------------------------------------------------------------------- +// 4. Steady state +//--------------------------------------------------------------------------------------------------------------------------- + +initval; + +pai=1; +r=1/beta; +c=0.9671684882; +n=0.9671684882; +a=0; + + +end; + + + +//--------------------------------------------------------------------------------------------------------------------------- +// 5. shocks +//--------------------------------------------------------------------------------------------------------------------------- + +shocks; +var u; stderr 0.008; + +end; + +//-------------------------------------------------------------------------------------------------------------------------- +// 6. Ramsey problem +//-------------------------------------------------------------------------------------------------------------------------- + +planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma))); + +ramsey_model(planner_discount=0.99, planner_discount_latex_name = $\delta$); +stoch_simul(order=1,irf=20); +evaluate_planner_objective; diff --git a/tests/log_transform/ramst.mod b/tests/log_transform/ramst.mod new file mode 100644 index 000000000..01ce1514d --- /dev/null +++ b/tests/log_transform/ramst.mod @@ -0,0 +1,51 @@ +// Test for var(log) in a deterministic context + +var(log) c k; +varexo x; + +parameters alph gam delt bet aa; +alph=0.5; +gam=0.5; +delt=0.02; +bet=0.05; +aa=0.5; + + +model; +c + k - aa*x*k(-1)^alph - (1-delt)*k(-1); +c^(-gam) - (1+bet)^(-1)*(aa*alph*x(+1)*k^(alph-1) + 1 - delt)*c(+1)^(-gam); +end; + +initval; +x = 1; +k = ((delt+bet)/(1.0*aa*alph))^(1/(alph-1)); +c = aa*k^alph-delt*k; +end; + +steady; + +check; + +shocks; +var x; +periods 1; +values 1.2; +end; + +perfect_foresight_setup(periods=200); +perfect_foresight_solver; + +idx_c = strmatch('c', M_.endo_names); +idx_log_c = strmatch('LOG_c', M_.endo_names); +if isempty(idx_log_c) + error('Log-transformed variable not created') +end + +if max(abs(oo_.endo_simul(idx_log_c, :) - log(oo_.endo_simul(idx_c, :)))) > 1e-7 + error('Transformation not correctly performed') +end + +S = load('../ramst/Output/ramst_results.mat'); +if max(abs(oo_.endo_simul(idx_c, :) - S.oo_.endo_simul(idx_c, :))) > 1e-7 + error('Result differs from non-transformed model') +end