dyn_ols: reference tag name in printing if available

time-shift
Houtan Bastani 2017-12-07 14:41:22 +01:00
parent 99344e0bcf
commit edc38fea3f
2 changed files with 41 additions and 38 deletions

View File

@ -1,4 +1,4 @@
function [lhs, rhs, linenum, sample] = getEquationsByTags(jsonmodel, varargin)
function [lhs, rhs, linenum, sample, tagvalue] = getEquationsByTags(jsonmodel, varargin)
%function [lhs, rhs, linenum, sample] = getEquationByTag(jsonmodel, varargin)
% Return the lhs, rhs of an equation and the line it was defined
% on given its tag
@ -13,6 +13,7 @@ function [lhs, rhs, linenum, sample] = getEquationsByTags(jsonmodel, varargin)
% rhs [cellstring array] right hand side of eq
% linenum [cellstring array] eq line in .mod file
% sample [cell array of dates] sample range
% tagvalue [cellstring array] tags associated with equations
%
% SPECIAL REQUIREMENTS
% none
@ -41,14 +42,24 @@ if nargin == 1
rhs = cell(1, length(jsonmodel));
linenum = cell(1, length(jsonmodel));
sample = cell(1, length(jsonmodel));
tagvalue = cell(1, length(jsonmodel));
for i=1:length(jsonmodel)
lhs{i} = jsonmodel{i}.lhs;
rhs{i} = jsonmodel{i}.rhs;
linenum{i} = jsonmodel{i}.line;
if isfield(jsonmodel{i}, 'tags') && ...
isfield(jsonmodel{i}.tags, 'sample')
tmp = strsplit(jsonmodel{i}.tags.sample, ':');
sample{i} = dates(tmp{1}):dates(tmp{2});
isfield(jsonmodel{i}.tags, 'name')
tagvalue{i} = jsonmodel{i}.tags.('name');
else
tagvalue{i} = ['eq_line_no_' num2str(linenum{i})];
end
if isfield(jsonmodel{i}, 'tags')
if isfield(jsonmodel{i}.tags, 'sample')
tmp = strsplit(jsonmodel{i}.tags.sample, ':');
sample{i} = dates(tmp{1}):dates(tmp{2});
end
else
tagvalue{i} = ['eq_line_no_' num2str(linenum{i})];
end
end
return

View File

