Skip to content
Snippets Groups Projects
Verified Commit 21a8a579 authored by Sébastien Villemot's avatar Sébastien Villemot
Browse files

Various new model editing features

– multiple “model” and “estimated_params” block are supported
– new “model_options” statement to set model options in a global fashion
– new “model_remove” command to remove equations
– new “model_replace” block to replace equations
– new “var_remove” command to remove variables (or parameters)
– new “estimated_params_remove” block to remove estimated parameters
parent f8fc7864
No related branches found
No related tags found
No related merge requests found
...@@ -332,6 +332,11 @@ for declaring variables and parameters are described below. ...@@ -332,6 +332,11 @@ for declaring variables and parameters are described below.
Here, in the whole model file, ``alpha`` and ``beta`` will be Here, in the whole model file, ``alpha`` and ``beta`` will be
endogenous and ``y`` and ``w`` will be parameters. endogenous and ``y`` and ``w`` will be parameters.
.. command:: var_remove VAR_NAME | PARAM_NAME...;
Removes the listed variables (or parameters) from the model. Removing a
variable that has already been used in a model equation or elsewhere will
lead to an error.
.. command:: predetermined_variables VAR_NAME...; .. command:: predetermined_variables VAR_NAME...;
...@@ -972,6 +977,11 @@ The model is declared inside a ``model`` block: ...@@ -972,6 +977,11 @@ The model is declared inside a ``model`` block:
More information on tags is available at `<https://git.dynare.org/Dynare/dynare/-/wikis/Equations-Tags>`__. More information on tags is available at `<https://git.dynare.org/Dynare/dynare/-/wikis/Equations-Tags>`__.
There can be several ``model`` blocks, in which case they are simply
concatenated. The set of effective options is also the concatenation of the
options declared in all the blocks, but in that case you may rather want to
use the :comm:`model_options` command.
*Options* *Options*
.. option:: linear .. option:: linear
...@@ -1131,6 +1141,82 @@ The model is declared inside a ``model`` block: ...@@ -1131,6 +1141,82 @@ The model is declared inside a ``model`` block:
y = d*y(-1)+e_y; y = d*y(-1)+e_y;
end; end;
.. command:: model_options (OPTIONS...);
This command accepts the same options as the :bck:`model` block.
The purpose of this statement is to specify the options that apply to the
whole model, when there are several ``model`` blocks, so as to restore the
symmetry between those blocks (since otherwise one ``model`` block would
typically bear the options, while the other ones would typically have no
option).
.. command:: model_remove (TAGS...);
This command removes equations that appeared in a previous :bck:`model`
block.
The equations must be specified by a list of tag values, separated by
commas. Each element of the list is either a simple quoted string, in which
case it designates an equation by its ``name`` tag; or a tag name (without
quotes), followed by an equal sign, then by the tag value (within quotes).
Each removed equation must either have an ``endogenous`` tag, or have a
left hand side containing a single endogenous variable. The corresponding
endogenous variable will be either turned into an exogenous (if it is still
used in somewhere in the model at that point), otherwise it will be removed
from the model.
*Example*
::
var c k dummy1 dummy2;
model;
c + k - aa*x*k(-1)^alph - (1-delt)*k(-1) + dummy1;
c^(-gam) - (1+bet)^(-1)*(aa*alph*x(+1)*k^(alph-1) + 1 - delt)*c(+1)^(-gam);
[ name = 'eq:dummy1', endogenous = 'dummy1' ]
c*k = dummy1;
[ foo = 'eq:dummy2' ]
log(dummy2) = k + 2;
end;
model_remove('eq:dummy1', foo = 'eq:dummy2');
In the above example, the last two equations will be removed,
``dummy1`` will be turned into an exogenous, and ``dummy2`` will be
removed.
.. block:: model_replace (TAGS...);
This block replaces several equations in the model. It removes the
equations given by the tags list (with the same syntax as in
:comm:`model_remove`), and it adds equations given within the block (with
the same syntax as :bck:`model`).
No variable is removed or has its type changed in the process.
*Example*
::
var c k;
model;
c + k - aa*x*k(-1)^alph - (1-delt)*k(-1);
[ name = 'dummy' ]
c*k = 1;
end;
model_replace('dummy');
c^(-gam) = (1+bet)^(-1)*(aa*alph*x(+1)*k^(alph-1) + 1 - delt)*c(+1)^(-gam);
end;
In the above example, the dummy equation is replaced by a proper
Euler equation.
Dynare has the ability to output the original list of model equations Dynare has the ability to output the original list of model equations
to a LaTeX file, using the ``write_latex_original_model`` to a LaTeX file, using the ``write_latex_original_model``
...@@ -5381,6 +5467,9 @@ block decomposition of the model (see :opt:`block`). ...@@ -5381,6 +5467,9 @@ block decomposition of the model (see :opt:`block`).
end; end;
It is possible to have several ``estimated_params`` blocks, in which case
they will be concatenated.
.. block:: estimated_params_init ; .. block:: estimated_params_init ;
estimated_params_init (OPTIONS...); estimated_params_init (OPTIONS...);
...@@ -5420,6 +5509,14 @@ block decomposition of the model (see :opt:`block`). ...@@ -5420,6 +5509,14 @@ block decomposition of the model (see :opt:`block`).
See :bck:`estimated_params`, for the meaning and syntax of the See :bck:`estimated_params`, for the meaning and syntax of the
various components. various components.
.. block:: estimated_params_remove ;
|br| This block partially undoes the effect of a previous
:bck:`estimated_params` block, by removing some parameters from the estimation.
Each line has the following syntax::
stderr VARIABLE_NAME | corr VARIABLE_NAME_1, VARIABLE_NAME_2 | PARAMETER_NAME;
.. _estim-comm: .. _estim-comm:
......
Subproject commit a73b0d911a6ac6dc4628aca1cd614732d639f555 Subproject commit 5ffbc5bad31c306f561d673cde36d460cb5906c1
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
"smoother2histval" "perfect_foresight_setup" "perfect_foresight_solver" "smoother2histval" "perfect_foresight_setup" "perfect_foresight_solver"
"perfect_foresight_with_expectation_errors_setup" "perfect_foresight_with_expectation_errors_setup"
"perfect_foresight_with_expectation_errors_solver" "perfect_foresight_with_expectation_errors_solver"
"compilation_setup" "compilation_setup" "model_remove" "model_options" "var_remove"
"std" "corr" "prior_function" "posterior_function" "end") "std" "corr" "prior_function" "posterior_function" "end")
"Dynare statement keywords.") "Dynare statement keywords.")
...@@ -98,11 +98,11 @@ ...@@ -98,11 +98,11 @@
(defvar dynare-blocks (defvar dynare-blocks
'("model" "steady_state_model" "initval" "endval" "histval" "shocks" "heteroskedastic_shocks" '("model" "steady_state_model" "initval" "endval" "histval" "shocks" "heteroskedastic_shocks"
"shock_groups" "init2shocks" "mshocks" "estimated_params" "epilogue" "priors" "shock_groups" "init2shocks" "mshocks" "estimated_params" "epilogue" "priors"
"estimated_params_init" "estimated_params_bounds" "osr_params_bounds" "estimated_params_init" "estimated_params_bounds" "estimated_params_remove"
"observation_trends" "deterministic_trends" "optim_weights" "homotopy_setup" "osr_params_bounds" "observation_trends" "deterministic_trends" "optim_weights"
"conditional_forecast_paths" "svar_identification" "moment_calibration" "homotopy_setup" "conditional_forecast_paths" "svar_identification"
"irf_calibration" "ramsey_constraints" "generate_irfs" "moment_calibration" "irf_calibration" "ramsey_constraints" "generate_irfs"
"matched_moments" "occbin_constraints" "verbatim") "matched_moments" "occbin_constraints" "model_replace" "verbatim")
"Dynare block keywords.")) "Dynare block keywords."))
;; Mathematical functions and operators used in model equations (see "hand_side" in Bison file) ;; Mathematical functions and operators used in model equations (see "hand_side" in Bison file)
......
...@@ -49,6 +49,7 @@ MODFILES = \ ...@@ -49,6 +49,7 @@ MODFILES = \
estimation/fs2000_with_weibull_prior.mod \ estimation/fs2000_with_weibull_prior.mod \
estimation/fs2000_initialize_from_calib.mod \ estimation/fs2000_initialize_from_calib.mod \
estimation/fs2000_estimated_params_init.mod \ estimation/fs2000_estimated_params_init.mod \
estimation/fs2000_estimated_params_remove.mod \
estimation/fs2000_calibrated_covariance.mod \ estimation/fs2000_calibrated_covariance.mod \
estimation/fs2000_model_comparison.mod \ estimation/fs2000_model_comparison.mod \
estimation/fs2000_fast.mod \ estimation/fs2000_fast.mod \
...@@ -93,6 +94,7 @@ MODFILES = \ ...@@ -93,6 +94,7 @@ MODFILES = \
ramst_static_tag.mod \ ramst_static_tag.mod \
ramst_static_tag_block.mod \ ramst_static_tag_block.mod \
ramst_mshocks.mod \ ramst_mshocks.mod \
ramst_model_edit.mod \
on-the-fly/ex1.mod \ on-the-fly/ex1.mod \
on-the-fly/ex2.mod \ on-the-fly/ex2.mod \
on-the-fly/ex3.mod \ on-the-fly/ex3.mod \
...@@ -904,6 +906,9 @@ particle/local_state_space_iteration_k_test.o.trs: particle/first_spec.o.trs ...@@ -904,6 +906,9 @@ particle/local_state_space_iteration_k_test.o.trs: particle/first_spec.o.trs
pruning/AS_pruned_state_space_red_shock.m.trs: pruning/AnSchorfheide_pruned_state_space.m.trs pruning/AS_pruned_state_space_red_shock.m.trs: pruning/AnSchorfheide_pruned_state_space.m.trs
pruning/AS_pruned_state_space_red_shock.o.trs: pruning/AnSchorfheide_pruned_state_space.o.trs pruning/AS_pruned_state_space_red_shock.o.trs: pruning/AnSchorfheide_pruned_state_space.o.trs
ramst_model_edit.m.trs: ramst.m.trs
ramst_model_edit.o.trs: ramst.o.trs
observation_trends_and_prefiltering/MCMC: m/observation_trends_and_prefiltering/MCMC o/observation_trends_and_prefiltering/MCMC 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))) 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))) o/observation_trends_and_prefiltering/MCMC: $(patsubst %.mod, %.o.trs, $(filter observation_trends_and_prefiltering/MCMC/%.mod, $(MODFILES)))
......
// Tests multiple estimated_params blocks, and the estimated_params_remove block
var m P c e W R k d n l gy_obs gp_obs y dA;
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;
dA = exp(gam+e_a);
log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m;
-P/(c(+1)*P(+1)*m)+bet*P(+1)*(alp*exp(-alp*(gam+log(e(+1))))*k^(alp-1)*n(+1)^(1-alp)+(1-del)*exp(-(gam+log(e(+1)))))/(c(+2)*P(+2)*m(+1))=0;
W = l/n;
-(psi/(1-psi))*(c*P/(1-n))+l/n = 0;
R = P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(-alp)/W;
1/(c*P)-bet*P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)/(m*l*c(+1)*P(+1)) = 0;
c+k = exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)+(1-del)*exp(-(gam+e_a))*k(-1);
P*c = m;
m-1+d = l;
e = exp(e_a);
y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a));
gy_obs = dA*y/y(-1);
gp_obs = (P/P(-1))*m(-1)/dA;
end;
steady_state_model;
dA = exp(gam);
gst = 1/dA;
m = mst;
khst = ( (1-gst*bet*(1-del)) / (alp*gst^alp*bet) )^(1/(alp-1));
xist = ( ((khst*gst)^alp - (1-gst*(1-del))*khst)/mst )^(-1);
nust = psi*mst^2/( (1-alp)*(1-psi)*bet*gst^alp*khst^alp );
n = xist/(nust+xist);
P = xist + nust;
k = khst*n;
l = psi*mst*n/( (1-psi)*(1-n) );
c = mst/P;
d = l - mst + 1;
y = k^alp*n^(1-alp)*gst^alp;
R = mst/bet;
W = l/n;
ist = y-c;
q = 1 - d;
e = 1;
gp_obs = m/dA;
gy_obs = dA;
end;
shocks;
var e_a; stderr 0.014;
var e_m; stderr 0.005;
end;
steady;
check;
estimated_params;
alp, beta_pdf, 0.356, 0.02;
bet, beta_pdf, 0.993, 0.002;
gam, normal_pdf, 0.0085, 0.003;
mst, normal_pdf, 1.0002, 0.007;
stderr e, normal_pdf, 0, 1;
corr e, m, normal_pdf, 0, 1;
corr e_a, e_m, normal_pdf, 0, 1;
end;
estimated_params_remove;
stderr e;
corr e, m;
corr e_a, e_m;
end;
estimated_params;
rho, beta_pdf, 0.129, 0.223;
psi, beta_pdf, 0.65, 0.05;
del, beta_pdf, 0.01, 0.005;
stderr e_a, inv_gamma_pdf, 0.035449, inf;
stderr e_m, inv_gamma_pdf, 0.008862, inf;
end;
varobs gp_obs gy_obs;
options_.solve_tolf = 1e-12;
estimation(order=1,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=0) y m;
if size(estim_params_.var_exo, 1) ~= 2 || size(estim_params_.param_vals, 1) ~= 7 ...
|| size(estim_params_.var_endo, 1) ~= 0 || size(estim_params_.corrn, 1) ~= 0 ...
|| size(estim_params_.corrx, 1) ~= 0
error('Error in multiple estimated_params or in estimated_params_remove')
end
/* Test for multiple model blocks, model_remove, model_options and var_remove commands,
and model_replace block.
It should give the same results as ramst.mod. */
var c k;
varexo x;
var dummy1 dummy2 dummy3;
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);
end;
model;
[ name = 'eq:dummy1', endogenous = 'dummy1' ]
dummy1 = c + 1;
[ foo = 'eq:dummy2' ] // Since dummy2 is alone on the LHS, it is considered as the variable set by this equation
log(dummy2) = k + 2;
[ name = 'eq:dummy3' ]
c(+1) = c;
end;
model_options(block);
model_remove('eq:dummy1', foo = 'eq:dummy2');
model_replace('eq:dummy3');
c^(-gam) - (1+bet)^(-1)*(aa*alph*x(+1)*k^(alph-1) + 1 - delt)*c(+1)^(-gam);
end;
var_remove dummy3;
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;
S = load('ramst/Output/ramst_results.mat');
if any(size(oo_.endo_simul) ~= size(S.oo_.endo_simul)) || any(any(abs(oo_.endo_simul - S.oo_.endo_simul) > 1e-10))
error('Model editing failure')
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment