Fixed growth neutrality correction in presence of exogenous variables.
Also fixes growth neutrality correction in models with non optimizing agents (correction was not taking into account the value of the share of non optimizing agents).time-shift
parent
6997e0a4a6
commit
52eed33c42
|
@ -0,0 +1,22 @@
|
|||
function dummy = get(pacmodel, paceq, kind, id)
|
||||
|
||||
% Copyright (C) 2019 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/>.
|
||||
|
||||
global M_
|
||||
|
||||
dummy = M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{strcmp(paceq, M_.pac.(pacmodel).tag_map(:,1)),2}).(kind).bgp(id);
|
|
@ -0,0 +1,60 @@
|
|||
function dummy = set(pacmodel, paceq, parameter, isnonzeromean)
|
||||
|
||||
% Copyright (C) 2019 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/>.
|
||||
|
||||
global M_
|
||||
|
||||
eqtag = M_.pac.(pacmodel).tag_map{strcmp(paceq, M_.pac.(pacmodel).tag_map(:,1)),2};
|
||||
|
||||
dummy = [];
|
||||
idp = find(strcmp(parameter, M_.param_names));
|
||||
if ~isempty(idp)
|
||||
if isfield(M_.pac.(pacmodel).equations.(eqtag), 'additive') && length(M_.pac.(pacmodel).equations.(eqtag).additive.vars)>1
|
||||
if ~isfield(M_.pac.(pacmodel).equations.(eqtag).additive, 'bgp')
|
||||
M_.pac.(pacmodel).equations.(eqtag).additive.bgp = false(1, length(M_.pac.(pacmodel).equations.(eqtag).additive.params));
|
||||
end
|
||||
[isparam, ip] = ismember(idp, M_.pac.(pacmodel).equations.(eqtag).additive.params);
|
||||
if isparam
|
||||
M_.pac.(pacmodel).equations.(eqtag).additive.bgp(ip) = isnonzeromean;
|
||||
return
|
||||
end
|
||||
end
|
||||
if isfield(M_.pac.(pacmodel).equations.(eqtag), 'optim_additive')
|
||||
if ~isfield(M_.pac.(pacmodel).equations.(eqtag).optim_additive, 'bgp')
|
||||
M_.pac.(pacmodel).equations.(eqtag).optim_additive.bgp = false(1, length(M_.pac.(pacmodel).equations.(eqtag).optim_additive.params));
|
||||
end
|
||||
[isparam, ip] = ismember(idp, M_.pac.(pacmodel).equations.(eqtag).optim_additive.params);
|
||||
if isparam
|
||||
M_.pac.(pacmodel).equations.(eqtag).optim_additive.bgp(ip) = isnonzeromean;
|
||||
return
|
||||
end
|
||||
end
|
||||
if isfield(M_.pac.(pacmodel).equations.(eqtag), 'non_optimizing_behaviour')
|
||||
if ~isfield(M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour, 'bgp')
|
||||
M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.bgp = false(1, length(M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.params));
|
||||
end
|
||||
[isparam, ip] = ismember(idp, M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.params);
|
||||
if isparam
|
||||
M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.bgp(ip) = isnonzeromean;
|
||||
return
|
||||
end
|
||||
end
|
||||
warning('Parameter %s is not associated to an exogenous variable in equation %s.', parameter, paceq)
|
||||
else
|
||||
error('Parameter %s is unknown.', parameter)
|
||||
end
|
|
@ -150,7 +150,50 @@ for e=1:number_of_pac_eq
|
|||
end
|
||||
end
|
||||
% Update the parameter related to the growth neutrality correction.
|
||||
if isfield(equations.(eqtag), 'non_optimizing_behaviour')
|
||||
gamma = DynareModel.params(equations.(eqtag).share_of_optimizing_agents_index);
|
||||
else
|
||||
gamma = 1.0;
|
||||
end
|
||||
if growth_flag
|
||||
DynareModel.params(pacmodel.growth_neutrality_param_index) = growthneutrality;
|
||||
% Growth neutrality as returned by hVector is valid iff
|
||||
% there is no exogenous variables in the model and in the
|
||||
% absence of non optimizing agents.
|
||||
gg = -(growthneutrality-1);
|
||||
cc = 1.0-gamma*gg;
|
||||
if isfield(equations.(eqtag), 'optim_additive')
|
||||
tmp = 0;
|
||||
for i=1:length(equations.(eqtag).optim_additive.params)
|
||||
if isnan(equations.(eqtag).optim_additive.params(i)) && equations.(eqtag).optim_additive.bgp(i)
|
||||
tmp = tmp + equations.(eqtag).optim_additive.scaling_factor(i);
|
||||
elseif ~isnan(equations.(eqtag).optim_additive.params(i)) && equations.(eqtag).optim_additive.bgp(i)
|
||||
tmp = tmp + equations.(eqtag).optim_additive.params(i)*equations.(eqtag).optim_additive.scaling_factor(i);
|
||||
end
|
||||
end
|
||||
cc = cc - gamma*tmp;
|
||||
end
|
||||
if gamma<1
|
||||
tmp = 0;
|
||||
for i=1:length(equations.(eqtag).non_optimizing_behaviour.params)
|
||||
if isnan(equations.(eqtag).non_optimizing_behaviour.params(i)) && equations.(eqtag).non_optimizing_behaviour.bgp(i)
|
||||
tmp = tmp + equations.(eqtag).non_optimizing_behaviour.scaling_factor(i);
|
||||
elseif ~isnan(equations.(eqtag).non_optimizing_behaviour.params(i)) && equations.(eqtag).non_optimizing_behaviour.bgp(i)
|
||||
tmp = tmp + equations.(eqtag).non_optimizing_behaviour.params(i)*equations.(eqtag).non_optimizing_behaviour.scaling_factor(i);
|
||||
end
|
||||
end
|
||||
cc = cc - (1.0-gamma)*tmp;
|
||||
end
|
||||
if isfield(equations.(eqtag), 'additive')
|
||||
tmp = 0;
|
||||
for i=1:length(equations.(eqtag).additive.params)
|
||||
if isnan(equations.(eqtag).additive.params(i)) && equations.(eqtag).additive.bgp(i)
|
||||
tmp = tmp + equations.(eqtag).additive.scaling_factor(i);
|
||||
elseif ~isnan(equations.(eqtag).additive.params(i)) && equations.(eqtag).additive.bgp(i)
|
||||
tmp = tmp + equations.(eqtag).additive.params(i)*equations.(eqtag).additive.scaling_factor(i);
|
||||
end
|
||||
end
|
||||
cc = cc - tmp;
|
||||
end
|
||||
DynareModel.params(pacmodel.growth_neutrality_param_index) = cc;
|
||||
end
|
||||
end
|
|
@ -32,4 +32,17 @@ if isempty(M_.pac.(pacmodel).auxiliary_model_name)
|
|||
else
|
||||
M_.pac.(pacmodel).model_consistent_expectations = false;
|
||||
get_companion_matrix(M_.pac.(pacmodel).auxiliary_model_name, M_.pac.(pacmodel).auxiliary_model_type);
|
||||
end
|
||||
|
||||
% Append default bgp fields if needed.
|
||||
for i=1:rows(M_.pac.(pacmodel).tag_map)
|
||||
if isfield(M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}), 'additive')
|
||||
M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}).additive.bgp = false(1, length(M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}).additive.params));
|
||||
end
|
||||
if isfield(M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}), 'optim_additive')
|
||||
M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}).optim_additive.bgp = false(1, length(M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}).optim_additive.params));
|
||||
end
|
||||
if isfield(M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}), 'non_optimizing_behaviour')
|
||||
M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}).non_optimizing_behaviour.bgp = false(1, length(M_.pac.(pacmodel).equations.(M_.pac.(pacmodel).tag_map{i,2}).non_optimizing_behaviour.params));
|
||||
end
|
||||
end
|
|
@ -433,6 +433,7 @@ MODFILES = \
|
|||
pac/trend-component-23/example.mod \
|
||||
pac/trend-component-24/example.mod \
|
||||
pac/trend-component-25/example.mod \
|
||||
pac/trend-component-26/example.mod \
|
||||
write/example1.mod \
|
||||
ecb/backward-models/irf/solow_1.mod \
|
||||
ecb/backward-models/irf/solow_2.mod \
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/sh
|
||||
|
||||
rm -rf example
|
||||
rm -rf +example
|
||||
rm -f example.log
|
||||
rm -f *.mat
|
||||
rm -f *.m
|
||||
rm -f *.dat
|
|
@ -0,0 +1,142 @@
|
|||
// --+ options: json=compute, stochastic +--
|
||||
|
||||
var x1 x2 x1bar x2bar z y x u v s;
|
||||
|
||||
varexo ex1 ex2 ex1bar ex2bar ez ey ex eu ev es;
|
||||
|
||||
parameters
|
||||
rho_1 rho_2 rho_3 rho_4
|
||||
a_x1_0 a_x1_1 a_x1_2 a_x1_x2_1 a_x1_x2_2
|
||||
a_x2_0 a_x2_1 a_x2_2 a_x2_x1_1 a_x2_x1_2
|
||||
e_c_m c_z_1 c_z_2 c_z_dx2 c_z_u c_z_dv c_z_s cx cy beta
|
||||
lambda;
|
||||
|
||||
rho_1 = .9;
|
||||
rho_2 = -.2;
|
||||
rho_3 = .4;
|
||||
rho_4 = -.3;
|
||||
|
||||
|
||||
a_x1_0 = -.9;
|
||||
a_x1_1 = .4;
|
||||
a_x1_2 = .3;
|
||||
a_x1_x2_1 = .1;
|
||||
a_x1_x2_2 = .2;
|
||||
|
||||
a_x2_0 = -.9;
|
||||
a_x2_1 = .2;
|
||||
a_x2_2 = -.1;
|
||||
a_x2_x1_1 = -.1;
|
||||
a_x2_x1_2 = .2;
|
||||
|
||||
beta = .2;
|
||||
e_c_m = .5;
|
||||
c_z_1 = .2;
|
||||
c_z_2 = -.1;
|
||||
c_z_dx2 = .3;
|
||||
c_z_u = .3;
|
||||
c_z_dv = .4;
|
||||
c_z_s = -.2;
|
||||
cx = 1.0;
|
||||
cy = 1.0;
|
||||
|
||||
|
||||
lambda = 0.5; // Share of optimizing agents.
|
||||
|
||||
trend_component_model(model_name=toto, eqtags=['eq:x1', 'eq:x2', 'eq:x1bar', 'eq:x2bar'], targets=['eq:x1bar', 'eq:x2bar']);
|
||||
|
||||
pac_model(auxiliary_model_name=toto, discount=beta, model_name=pacman);
|
||||
|
||||
model;
|
||||
|
||||
[name='eq:u']
|
||||
s = .3*s(-1) - .1*s(-2) + es;
|
||||
|
||||
[name='eq:diff(v)']
|
||||
diff(v) = .5*diff(v(-1)) + ev;
|
||||
|
||||
[name='eq:u']
|
||||
u = .5*u(-1) - .2*u(-2) + eu;
|
||||
|
||||
[name='eq:y']
|
||||
y = rho_1*y(-1) + rho_2*y(-2) + ey;
|
||||
|
||||
[name='eq:x']
|
||||
x = rho_3*x(-1) + rho_4*x(-2) + ex;
|
||||
|
||||
[name='eq:x1']
|
||||
diff(x1) = a_x1_0*(x1(-1)-x1bar(-1)) + a_x1_1*diff(x1(-1)) + a_x1_2*diff(x1(-2)) + a_x1_x2_1*diff(x2(-1)) + a_x1_x2_2*diff(x2(-2)) + ex1;
|
||||
|
||||
[name='eq:x2']
|
||||
diff(x2) = a_x2_0*(x2(-1)-x2bar(-1)) + a_x2_1*diff(x1(-1)) + a_x2_2*diff(x1(-2)) + a_x2_x1_1*diff(x2(-1)) + a_x2_x1_2*diff(x2(-2)) + ex2;
|
||||
|
||||
[name='eq:x1bar']
|
||||
x1bar = x1bar(-1) + ex1bar;
|
||||
|
||||
[name='eq:x2bar']
|
||||
x2bar = x2bar(-1) + ex2bar;
|
||||
|
||||
[name='zpac']
|
||||
diff(z) = lambda*(e_c_m*(x1(-1)-z(-1)) + c_z_1*diff(z(-1)) + c_z_2*diff(z(-2)) + pac_expectation(pacman) + c_z_s*s + c_z_dv*diff(v) ) + (1-lambda)*( cy*y + cx*x) + c_z_u*u + c_z_dx2*diff(x2) + ez;
|
||||
|
||||
end;
|
||||
|
||||
shocks;
|
||||
var ex1 = 1.0;
|
||||
var ex2 = 1.0;
|
||||
var ex1bar = 1.0;
|
||||
var ex2bar = 1.0;
|
||||
var ez = 1.0;
|
||||
var ey = 0.1;
|
||||
var ex = 0.1;
|
||||
var eu = 0.05;
|
||||
var ev = 0.05;
|
||||
var es = 0.07;
|
||||
end;
|
||||
|
||||
// Initialize the PAC model (build the Companion VAR representation for the auxiliary model).
|
||||
pac.initialize('pacman');
|
||||
|
||||
// Update the parameters of the PAC expectation model (h0 and h1 vectors).
|
||||
pac.update.expectation('pacman');
|
||||
|
||||
// Exogenous variables with non zero mean:
|
||||
pac.bgp.set('pacman', 'zpac', 'c_z_s', true);
|
||||
pac.bgp.set('pacman', 'zpac', 'cx', true);
|
||||
pac.bgp.set('pacman', 'zpac', 'c_z_dx2', true);
|
||||
|
||||
id = find(strcmp('c_z_s', M_.param_names));
|
||||
id = find(id==M_.pac.pacman.equations.eq0.additive.params);
|
||||
if ~pac.bgp.get('pacman', 'zpac', 'additive', id)
|
||||
error('bgp field in additive is wrong.')
|
||||
end
|
||||
|
||||
id = find(strcmp('c_z_dv', M_.param_names));
|
||||
id = find(id==M_.pac.pacman.equations.eq0.additive.params);
|
||||
if pac.bgp.get('pacman', 'zpac', 'additive', id)
|
||||
error('bgp field in additive is wrong.')
|
||||
end
|
||||
|
||||
id = find(strcmp('cx', M_.param_names));
|
||||
id = find(id==M_.pac.pacman.equations.eq0.non_optimizing_behaviour.params);
|
||||
if ~pac.bgp.get('pacman', 'zpac', 'non_optimizing_behaviour', id)
|
||||
error('bgp field in non_optimizing_behaviour is wrong.')
|
||||
end
|
||||
|
||||
id = find(strcmp('cy', M_.param_names));
|
||||
id = find(id==M_.pac.pacman.equations.eq0.non_optimizing_behaviour.params);
|
||||
if pac.bgp.get('pacman', 'zpac', 'non_optimizing_behaviour', id)
|
||||
error('bgp field in non_optimizing_behaviour is wrong.')
|
||||
end
|
||||
|
||||
id = find(strcmp('c_z_dx2', M_.param_names));
|
||||
id = find(id==M_.pac.pacman.equations.eq0.optim_additive.params);
|
||||
if ~pac.bgp.get('pacman', 'zpac', 'optim_additive', id)
|
||||
error('bgp field in optim_additive is wrong.')
|
||||
end
|
||||
|
||||
id = find(strcmp('c_z_u', M_.param_names));
|
||||
id = find(id==M_.pac.pacman.equations.eq0.additive.params);
|
||||
if pac.bgp.get('pacman', 'zpac', 'optim_additive', id)
|
||||
error('bgp field in optim_additive is wrong.')
|
||||
end
|
Loading…
Reference in New Issue