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
pac-components
Sébastien Villemot 2021-12-15 17:31:46 +01:00
parent f8fc786459
commit 21a8a5794a
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
6 changed files with 274 additions and 7 deletions

View File

@ -332,6 +332,11 @@ for declaring variables and parameters are described below.
Here, in the whole model file, ``alpha`` and ``beta`` will be
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...;
@ -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>`__.
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*
.. option:: linear
@ -1131,6 +1141,82 @@ The model is declared inside a ``model`` block:
y = d*y(-1)+e_y;
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
to a LaTeX file, using the ``write_latex_original_model``
@ -5381,6 +5467,9 @@ block decomposition of the model (see :opt:`block`).
end;
It is possible to have several ``estimated_params`` blocks, in which case
they will be concatenated.
.. block:: estimated_params_init ;
estimated_params_init (OPTIONS...);
@ -5420,6 +5509,14 @@ block decomposition of the model (see :opt:`block`).
See :bck:`estimated_params`, for the meaning and syntax of the
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:

@ -1 +1 @@
Subproject commit a73b0d911a6ac6dc4628aca1cd614732d639f555
Subproject commit 5ffbc5bad31c306f561d673cde36d460cb5906c1

View File

@ -79,7 +79,7 @@
"smoother2histval" "perfect_foresight_setup" "perfect_foresight_solver"
"perfect_foresight_with_expectation_errors_setup"
"perfect_foresight_with_expectation_errors_solver"
"compilation_setup"
"compilation_setup" "model_remove" "model_options" "var_remove"
"std" "corr" "prior_function" "posterior_function" "end")
"Dynare statement keywords.")
@ -98,11 +98,11 @@
(defvar dynare-blocks
'("model" "steady_state_model" "initval" "endval" "histval" "shocks" "heteroskedastic_shocks"
"shock_groups" "init2shocks" "mshocks" "estimated_params" "epilogue" "priors"
"estimated_params_init" "estimated_params_bounds" "osr_params_bounds"
"observation_trends" "deterministic_trends" "optim_weights" "homotopy_setup"
"conditional_forecast_paths" "svar_identification" "moment_calibration"
"irf_calibration" "ramsey_constraints" "generate_irfs"
"matched_moments" "occbin_constraints" "verbatim")
"estimated_params_init" "estimated_params_bounds" "estimated_params_remove"
"osr_params_bounds" "observation_trends" "deterministic_trends" "optim_weights"
"homotopy_setup" "conditional_forecast_paths" "svar_identification"
"moment_calibration" "irf_calibration" "ramsey_constraints" "generate_irfs"
"matched_moments" "occbin_constraints" "model_replace" "verbatim")
"Dynare block keywords."))
;; Mathematical functions and operators used in model equations (see "hand_side" in Bison file)

View File

@ -49,6 +49,7 @@ MODFILES = \
estimation/fs2000_with_weibull_prior.mod \
estimation/fs2000_initialize_from_calib.mod \
estimation/fs2000_estimated_params_init.mod \
estimation/fs2000_estimated_params_remove.mod \
estimation/fs2000_calibrated_covariance.mod \
estimation/fs2000_model_comparison.mod \
estimation/fs2000_fast.mod \
@ -93,6 +94,7 @@ MODFILES = \
ramst_static_tag.mod \
ramst_static_tag_block.mod \
ramst_mshocks.mod \
ramst_model_edit.mod \
on-the-fly/ex1.mod \
on-the-fly/ex2.mod \
on-the-fly/ex3.mod \
@ -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.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
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)))

View File

@ -0,0 +1,103 @@
// 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

View File

@ -0,0 +1,62 @@
/* 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