Added methods to compute yearly and quaterly growth rates and differences (dynSeries).

time-shift
Stéphane Adjemian (Charybdis) 2012-12-19 17:13:52 +01:00
parent e0018f8bca
commit 9dfe2c908f
5 changed files with 457 additions and 1 deletions

101
matlab/@dynSeries/qdiff.m Normal file
View File

@ -0,0 +1,101 @@
function us = qdiff(ts)
%@info:
%! @deftypefn {Function File} {@var{us} =} qdiff (@var{ts})
%! @anchor{qdiff}
%! @sp 1
%! Computes quaterly differences.
%! @sp 2
%! @strong{Inputs}
%! @sp 1
%! @table @var
%! @item ts
%! Dynare time series object, instantiated by @ref{dynSeries}
%! @end table
%! @sp 2
%! @strong{Outputs}
%! @sp 1
%! @table @var
%! @item us
%! Dynare time series object with transformed data field.
%! @end table
%! @end deftypefn
%@eod:
% Copyright (C) 2012 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/>.
% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
us = ts;
switch ts.freq
case 1
error('dynSeries::qgrowth: I cannot compute quaterly differences from yearly data!')
case 4
us.data(2:end,:) = ts.data(2:end,:)-ts.data(1:end-1,:);
us.data(1,:) = NaN;
case 12
us.data(4:end,:) = ts.data(4:end,:)-ts.data(1:end-3,:);
us.data(1:3,:) = NaN;
case 52
error('dynSeries::qgrowth: I do not know yet how to compute quaterly differences from weekly data!')
otherwise
error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
end
%@test:1
%$ t = zeros(2,1);
%$
%$ try
%$ data = transpose(0:1:50);
%$ ts = dynSeries(data,'1950Q1');
%$ ts = ts.qdiff;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ DATA = NaN(1,ts.vobs);
%$ DATA = [DATA; ones(ts.nobs-1,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA,1e-15);
%$ end
%$
%$ T = all(t);
%@eof:1
%@test:2
%$ t = zeros(2,1);
%$
%$ try
%$ data = transpose(0:1:80);
%$ ts = dynSeries(data,'1950M1');
%$ ts = ts.qdiff;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ DATA = NaN(3,ts.vobs);
%$ DATA = [DATA; 3*ones(ts.nobs-3,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA,1e-15);
%$ end
%$
%$ T = all(t);
%@eof:2

101
matlab/@dynSeries/qgrowth.m Normal file
View File

@ -0,0 +1,101 @@
function us = qgrowth(ts)
%@info:
%! @deftypefn {Function File} {@var{us} =} qgrowth (@var{ts})
%! @anchor{qgrowth}
%! @sp 1
%! Computes quaterly growth rates.
%! @sp 2
%! @strong{Inputs}
%! @sp 1
%! @table @var
%! @item ts
%! Dynare time series object, instantiated by @ref{dynSeries}
%! @end table
%! @sp 2
%! @strong{Outputs}
%! @sp 1
%! @table @var
%! @item us
%! Dynare time series object with transformed data field.
%! @end table
%! @end deftypefn
%@eod:
% Copyright (C) 2012 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/>.
% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
us = ts;
switch ts.freq
case 1
error('dynSeries::qgrowth: I cannot compute quaterly growth rates from yearly data!')
case 4
us.data(2:end,:) = ts.data(2:end,:)./ts.data(1:end-1,:) - 1;
us.data(1,:) = NaN;
case 12
us.data(4:end,:) = ts.data(4:end,:)./ts.data(1:end-3,:) - 1;
us.data(1:3,:) = NaN;
case 52
error('dynSeries::qgrowth: I do not know yet how to compute quaterly growth rates from weekly data!')
otherwise
error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
end
%@test:1
%$ t = zeros(2,1);
%$
%$ try
%$ data = (1+.01).^transpose(0:1:50);
%$ ts = dynSeries(data,'1950Q1');
%$ ts = ts.qgrowth;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ DATA = NaN(1,ts.vobs);
%$ DATA = [DATA; .01*ones(ts.nobs-1,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA,1e-15);
%$ end
%$
%$ T = all(t);
%@eof:1
%@test:2
%$ t = zeros(2,1);
%$
%$ try
%$ data = (1+.01).^transpose(0:1:80);
%$ ts = dynSeries(data,'1950M1');
%$ ts = ts.qgrowth;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ DATA = NaN(3,ts.vobs);
%$ DATA = [DATA; (1.01^3-1)*ones(ts.nobs-3,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA,1e-15);
%$ end
%$
%$ T = all(t);
%@eof:2

View File

@ -67,7 +67,7 @@ if length(S)==1 && isequal(S.type,'.')
switch S.subs
case {'data','nobs','vobs','name','tex','freq','time','init'} % Public members.
us = builtin('subsref', ts, S);
case {'log','exp'} % Give "dot access" to public methods.
case {'log','exp','ygrowth','qgrowth','ydiff','qdiff'} % Give "dot access" to public methods.
us = feval(S.subs,ts);
case {'save'}
us = NaN;

127
matlab/@dynSeries/ydiff.m Normal file
View File

@ -0,0 +1,127 @@
function us = ydiff(ts)
%@info:
%! @deftypefn {Function File} {@var{us} =} ydiff (@var{ts})
%! @anchor{ydiff}
%! @sp 1
%! Computes annual differences.
%! @sp 2
%! @strong{Inputs}
%! @sp 1
%! @table @var
%! @item ts
%! Dynare time series object, instantiated by @ref{dynSeries}
%! @end table
%! @sp 2
%! @strong{Outputs}
%! @sp 1
%! @table @var
%! @item us
%! Dynare time series object with transformed data field.
%! @end table
%! @end deftypefn
%@eod:
% Copyright (C) 2012 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/>.
% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
us = ts;
switch ts.freq
case 1
us.data(2:end,:) = ts.data(2:end,:)-ts.data(1:end-1,:);
us.data(1,:) = NaN;
case 4
us.data(5:end,:) = ts.data(5:end,:)-ts.data(1:end-4,:);
us.data(1:4,:) = NaN;
case 12
us.data(13:end,:) = ts.data(13:end,:)-ts.data(1:end-12,:);
us.data(1:12,:) = NaN;
case 52
us.data(53:end,:) = ts.data(53:end,:)-ts.data(1:end-52,:);
us.data(1:52,:) = NaN;
otherwise
error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
end
%@test:1
%$ t = zeros(2,1);
%$
%$ try
%$ data = transpose(1:100);
%$ ts = dynSeries(data,'1950Q1');
%$ ts = ts.ydiff;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$
%$ if length(t)>1
%$ DATA = NaN(4,ts.vobs);
%$ DATA = [DATA; 4*ones(ts.nobs-4,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA);
%$ end
%$
%$ T = all(t);
%@eof:1
%@test:2
%$ t = zeros(2,1);
%$
%$ try
%$ data = transpose(1:100);
%$ ts = dynSeries(data,'1950M1');
%$ ts = ts.ydiff;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$
%$ if length(t)>1
%$ DATA = NaN(12,ts.vobs);
%$ DATA = [DATA; 12*ones(ts.nobs-12,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA);
%$ end
%$
%$ T = all(t);
%@eof:2
%@test:3
%$ t = zeros(2,1);
%$
%$ try
%$ data = transpose(1:100);
%$ ts = dynSeries(data,'1950W1');
%$ ts = ts.ydiff;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$
%$ if length(t)>1
%$ DATA = NaN(52,ts.vobs);
%$ DATA = [DATA; 52*ones(ts.nobs-52,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA);
%$ end
%$
%$ T = all(t);
%@eof:3

127
matlab/@dynSeries/ygrowth.m Normal file
View File

@ -0,0 +1,127 @@
function us = ygrowth(ts)
%@info:
%! @deftypefn {Function File} {@var{us} =} ygrowth (@var{ts})
%! @anchor{ygrowth}
%! @sp 1
%! Computes annual growth rates.
%! @sp 2
%! @strong{Inputs}
%! @sp 1
%! @table @var
%! @item ts
%! Dynare time series object, instantiated by @ref{dynSeries}
%! @end table
%! @sp 2
%! @strong{Outputs}
%! @sp 1
%! @table @var
%! @item us
%! Dynare time series object with transformed data field.
%! @end table
%! @end deftypefn
%@eod:
% Copyright (C) 2012 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/>.
% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
us = ts;
switch ts.freq
case 1
us.data(2:end,:) = ts.data(2:end,:)./ts.data(1:end-1,:) - 1;
us.data(1,:) = NaN;
case 4
us.data(5:end,:) = ts.data(5:end,:)./ts.data(1:end-4,:) - 1;
us.data(1:4,:) = NaN;
case 12
us.data(13:end,:) = ts.data(13:end,:)./ts.data(1:end-12,:) - 1;
us.data(1:12,:) = NaN;
case 52
us.data(53:end,:) = ts.data(53:end,:)./ts.data(1:end-52,:) - 1;
us.data(1:52,:) = NaN;
otherwise
error(['dynSeries::ygrowth: object ' inputname(1) ' has unknown frequency']);
end
%@test:1
%$ t = zeros(2,1);
%$
%$ try
%$ data = repmat(transpose(1:4),100,1);
%$ ts = dynSeries(data,'1950Q1');
%$ ts = ts.ygrowth;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$
%$ if length(t)>1
%$ DATA = NaN(4,ts.vobs);
%$ DATA = [DATA; zeros(ts.nobs-4,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA);
%$ end
%$
%$ T = all(t);
%@eof:1
%@test:2
%$ t = zeros(2,1);
%$
%$ try
%$ data = repmat(transpose(1:12),100,1);
%$ ts = dynSeries(data,'1950M1');
%$ ts = ts.ygrowth;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$
%$ if length(t)>1
%$ DATA = NaN(12,ts.vobs);
%$ DATA = [DATA; zeros(ts.nobs-12,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA);
%$ end
%$
%$ T = all(t);
%@eof:2
%@test:3
%$ t = zeros(2,1);
%$
%$ try
%$ data = repmat(transpose(1:52),100,1);
%$ ts = dynSeries(data,'1950W1');
%$ ts = ts.ygrowth;
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$
%$ if length(t)>1
%$ DATA = NaN(52,ts.vobs);
%$ DATA = [DATA; zeros(ts.nobs-52,ts.vobs)];
%$ t(2) = dyn_assert(ts.data,DATA);
%$ end
%$
%$ T = all(t);
%@eof:3