pooled_ols: support endogenous without parameters on RHS

time-shift
Houtan Bastani 2017-12-05 17:44:23 +01:00 committed by Houtan
parent 3c62bd63cf
commit 8541579d48
5 changed files with 122 additions and 38 deletions

View File

@ -143,36 +143,8 @@ for i = 1:length(lhs)
X = [X Xtmp];
end
lhssub = dseries();
rhs_ = strsplit(rhs{i}, [splitstrings; pnames]);
for j = 1:length(rhs_)
rhsj = rhs_{j};
while ~isempty(rhsj)
minusstr = '';
if strcmp(rhsj(1), '-') || strcmp(rhsj(1), '+')
if length(rhsj) == 1
break
end
if strcmp(rhsj(1), '-')
minusstr = '-';
end
rhsj = rhsj(2:end);
end
str = getStrMoveRight(rhsj);
if ~isempty(str)
try
lhssub = [lhssub eval(regexprep([minusstr str], regex, 'ds.$&'))];
lhssub.rename_(lhssub{lhssub.vobs}.name{:}, [minusstr str]);
catch
if ~any(strcmp(M_exo_trim, str))
error(['dyn_ols: problem evaluating ' minusstr str]);
end
end
rhsj = rhsj(length(str)+1:end);
end
end
end
lhssub = getRhsToSubFromLhs(ds, rhs{i}, regex, [splitstrings; pnames]);
Y = eval(regexprep(lhs{i}, regex, 'ds.$&'));
for j = 1:lhssub.vobs
Y = Y - lhssub{j};

View File

@ -0,0 +1,72 @@
function lhssub = getRhsToSubFromLhs(ds, rhs, regex, splits)
%function lhssub = getRhsToSubFromLhs(ds, rhs, regex, splits)
% Helper function that identifies variables on RHS that need to be
% subtracted from LHS of OLS-style equation
%
% INPUTS
% ds [dseries] data
% rhs [string] RHS as a string
% regex [string] regex expressing valid list of variables
% splits [cell array] strings to split out of equation on RHS
%
% OUTPUTS
% lhssub [dseries] data to subtract from LHS
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2017 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_
assert(isdseries(ds), 'The first argument must be a dseries');
assert(ischar(rhs), 'The second argument must be a string');
assert(ischar(regex), 'The third argument must be a string');
assert(iscell(splits), 'The fourth argument must be a cell');
M_exo_trim = cellstr(M_.exo_names);
lhssub = dseries();
rhs_ = strsplit(rhs, splits);
for j = 1:length(rhs_)
rhsj = rhs_{j};
while ~isempty(rhsj)
minusstr = '';
if strcmp(rhsj(1), '-') || strcmp(rhsj(1), '+')
if length(rhsj) == 1
break
end
if strcmp(rhsj(1), '-')
minusstr = '-';
end
rhsj = rhsj(2:end);
end
str = getStrMoveRight(rhsj);
if ~isempty(str)
try
lhssub = [lhssub eval(regexprep([minusstr str], regex, 'ds.$&'))];
lhssub.rename_(lhssub{lhssub.vobs}.name{:}, [minusstr str]);
catch
if ~any(strcmp(M_exo_trim, str))
error(['pooled_ols: problem evaluating ' minusstr str]);
end
end
rhsj = rhsj(length(str)+1:end);
end
end
end
end

View File