@ -49,16 +49,16 @@ jsonmodel = loadjson(jsonfile);
jsonmodel = jsonmodel.model;
if nargin == 1
[lhs, rhs, lineno, sample] = getEquationsByTags(jsonmodel);
[lhs, rhs, lineno, sample, tags] = getEquationsByTags(jsonmodel);
fitted_names_dict = {};
else
assert(isempty(fitted_names_dict) || ...
(iscell(fitted_names_dict) && columns(fitted_names_dict) == 2), ...
'dyn_ols: the second argument must be an Nx2 cell array');
if nargin == 2
[lhs, rhs, lineno, sample] = getEquationsByTags(jsonmodel);
[lhs, rhs, lineno, sample, tags] = getEquationsByTags(jsonmodel);
else
[lhs, rhs, lineno, sample] = getEquationsByTags(jsonmodel, 'name', eqtags);
[lhs, rhs, lineno, sample, tags] = getEquationsByTags(jsonmodel, 'name', eqtags);
end
if isempty(lhs)
disp('dyn_ols: Nothing to estimate')
@ -195,24 +195,15 @@ for i = 1:length(lhs)
%% Estimation
% From LeSage, James P. "Applied Econometrics using MATLAB"
if nargin == 3
if iscell(eqtags)
tagv = eqtags{i};
else
tagv = eqtags;
end
else
tagv = ['eq_line_no_' num2str(lineno{i})];
end
[nobs, nvars] = size(X);
oo_.ols.(tagv).dof = nobs - nvars;
oo_.ols.(tags{i}).dof = nobs - nvars;
% Estimated Parameters
[q, r] = qr(X, 0);
xpxi = (r'*r)\eye(nvars);
oo_.ols.(tagv).beta = r\(q'*Y.data);
oo_.ols.(tags{i}).beta = r\(q'*Y.data);
for j = 1:length(pnames)
M_.params(strcmp(M_param_names_trim, pnames{j})) = oo_.ols.(tagv).beta(j);
M_.params(strcmp(M_param_names_trim, pnames{j})) = oo_.ols.(tags{i}).beta(j);
end
% Yhat
@ -224,59 +215,60 @@ for i = 1:length(lhs)
yhatname = fitted_names_dict{idx, 2};
end
end
oo_.ols.(tagv).Yhat = dseries(X*oo_.ols.(tagv).beta, fp, yhatname);
oo_.ols.(tags{i}).Yhat = dseries(X*oo_.ols.(tags{i}).beta, fp, yhatname);
% Residuals
oo_.ols.(tagv).resid = Y - oo_.ols.(tagv).Yhat;
oo_.ols.(tags{i}).resid = Y - oo_.ols.(tags{i}).Yhat;
% Correct Yhat reported back to user for given
for j = 1:lhssub.vobs
oo_.ols.(tagv).Yhat = oo_.ols.(tagv).Yhat + lhssub{j}(fp:lp);
oo_.ols.(tags{i}).Yhat = oo_.ols.(tags{i}).Yhat + lhssub{j}(fp:lp);
end
ds = [ds oo_.ols.(tagv).Yhat];
ds = [ds oo_.ols.(tags{i}).Yhat];
%% Calculate statistics
% Estimate for sigma^2
SS_res = oo_.ols.(tagv).resid.data'*oo_.ols.(tagv).resid.data;
oo_.ols.(tagv).s2 = SS_res/oo_.ols.(tagv).dof;
SS_res = oo_.ols.(tags{i}).resid.data'*oo_.ols.(tags{i}).resid.data;
oo_.ols.(tags{i}).s2 = SS_res/oo_.ols.(tags{i}).dof;
% R^2
ym = Y.data - mean(Y);
SS_tot = ym'*ym;
oo_.ols.(tagv).R2 = 1 - SS_res/SS_tot;
oo_.ols.(tags{i}).R2 = 1 - SS_res/SS_tot;
% Adjusted R^2
oo_.ols.(tagv).adjR2 = oo_.ols.(tagv).R2 - (1 - oo_.ols.(tagv).R2)*nvars/(oo_.ols.(tagv).dof-1);
oo_.ols.(tags{i}).adjR2 = oo_.ols.(tags{i}).R2 - (1 - oo_.ols.(tags{i}).R2)*nvars/(oo_.ols.(tags{i}).dof-1);
% Durbin-Watson
ediff = oo_.ols.(tagv).resid.data(2:nobs) - oo_.ols.(tagv).resid.data(1:nobs-1);
oo_.ols.(tagv).dw = (ediff'*ediff)/SS_res;
ediff = oo_.ols.(tags{i}).resid.data(2:nobs) - oo_.ols.(tags{i}).resid.data(1:nobs-1);
oo_.ols.(tags{i}).dw = (ediff'*ediff)/SS_res;
% Standard Error
oo_.ols.(tagv).stderr = sqrt(oo_.ols.(tagv).s2*diag(xpxi));
oo_.ols.(tags{i}).stderr = sqrt(oo_.ols.(tags{i}).s2*diag(xpxi));
% T-Stat
oo_.ols.(tagv).tstat = oo_.ols.(tagv).beta./oo_.ols.(tagv).stderr;
oo_.ols.(tags{i}).tstat = oo_.ols.(tags{i}).beta./oo_.ols.(tags{i}).stderr;
%% Print Output
if ~options_.noprint
title = sprintf('OLS Estimation of equation `%s`', tagv);
if nargin == 3
title = [title sprintf(' [%s = %s]', 'name', tagv)];
title = ['OLS Estimation of equation ''' tags{i} ''' [name = ''' tags{i} ''']'];
else
title = ['OLS Estimation of equation ''' tags{i} ''''];
end
preamble = {sprintf('Dependent Variable: %s', lhs{i}), ...
sprintf('No. Independent Variables: %d', nvars), ...
sprintf('Observations: %d from %s to %s\n', nobs, fp.char, lp.char)};
afterward = {sprintf('R^2: %f', oo_.ols.(tagv).R2), ...
sprintf('R^2 Adjusted: %f', oo_.ols.(tagv).adjR2), ...
sprintf('s^2: %f', oo_.ols.(tagv).s2), ...
sprintf('Durbin-Watson: %f', oo_.ols.(tagv).dw)};
afterward = {sprintf('R^2: %f', oo_.ols.(tags{i}).R2), ...
sprintf('R^2 Adjusted: %f', oo_.ols.(tags{i}).adjR2), ...
sprintf('s^2: %f', oo_.ols.(tags{i}).s2), ...
sprintf('Durbin-Watson: %f', oo_.ols.(tags{i}).dw)};
dyn_table(title, preamble, afterward, vnames, ...
{'Coefficients','t-statistic','Std. Error'}, 4, ...
[oo_.ols.(tagv).beta oo_.ols.(tagv).tstat oo_.ols.(tagv).stderr]);
[oo_.ols.(tags{i}).beta oo_.ols.(tags{i}).tstat oo_.ols.(tags{i}).stderr]);
end
end
end