diff --git a/src/@dseries/backcast.m b/src/@dseries/backcast.m new file mode 100644 index 0000000000000000000000000000000000000000..b26b0b943b97d58f15e42e1cd76ef2f98e92c14e --- /dev/null +++ b/src/@dseries/backcast.m @@ -0,0 +1,64 @@ +function q = backcast(o, p, diff) % --*-- Unitary tests --*-- + +% Chains two dseries objects. +% +% INPUTS +% - o [dseries] +% - p [dseries] +% +% OUTPUTS +% - q [dseries] +% +% REMARKS +% The two dseries objects must have common frequency and the same number of variables. Also the +% two samples must overlap. + +% 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/>. + +q = copy(o); +q.backcast_(p); + +return + +%@test:1 + y = ones(10,1); + for i=2:10 + y(i) = 1.1*y(i-1); + end + + ds = dseries(y(6:10), '1990Q1', 'toto'); + ts = dseries(y(1:6), '1988Q4', 'popeye'); + + try + ds = backcast(ds, ts); + t(1) = true; + catch + t(1) = false; + end + + if t(1) + t(2) = dassert(ds.freq,4); + t(3) = dassert(ds.init.freq,4); + t(4) = dassert(ds.init.time,[1988, 4]); + t(5) = dassert(ds.vobs,1); + t(6) = dassert(ds.nobs,10); + t(7) = abs(ds.data(1)-1)<1e-9; + end + + T = all(t); +%@eof:1 \ No newline at end of file diff --git a/src/@dseries/backcast_.m b/src/@dseries/backcast_.m new file mode 100644 index 0000000000000000000000000000000000000000..5020c7c9e1115b1a94453357af4d9cb30cac3124 --- /dev/null +++ b/src/@dseries/backcast_.m @@ -0,0 +1,124 @@ +function o = backcast_(o, p, diff) % --*-- Unitary tests --*-- + +% 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/>. + +if nargin<3 + % By default o is backcasted with growth rates of p. + diff = false; +end + +if ~isequal(vobs(o), vobs(p)) + error('dseries objects must have the same number of variables!') +end + +if ~isequal(frequency(o), frequency(p)) + error('dseries objects must have common frequencies!') +end + +if firstdate(o)>lastdate(p) + error('The first period (%s) in the first dseries object cannot be posterior to the last period (%s) in the second object.\n ==> dseries objects have to overlap.', date2string(o.dates(1)), date2string(o.dates(end))) +end + +if firstdate(o)<=firstdate(p) + error('The first period (%s) in the second dseries object does not preceed the first period (%s) in the first object.\n ==> Cannot backcast first dseries object.', date2string(p.dates(1)), date2string(o.dates(1))) +end + +idp = find(o.dates(1)==p.dates); + +if diff + FirstDifference = p.data(2:idp,:)-p.data(1:idp-1,:); + CumulatedDifferences = cumsum(FirstDifference, 'reverse'); + o.data = [bsxfun(@minus, o.data(1:end), CumulatedDifferences); o.data]; +else + GrowthFactor = p.data(2:idp,:)./p.data(1:idp-1,:); + CumulatedGrowthFactors = cumprod(GrowthFactor, 'reverse'); + o.data = [bsxfun(@rdivide, o.data(1:end), CumulatedGrowthFactors); o.data]; +end + +o.dates = firstdate(p):lastdate(o); + +for i=1:o.vobs + if isempty(o.ops{i}) + arg1 = o.name{i}; + else + arg1 = o.ops{i}; + end + if diff + o.ops(i) = {sprintf('backcast(%s, %s.%s, diff)', arg1, inputname(2), p.name{i})}; + else + o.ops(i) = {sprintf('backcast(%s, %s.%s)', arg1, inputname(2), p.name{i})}; + end +end + +return + +%@test:1 + y = ones(10,1); + for i=2:10 + y(i) = 1.1*y(i-1); + end + + ds = dseries(y(6:10), '1990Q1', 'toto'); + ts = dseries(y(1:6), '1988Q4', 'popeye'); + + try + ds.backcast_(ts); + t(1) = true; + catch + t(1) = false; + end + + if t(1) + t(2) = dassert(ds.freq,4); + t(3) = dassert(ds.init.freq,4); + t(4) = dassert(ds.init.time,[1988, 4]); + t(5) = dassert(ds.vobs,1); + t(6) = dassert(ds.nobs,10); + t(7) = abs(ds.data(1)-1)<1e-9; + end + + T = all(t); +%@eof:1 + +%@test:2 + y = ones(10,1); + for i=2:10 + y(i) = y(i-1) + 1; + end + + ds = dseries(y(6:10), '1990Q1', 'toto'); + ts = dseries(y(1:6), '1988Q4', 'popeye'); + + try + ds.backcast_(ts, true); + t(1) = true; + catch + t(1) = false; + end + + if t(1) + t(2) = dassert(ds.freq,4); + t(3) = dassert(ds.init.freq,4); + t(4) = dassert(ds.init.time,[1988, 4]); + t(5) = dassert(ds.vobs,1); + t(6) = dassert(ds.nobs,10); + t(7) = abs(ds.data(1)-1)<1e-9; + end + + T = all(t); +%@eof:2 \ No newline at end of file diff --git a/src/@dseries/subsref.m b/src/@dseries/subsref.m index 7fe7c592b8f5df4bfe8c4c3ba9780beb85f1e2a5..4a73dafd0548cd59d1ab0c6745121ea14cd9572d 100644 --- a/src/@dseries/subsref.m +++ b/src/@dseries/subsref.m @@ -99,6 +99,7 @@ switch S(1).type 'hptrend','hptrend_', ... 'hpcycle','hpcycle_', ... 'chain','chain_', ... + 'backcast','backcast_', ... 'detrend','detrend_', ... 'exist', ... 'mean', ...