diff --git a/matlab/write_pac_mce_expectations.m b/matlab/write_pac_mce_expectations.m index 05fe8e025083dc05cefb380c2e3285f2bc7ecf1f..9b6767865c439eeeb8d20cd77ba69a6505e4a3aa 100644 --- a/matlab/write_pac_mce_expectations.m +++ b/matlab/write_pac_mce_expectations.m @@ -1,4 +1,4 @@ -function [expression, growthneutralitycorrection] = write_pac_mce_expectations(eqname, expectationmodelname, iscrlf) +function [expression, growthneutralitycorrection] = write_pac_mce_expectations(eqname, expectationmodelname) % Prints the expansion of the PAC_EXPECTATION term in files. % @@ -11,8 +11,7 @@ function [expression, growthneutralitycorrection] = write_pac_mce_expectations(e % - expression [char] Unrolled expectation expression. % - growthneutralitycorrection [char] - -% Copyright © 2019-2023 Dynare Team +% Copyright © 2019-2024 Dynare Team % % This file is part of Dynare. % @@ -31,20 +30,12 @@ function [expression, growthneutralitycorrection] = write_pac_mce_expectations(e global M_ -if nargin<4 - iscrlf = false; -end - expectationmodel = M_.pac.(expectationmodelname); -pacequation = expectationmodel; - -params = M_.params([pacequation.ec.params; pacequation.ar.params(:); expectationmodel.discount_index]); - auxname = sprintf('%s_Z', eqname); -targetid = pacequation.ec.vars((pacequation.ec.istarget==true)); -alphaid = pacequation.mce.alpha; +targetid = expectationmodel.ec.vars((expectationmodel.ec.istarget==true)); +alphaid = expectationmodel.mce.alpha; betaid = expectationmodel.discount_index; target = M_.endo_names{targetid}; @@ -69,9 +60,33 @@ if isauxiliary(targetid) end end + +% In Brayton, Davis and Tulip (2000) the formula for the PAC expectation under Model Consistent Expectations is given as: +% +% ᵐ ᵐ⁻¹ ᵐ⁻¹ +% Zₜ = ∑ 𝛼ᵢ 𝛽ⁱ⁺¹ Zₜ₊ᵢ + A(1) [ 𝛥 yₜ − ∑ ∑ 𝛼ⱼ₊₁𝛽ʲ⁺¹𝛥 yₜ₊ₖ ] +% ᵢ₌₁ ₖ₌₁ ⱼ₌ₖ +% +% where yₜ is the target in the PAC equation, see equation 10 or A.92 in the appendix. The sign before the sum of expected +% Z is incorrect, in the follwing code we define Z as: +% +% ᵐ ᵐ⁻¹ ᵐ⁻¹ +% Zₜ = -∑ 𝛼ᵢ 𝛽ⁱ⁺¹ Zₜ₊ᵢ + A(1) [ 𝛥 yₜ − ∑ ∑ 𝛼ⱼ₊₁𝛽ʲ⁺¹𝛥 yₜ₊ₖ ] +% ᵢ₌₁ ₖ₌₁ ⱼ₌ₖ + expression = ''; A1 = '1'; +% First loop to build +% +% ᵐ +% -∑ 𝛼ᵢ 𝛽ⁱ⁺¹ Zₜ₊ᵢ +% ᵢ₌₁ +% +% ᵐ +% and A(1)=1 + ∑ αᵢ +% ᵢ₌₁ + for i=1:length(alphaid) expression = sprintf('%s-%s*(%s^%i)*%s(%i)', expression, ... M_.param_names{alphaid(i)}, ... @@ -80,11 +95,25 @@ for i=1:length(alphaid) A1 = sprintf('%s+%s', A1, M_.param_names{alphaid(i)}); end +% Write +% +% ᵐ +% -∑ 𝛼ᵢ 𝛽ⁱ⁺¹ Zₜ₊ᵢ + A(1) +% ᵢ₌₁ + + expression = sprintf('%s+(%s)', expression, A1); +% Write +% +% ᵐ +% -∑ 𝛼ᵢ 𝛽ⁱ⁺¹ Zₜ₊ᵢ + A(1) [Δyₜ +% ᵢ₌₁ + if isempty(transformations) expression = sprintf('%s*(diff(%s)', expression, target); else + % Typically the target may be the log of a variable or the first difference of the log of a variable. variable = target; for k=length(transformations):-1:1 variable = sprintf('%s(%s)', transformations{k}, variable); @@ -92,24 +121,32 @@ else expression = sprintf('%s*(diff(%s)', expression, variable); end +% Second loop (for the double sum) to write +% +% ᵐ ᵐ⁻¹ ᵐ⁻¹ +% Zₜ = -∑ 𝛼ᵢ 𝛽ⁱ⁺¹ Zₜ₊ᵢ + A(1) [ 𝛥 yₜ − ∑ ∑ 𝛼ⱼ₊₁𝛽ʲ⁺¹𝛥 yₜ₊ₖ +% ᵢ₌₁ ₖ₌₁ ⱼ₌ₖ + for i=1:length(alphaid)-1 tmp = sprintf('%s*%s^%i', M_.param_names{alphaid(i+1)}, M_.param_names{betaid}, i+1); for j=i+1:length(alphaid)-1 tmp = sprintf('%s+%s*%s^%i', tmp, M_.param_names{alphaid(j+1)}, M_.param_names{betaid}, j+1); end if isempty(transformations) - expression = sprintf('%s+(%s)*diff(%s(%i))', expression, tmp, target, i); + expression = sprintf('%s-(%s)*diff(%s(%i))', expression, tmp, target, i); else variable = sprintf('%s(%i)', target, i); for k=length(transformations):-1:1 variable = sprintf('%s(%s)', transformations{k}, variable); end - expression = sprintf('%s+(%s)*diff(%s(%i))', expression, tmp, variable); + expression = sprintf('%s-(%s)*diff(%s(%i))', expression, tmp, variable); end end +% Close brackets. expression = sprintf('%s)', expression); +% Add growth neutrality correction if required. if isfield(expectationmodel, 'growth_neutrality_param_index') if numel(expectationmodel.growth_linear_comb) == 1 growthneutralitycorrection = sprintf('%s*%s', M_.param_names{expectationmodel.growth_neutrality_param_index}, expectationmodel.growth_str);