From 3247b1aa028fd7c933dc8b79ff07c6b9b0d7677a Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Mon, 14 Jan 2019 16:42:57 +0100 Subject: [PATCH] pooled_fgls: fix and update --- matlab/ols/pooled_fgls.m | 21 +++++++++++---------- matlab/ols/pooled_ols.m | 36 ++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/matlab/ols/pooled_fgls.m b/matlab/ols/pooled_fgls.m index 4b981f838..914e108ef 100644 --- a/matlab/ols/pooled_fgls.m +++ b/matlab/ols/pooled_fgls.m @@ -17,7 +17,7 @@ function pooled_fgls(ds, param_common, param_regex, eqtags) % SPECIAL REQUIREMENTS % dynare must be run with the option: json=parse -% Copyright (C) 2017-2018 Dynare Team +% Copyright (C) 2017-2019 Dynare Team % % This file is part of Dynare. % @@ -36,19 +36,20 @@ function pooled_fgls(ds, param_common, param_regex, eqtags) global M_ oo_ +%% Check input arguments + if nargin < 4 - eqtags ={}; - pooled_ols(ds, param_common, param_regex, true); -else - param_regex = pooled_ols(ds, param_common, param_regex, true, eqtags); + eqtags = {}; end -oo_.sur.dof = length(oo_.pooled_fgls.sample_range); -resid = oo_.pooled_fgls.Y - oo_.pooled_fgls.X * oo_.pooled_fgls.beta; -resid = reshape(resid, oo_.sur.dof, length(oo_.pooled_fgls.residnames)); -M_.Sigma_e = resid'*resid/oo_.sur.dof; +pooled_ols(ds, param_common, param_regex, true, eqtags); -kLeye = kron(chol(inv(M_.Sigma_e)), eye(oo_.sur.dof)); +oo_.pooled_fgls.dof = size(oo_.pooled_fgls.X,1)/length(oo_.pooled_fgls.residnames); +resid = oo_.pooled_fgls.Y - oo_.pooled_fgls.X * oo_.pooled_fgls.beta; +resid = reshape(resid, oo_.pooled_fgls.dof, length(oo_.pooled_fgls.residnames)); +M_.Sigma_e = resid'*resid/oo_.pooled_fgls.dof; + +kLeye = kron(chol(inv(M_.Sigma_e)), eye(oo_.pooled_fgls.dof)); [q, r] = qr(kLeye*oo_.pooled_fgls.X, 0); oo_.pooled_fgls.beta = r\(q'*kLeye*oo_.pooled_fgls.Y); diff --git a/matlab/ols/pooled_ols.m b/matlab/ols/pooled_ols.m index b29f5f520..84f3cc995 100644 --- a/matlab/ols/pooled_ols.m +++ b/matlab/ols/pooled_ols.m @@ -1,4 +1,4 @@ -function varargout = pooled_ols(ds, param_common, param_regex, overlapping_dates, eqtags) +function pooled_ols(ds, param_common, param_regex, overlapping_dates, eqtags) % function pooled_ols(ds, param_common, param_regex, overlapping_dates, eqtags) % Run Pooled OLS % Apply parameter values found to corresponding parameter values in the @@ -75,14 +75,6 @@ country_name = param_common{1}; regexcountries = ['(' strjoin(param_common(2:end),'|') ')']; ast = replace_parameters(ast, country_name, regexcountries, param_regex); -%% Handle FGLS -st = dbstack(1); -save_structure_name = 'pooled_ols'; -if strcmp(st(1).name, 'pooled_fgls') - varargout{1} = param_regex; - save_structure_name = 'pooled_fgls'; -end - %% Find parameters and variable names in every equation & Setup estimation matrices [Y, ~, X, ~, ~, residnames] = common_parsing(ds, ast, jsonmodel, overlapping_dates); clear ast jsonmodel; @@ -97,8 +89,15 @@ for i = 2:length(Y) end [Y, X] = put_in_sur_form(Y, X); +%% Handle FGLS +st = dbstack(1); +if strcmp(st(1).name, 'pooled_fgls') + save_structure_name = 'pooled_fgls'; +else + save_structure_name = 'pooled_ols'; +end + %% Save -oo_.(save_structure_name).sample_range = fp:fp+sum(nobs); oo_.(save_structure_name).residnames = residnames; oo_.(save_structure_name).Y = Y.data; oo_.(save_structure_name).X = X.data; @@ -113,6 +112,7 @@ oo_.(save_structure_name).beta = r\(q'*Y.data); if strcmp(st(1).name, 'pooled_fgls') return end +clear save_structure_name; % Assign parameter values back to parameters using param_regex & param_common regexcountries = ['(' strjoin(param_common(1:end),'|') ')']; @@ -120,7 +120,7 @@ assigned_idxs = false(size(X.name)); for i = 1:length(param_regex) beta_idx = strcmp(X.name, strrep(param_regex{i}, '*', country_name)); assigned_idxs = assigned_idxs | beta_idx; - value = oo_.(save_structure_name).beta(beta_idx); + value = oo_.pooled_ols.beta(beta_idx); if isempty(eqtags) assert(~isempty(value)); end @@ -130,25 +130,25 @@ for i = 1:length(param_regex) end end idxs = find(assigned_idxs == 0); -values = oo_.(save_structure_name).beta(idxs); +values = oo_.pooled_ols.beta(idxs); names = X.name(idxs); assert(length(values) == length(names)); for i = 1:length(idxs) M_.params(strcmp(M_.param_names, names{i})) = values(i); end -residuals = Y.data - X.data * oo_.(save_structure_name).beta; +residuals = Y.data - X.data * oo_.pooled_ols.beta; for i = 1:neqs if i == 1 - oo_.(save_structure_name).resid.(residnames{i}) = residuals(1:nobs(1)); + oo_.pooled_ols.resid.(residnames{i}) = residuals(1:nobs(1)); elseif i == neqs - oo_.(save_structure_name).resid.(residnames{i}) = residuals(sum(nobs(1:i-1))+1:end); + oo_.pooled_ols.resid.(residnames{i}) = residuals(sum(nobs(1:i-1))+1:end); else - oo_.(save_structure_name).resid.(residnames{i}) = residuals(sum(nobs(1:i-1))+1:sum(nobs(1:i))); + oo_.pooled_ols.resid.(residnames{i}) = residuals(sum(nobs(1:i-1))+1:sum(nobs(1:i))); end - oo_.(save_structure_name).varcovar.(['eq' num2str(i)]) = oo_.(save_structure_name).resid.(residnames{i})*oo_.(save_structure_name).resid.(residnames{i})'; + oo_.pooled_ols.varcovar.(['eq' num2str(i)]) = oo_.pooled_ols.resid.(residnames{i})*oo_.pooled_ols.resid.(residnames{i})'; idx = find(strcmp(residnames{i}, M_.exo_names)); - M_.Sigma_e(idx, idx) = var(oo_.(save_structure_name).resid.(residnames{i})); + M_.Sigma_e(idx, idx) = var(oo_.pooled_ols.resid.(residnames{i})); end end