var_forecast: clean up writing of forecast function
parent
7c28e217e5
commit
20ba99cf94
|
@ -19,10 +19,10 @@ end
|
|||
|
||||
%%
|
||||
fprintf(fid, 'function ret = %s(y)\n', basename);
|
||||
fprintf(fid, '%%function ret = %s(y, h)\n', basename);
|
||||
fprintf(fid, '%%function ret = %s(y)\n', basename);
|
||||
fprintf(fid, '%% Calculates the %d-step-ahead forecast from the VAR model %s\n', max(horizon), var_model_name);
|
||||
fprintf(fid, '%%\n%% Created automatically by Dynare\n%%\n\n');
|
||||
fprintf(fid, '%%%% Construct ret\n');
|
||||
fprintf(fid, '%%\n%% Created automatically by Dynare on %s\n%%\n\n', datetime);
|
||||
fprintf(fid, '%%%% Construct y\n');
|
||||
fprintf(fid, 'assert(length(y) == %d);\n', sum(sum(M_.lead_lag_incidence ~= 0)));
|
||||
|
||||
endo_names = cellstr(M_.endo_names);
|
||||
|
@ -55,26 +55,27 @@ end
|
|||
if M_.var.(var_model_name).order > 1
|
||||
mu = [mu; zeros(lm*M_.var.(var_model_name).order-lm, 1)];
|
||||
end
|
||||
fprintf(fid, '%%%% Calculate h-step-ahead forecast\n');
|
||||
fprintf(fid, 'retidx = 1;\n');
|
||||
fprintf(fid, 'ret = zeros(%d, %d);\n', length(horizon), lm);
|
||||
fprintf(fid, 'for i=1:%d\n', max(horizon));
|
||||
fprintf(fid, ' y = [');
|
||||
fprintf(fid, [repmat(' %f ', 1, size(mu, 2)) ';'], mu');
|
||||
fprintf(fid, '] + [');
|
||||
fprintf(fid, [repmat(' %f ', 1, size(A, 2)) ';'], A');
|
||||
fprintf(fid, ']*y(:);\n');
|
||||
if length(horizon) == 1
|
||||
fprintf(fid, ' if %d == i\n', horizon);
|
||||
fprintf(fid, '\n%%%% Calculate %d-step-ahead forecast\n', max(horizon));
|
||||
if max(horizon) == 1
|
||||
printInsideOfLoop(fid, mu, A, '');
|
||||
fprintf(fid, 'ret(1, :) = y(1:%d);\n', lm);
|
||||
else
|
||||
fprintf(fid, ' if any([');
|
||||
fprintf(fid, '%d ', horizon);
|
||||
fprintf(fid, '] == i)\n');
|
||||
fprintf(fid, 'retidx = 1;\n');
|
||||
fprintf(fid, 'ret = zeros(%d, %d);\n', length(horizon), lm);
|
||||
fprintf(fid, 'for i=1:%d\n', max(horizon));
|
||||
printInsideOfLoop(fid, mu, A, ' ');
|
||||
if length(horizon) == 1
|
||||
fprintf(fid, ' if %d == i\n', horizon);
|
||||
else
|
||||
fprintf(fid, ' if any([');
|
||||
fprintf(fid, '%d ', horizon);
|
||||
fprintf(fid, '] == i)\n');
|
||||
end
|
||||
fprintf(fid, ' ret(retidx, :) = y(1:%d);\n', lm);
|
||||
fprintf(fid, ' retidx = retidx + 1;\n');
|
||||
fprintf(fid, ' end\n');
|
||||
fprintf(fid, 'end\n');
|
||||
end
|
||||
fprintf(fid, ' ret(retidx, :) = y(1:%d);\n', lm);
|
||||
fprintf(fid, ' retidx = retidx + 1;\n');
|
||||
fprintf(fid, ' end\n');
|
||||
fprintf(fid, 'end\n');
|
||||
|
||||
% retidx = find(strcmp(dwrt, endo_names) & yidx == 1);
|
||||
% assert(~isempty(retidx))
|
||||
|
@ -87,4 +88,12 @@ fprintf(fid, 'end\n');
|
|||
%% close file
|
||||
fprintf(fid, 'end\n');
|
||||
fclose(fid);
|
||||
end
|
||||
|
||||
function printInsideOfLoop(fid, mu, A, spaces)
|
||||
fprintf(fid, '%sy = [',spaces);
|
||||
fprintf(fid, [repmat(' %f ', 1, size(mu, 2)) ';'], mu');
|
||||
fprintf(fid, '] + [');
|
||||
fprintf(fid, [repmat(' %f ', 1, size(A, 2)) ';'], A');
|
||||
fprintf(fid, ']*y(:);\n');
|
||||
end
|
Loading…
Reference in New Issue