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
Stéphane Adjemian (Charybdis) 2019-03-11 11:54:53 +01:00
parent 6997e0a4a6
commit 52eed33c42
Signed by untrusted user who does not match committer: stepan
GPG Key ID: A6D44CB9C64CE77B
7 changed files with 290 additions and 1 deletions

22
matlab/+pac/+bgp/get.m Normal file
View File

@ -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);

60
matlab/+pac/+bgp/set.m Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 \

View File

@ -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

View File

@ -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