@ -114,6 +114,7 @@ for i = 1:length(lhs)
pnames = intersect(rhs_, M_param_names_trim);
pidxs = zeros(length(pnames), 1);
vnames = cell(1, length(pnames));
splitstrings = cell(length(pnames), 1);
xjdata = dseries;
for j = 1:length(pnames)
createdvar = false;
@ -137,8 +138,14 @@ for i = 1:length(lhs)
getStrMoveRight(rhs{i}(endidx+1:end))];
elseif rhs{i}(startidx) == '*'
vnames{j} = getStrMoveLeft(rhs{i}(1:startidx-1));
splitstrings{j} = [vnames{j} '*' pnames{j}];
elseif rhs{i}(endidx) == '*'
vnames{j} = getStrMoveRight(rhs{i}(endidx+1:end));
splitstrings{j} = [pnames{j} '*' vnames{j}];
if rhs{i}(startidx) == '-'
vnames{j} = ['-' vnames{j}];
splitstrings{j} = ['-' splitstrings{j}];
end
elseif rhs{i}(startidx) == '+' ...
|| rhs{i}(startidx) == '-' ...
|| rhs{i}(endidx) == '+' ...
@ -152,6 +159,7 @@ for i = 1:length(lhs)
else
vnames{j} = 'intercept';
end
splitstrings{j} = vnames{j};
else
error('pooled_ols: Shouldn''t arrive here');
end
@ -165,6 +173,8 @@ for i = 1:length(lhs)
xjdata = [xjdata xjdatatmp];
end
lhssub = getRhsToSubFromLhs(ds, rhs{i}, regex, [splitstrings; pnames]);
residuals = intersect(rhs_, cellstr(M_.exo_names));
justvnames = regexprep(vnames, '\(-\d\)|log|exp|log10|[\(\)]', '');
justvnames = regexp(justvnames, '[-+]', 'split');
@ -183,15 +193,29 @@ for i = 1:length(lhs)
vars{i} = [vnames{:}];
ydata = eval(regexprep(lhs{i}, regex, 'ds.$&'));
for j = 1:lhssub.vobs
ydata = ydata - lhssub{j};
end
fp = max(ydata.firstobservedperiod, xjdata.firstobservedperiod);
lp = min(ydata.lastobservedperiod, xjdata.lastobservedperiod);
startidxs(i) = length(Y) + 1;
startdates{i} = fp;
enddates{i} = lp;
Y(startidxs(i):startidxs(i)+lp-fp, 1) = ydata(fp:lp).data;
X(startidxs(i):startidxs(i)+lp-fp, pidxs) = xjdata(fp:lp).data;
if isempty(xjdata)
% AR(1) case
fp = ydata.firstobservedperiod;
lp = ydata.lastobservedperiod;
startidxs(i) = length(Y) + 1;
startdates{i} = fp;
enddates{i} = lp;
Y(startidxs(i):startidxs(i)+lp-fp, 1) = ydata(fp:lp).data;
X(startidxs(i):startidxs(i)+lp-fp, :) = zeros(ydata(fp:lp).nobs, columns(X));
else
fp = max(ydata.firstobservedperiod, xjdata.firstobservedperiod);
lp = min(ydata.lastobservedperiod, xjdata.lastobservedperiod);
startidxs(i) = length(Y) + 1;
startdates{i} = fp;
enddates{i} = lp;
Y(startidxs(i):startidxs(i)+lp-fp, 1) = ydata(fp:lp).data;
X(startidxs(i):startidxs(i)+lp-fp, pidxs) = xjdata(fp:lp).data;
end
end
if overlapping_dates

View File

@ -19,6 +19,14 @@ for i=1:NSIMS
M_.Sigma_e = Sigma_e;
simdata = simul_backward_model(dseries(firstobs, dates('1995Q1'), M_endo_names_trim), 10000);
simdata = simdata(simdata.dates(5001:6000));
names=regexp(simdata.name, 'res\w*');
idxs = [];
for i=1:length(names)
if isempty(names{i})
idxs = [idxs i];
end
end
simdata = simdata{idxs};
pooled_fgls(simdata, ...
{'de','u2'}, ...
{'*_q_yed_ecm_*_q_yed_L1', ...

View File

@ -19,6 +19,14 @@ for i=1:NSIMS
M_.Sigma_e = Sigma_e;
simdata = simul_backward_model(dseries(firstobs, dates('1995Q1'), M_endo_names_trim), 10000);
simdata = simdata(simdata.dates(5001:6000));
names=regexp(simdata.name, 'res\w*');
idxs = [];
for j=1:length(names)
if isempty(names{j})
idxs = [idxs j];
end
end
simdata = simdata{idxs};
pooled_ols(simdata, ...
{'de','u2'}, ...
{'*_q_yed_ecm_*_q_yed_L1', ...