/usr/share/dynare/matlab/ms-sbvar/msstart2.m is in dynare-common 4.4.1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 | %function msstart2(options_)
% This .m file is called for point graphics or error bands and
% It starts for both data and Bayesian estimation (when IxEstimat==0,
% no estimation but only data analysis), which allows you to set
% (a) available data range,
% (b) sample range,
% (c) rearrangement of actual data such as mlog, qg, yg
% (d) conditions of shocks 'Cms',
% (c) conditions of variables 'nconstr',
% (e) soft conditions 'nbancon,'
% (f) produce point conditional forecast (at least conditions on variables).
%
% February 2004
% Copyright (C) 2011-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/>.
% ** ONLY UNDER UNIX SYSTEM
%path(path,'/usr2/f1taz14/mymatlab')
%addpath('C:\SoftWDisk\MATLAB6p5\toolbox\cstz')
msstart_setup
%===========================================
% Exordium II
%===========================================
%options_.ms.ncsk = 0; % conditional directly on shoocks. Unlike Cms, not on variables that back out shocks
%options_.ms.nstd = 6; % number of standard deviations to cover the range in which distributions are put to bins
%options_.ms.ninv = 1000; % the number of bins for grouping, say, impulse responses
%options_.ms.Indxcol = [1:nvar]; % a vector of random columns in which MC draws are made.
%
%options_.ms.indxparr = 1; % 1: parameters random; 0: no randomness in parameters
% Note, when 0, there is no effect from the values of options_.ms.IndxAp, options_.ms.Aband, etc.
%options_.ms.indxovr = 0; % 1: distributions for other variables of interest; 0: no distribution.
% Example: joint distribution of a(1) and a(2). Only for specific purposes
%options_.ms.Aband = 1; % 1: error bands with only A0 and A+ random.
%options_.ms.IndxAp = 1; % 1: generate draws of A+; 0: no such draws.
% Note: when options_.ms.IndxAp=0, there is no effect from the values of options_.ms.options_.ms.options_.ms.options_.ms.indximf, IndxFore,
% or options_.ms.apband.
%options_.ms.apband = 1; % 1: error bands for A+; 0: no error bands for A+.
%*** The following (impulse responses and forecasts) is used only if options_.ms.IndxAp=1
%options_.ms.indximf = 1; % 1: generate draws of impulse responses; 0: no such draws (thus no effect
% from options_.ms.imfband)
%options_.ms.imfband = 1; % 1: error bands for impulse responses; 0: no error bands
%options_.ms.indxfore = 0; % 1: generate draws of forecasts; 0: no such draws (thus no effect from options_.ms.foreband)
%options_.ms.foreband = 0; % 1: error bands for out-of-sample forecasts; 0: no error bands
%
%options_.ms.indxgforhat = 1; % 1: plot unconditoinal forecasts; 0: no such plot
rnum = nvar; % number of rows in the graph
cnum = 1; % number of columns in the graph
if rnum*cnum<nvar
warning('rnum*cnum must be at least as large as nvar')
disp('Hit any key to continue, or ctrl-c to abort')
pause
end
%options_.ms.indxgimfhat = 1; % 1: plot ML impulse responses; 0: no plot
%options_.ms.indxestima = 1; %1: ML estimation; 0: no estimation and data only
%
IndxNmlr = [1 0 0 0 0 0]; % imported by nmlzvar.m
% Index for which normalization rule to choose
% Only one of the elments in IndxNmlr can be non-zero
% IndxNmlr(1): ML A distance rule (supposed to be the best)
% IndxNmlr(2): ML Ahat distance rule (to approximate IndxNmlr(1))
% IndxNmlr(3): ML Euclidean distance rule (not invariant to scale)
% IndxNmlr(4): Positive diagonal rule
% IndxNmlr(5): Positive inv(A) diagonal rule (if ~IndxNmlr(5), no need for A0inu,
% so let A0inu=[])
% IndxNmlr(6): Assigned postive rule (such as off-diagonal elements). Added 1/3/00
%%%%----------------------------------------
% Hard conditions directly on variables
%
%options_.ms.indxgdls = 1; % 1: graph point forecast on variables; 0: disable
nconstr1=nfqm; % number of the 1st set of constraints
nconstr2=options_.forecast ; % number of the 2nd set of constraints
nconstr=nconstr1+nconstr2; % q: 4 years -- 4*12 months.
% When 0, no conditions directly on variables <<>>
nconstr=0 ; %6*nconstr1;
options_.ms.eq_ms = []; % location of MS equation; if [], all shocks
PorR = [4*ones(nconstr1,1);2*ones(nconstr1,1);3*ones(nconstr1,1)]; % the variable conditioned. 1: Pcm; 3: FFR; 4: CPI
PorR = [PorR;1*ones(nconstr1,1);5*ones(nconstr1,1);6*ones(nconstr1,1)];
%PorR = [3 5]; % the variable conditioned. 3: FFR; 5: CPI
%PorR = 3;
%%%%----------------------------------------
% Conditions directly on future shocks
%
%options_.ms.cms = 0 % 1: condition on ms shocks; 0: disable this and "fidcnderr.m" gives
% unconditional forecasts if nconstr = 0 as well; <<>>
%options_.ms.ncms = 0; % number of the stance of policy; 0 if no tightening or loosening
%options_.ms.eq_cms = 1; % location of MS shocks
options_.ms.tlindx = 1*ones(1,options_.ms.ncms); % 1-by-options_.ms.ncms vector; 1: tightening; 0: loosen
options_.ms.tlnumber = [0.5 0.5 0 0]; %94:4 % [2 2 1.5 1.5]; %79:9 %[1.5 1.5 1 1]; 90:9
% 1-by-options_.ms.ncms vector; cut-off point for MS shocks
TLmean = zeros(1,options_.ms.ncms);
% unconditional, i.e., 0 mean, for the final report in the paper
if options_.ms.cms
options_.ms.eq_ms = [];
% At least at this point, it makes no sense to have DLS type of options_.ms.eq_ms; 10/12/98
if all(isfinite(options_.ms.tlnumber))
for k=1:options_.ms.ncms
TLmean(k) = lcnmean(options_.ms.tlnumber(k),options_.ms.tlindx(k));
% shock mean magnitude. 1: tight; 0: loose
% Never used for any subsequent computation but
% simply used for the final report in the paper.
%options_.ms.tlnumber(k) = fzero('lcutoff',0,[],[],TLmean(k))
% get an idea about the cutoff point given TLmean instead
end
end
else
options_.ms.ncms = 0; % only for the use of the graph by msprobg.m
options_.ms.tlnumber = NaN*ones(1,options_.ms.ncms);
% -infinity, only for the use of the graph by msprobg.m
end
%%%%----------------------------------------
% Soft conditions on variables
%
%cnum = 0 % # of band condtions; when 0, disable this option
% Note (different from "fidencon") that each condition corres. to variable
%options_.ms.banact = 1; % 1: use infor on actual; 0: preset without infor on actual
if cnum
banindx = cell(cnum,1); % index for each variable or conditon
banstp = cell(cnum,1); % steps: annual in general
banvar = zeros(cnum,1); % varables: annual in general
banval = cell(cnum,1); % band value (each variable occupy a cell)
badval{1} = zeros(length(banstp{1}),2); % 2: lower or higher bound
banstp{1} = 1:4; % 3 or 4 years
banvar(1) = 3; % 3: FFR; 5: CPI
if ~options_.ms.banact
for i=1:length(banstp{1})
banval{1}(i,:) = [5.0 10.0];
end
end
end
%
pause(1)
skipline()
disp('For uncondtional forecasts, set nconstr = options_.ms.cms = cnum = 0')
pause(1)
%
%=================================================
%====== End of exordium ==========================
%=================================================
%(1)--------------------------------------
% Further data analysis
%(1)--------------------------------------
%
if (options_.ms.freq==12)
nStart=(yrStart-options_.ms.initial_year )*12+qmStart-options_.ms.initial_subperiod ; % positive number of months at the start
nEnd=(yrEnd-options_.ms.final_year )*12+qmEnd-options_.ms.final_subperiod ; % negative number of months towards end
elseif (options_.ms.freq==4)
nStart=(yrStart-options_.ms.initial_year )*4+qmStart-options_.ms.initial_subperiod ; % positive number of months at the start
nEnd=(yrEnd-options_.ms.final_year )*4+qmEnd-options_.ms.final_subperiod ; % negative number of months towards end
elseif (options_.ms.freq==1)
nStart=(yrStart-options_.ms.initial_year )*1+qmStart-options_.ms.initial_subperiod ; % positive number of months at the start
nEnd=(yrEnd-options_.ms.final_year )*1+qmEnd-options_.ms.final_subperiod ; % negative number of months towards end
else
error('Error: this code is only good for monthly/quarterly/yearly data!!!')
return
end
%
if nEnd>0 || nStart<0
disp('Warning: this particular sample consider is out of bounds of the data!!!')
return
end
%*** Note, both xdgel and xdata have the same start with the specific sample
xdgel=options_.data(nStart+1:nData+nEnd,options_.ms.vlist);
% gel: general options_.data within sample (nSample)
if ~(nSample==size(xdgel,1))
warning('The sample size (including options_.ms.nlags ) and data are incompatible')
disp('Check to make sure nSample and size(xdgel,1) are the same')
return
end
%
baddata = find(isnan(xdgel));
if ~isempty(baddata)
warning('Some data for this selected sample are actually unavailable.')
disp('Hit any key to continue, or ctrl-c to abort')
pause
end
%
if options_.ms.initial_subperiod ==1
yrB = options_.ms.initial_year ; qmB = options_.ms.initial_subperiod ;
else
yrB = options_.ms.initial_year +1; qmB = 1;
end
yrF = options_.ms.final_year ; qmF = options_.ms.final_subperiod ;
[Mdate,tmp] = fn_calyrqm(options_.ms.freq,[options_.ms.initial_year options_.ms.initial_subperiod ],[options_.ms.final_year options_.ms.final_subperiod ]);
xdatae=[Mdate options_.data(1:nData,options_.ms.vlist)];
% beyond sample into forecast horizon until the end of the data options_.ms.final_year :options_.ms.final_subperiod
% Note: may contain NaN data. So must be careful about its use
%=========== Obtain prior-period, period-to-last period, and annual growth rates
[yactyrge,yactyre,yactqmyge,yactqmge,yactqme] = fn_datana(xdatae,options_.ms.freq,options_.ms.log_var,options_.ms.percent_var,[yrB qmB],[yrF qmF]);
qdates = zeros(size(yactqmyge,1),1);
for ki=1:length(qdates)
qdates(ki) = yactqmyge(1,1) + (yactqmyge(1,2)+ki-2)/options_.ms.freq;
end
for ki=1:nvar
figure
plot(qdates, yactqmyge(:,2+ki)/100)
xlabel(options_.ms.varlist{ki})
end
save outactqmygdata.prn yactqmyge -ascii
%=========== Write the output on the screen or to a file in an organized way ==============
%disp([sprintf('%4.0f %2.0f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n',yactyrge')])
spstr1 = 'disp([sprintf(';
spstr2 = '%4.0f %2.0f';
yactyrget=yactyrge';
for ki=1:length(options_.ms.vlist)
if ki==length(options_.ms.vlist)
spstr2 = [spstr2 ' %8.3f\n'];
else
spstr2 = [spstr2 ' %8.3f'];
end
end
spstr = [spstr1 'spstr2' ', yactyrget)])'];
eval(spstr)
%
fid = fopen('outyrqm.prn','w');
%fprintf(fid,'%4.0f %2.0f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n',yactyrge');
fpstr1 = 'fprintf(fid,';
fpstr2 = '%4.0f %2.0f';
for ki=1:nvar
if ki==nvar
fpstr2 = [fpstr2 ' %8.3f\n'];
else
fpstr2 = [fpstr2 ' %8.3f'];
end
end
fpstr = [fpstr1 'fpstr2' ', yactyrget);'];
eval(fpstr)
fclose(fid);
if options_.ms.indxestima
%(2)----------------------------------------------------------------------------
% Estimation
% ML forecast and impulse responses
% Hard or soft conditions for conditional forecasts
%(2)----------------------------------------------------------------------------
%
%* Arranged data information, WITHOUT dummy obs when 0 after mu is used. See fn_rnrprior_covres_dobs.m for using the dummy
% observations as part of an explicit prior.
[xtx,xty,yty,fss,phi,y,ncoef,xr,Bh] = fn_dataxy(nvar,options_.ms.nlags ,xdgel,mu,0,nexo);
if qmStart+options_.ms.nlags -options_.ms.dummy_obs >0
qmStartEsti = rem(qmStart+options_.ms.nlags -options_.ms.dummy_obs ,options_.ms.freq); % dummy observations are included in the sample.
if (~qmStartEsti)
qmStartEsti = options_.ms.freq;
end
yrStartEsti = yrStart + floor((qmStart+options_.ms.nlags -options_.ms.dummy_obs )/(options_.ms.freq+0.01));
% + 0.01 (or any number < 1) is used so that qmStart+options_.ms.nlags -options_.ms.dummy_obs ==?*options_.ms.freq doesn't give us an extra year forward.
else
qmStartEsti = options_.ms.freq + rem(qmStart+options_.ms.nlags -options_.ms.dummy_obs ,options_.ms.freq); % dummy observations are included in the sample.
if (qmStart+options_.ms.nlags -options_.ms.dummy_obs ==0)
yrStartEsti = yrStart - 1; % one year back.
else
yrStartEsti = yrStart + floor((qmStart+options_.ms.nlags -options_.ms.dummy_obs )/(options_.ms.freq-0.01));
% - 0.01 (or any number < 1) is used so that qmStart+options_.ms.nlags -options_.ms.dummy_obs ==-?*options_.ms.freq give us an extra year back.
end
end
dateswd = fn_dataext([yrStartEsti qmStartEsti],[yrEnd qmEnd],xdatae(:,[1:2])); % dates with dummies
phie = [dateswd phi];
ye = [dateswd y];
%* Obtain linear restrictions
[Uiconst,Viconst,n0,np,ixmC0Pres] = feval(options_.ms.restriction_fname,nvar,nexo,options_.ms );
if min(n0)==0
skipline()
warning('A0: restrictions in dlrprior.m give no free parameter in one of equations')
disp('Press ctrl-c to abort')
pause
elseif min(np)==0
skipline()
warning('Ap: Restrictions in dlrprior.m give no free parameter in one of equations')
disp('Press ctrl-c to abort')
pause
end
if options_.ms.contemp_reduced_form
Uiconst=cell(nvar,1); Viconst=cell(ncoef,1);
for kj=1:nvar
Uiconst{kj} = eye(nvar); Viconst{kj} = eye(ncoef);
end
end
if options_.ms.bayesian_prior
%*** Obtains asymmetric prior (with no linear restrictions) with dummy observations as part of an explicit prior (i.e,
% reflected in Hpmulti and Hpinvmulti). See Forecast II, pp.69a-69b for details.
if 1 % Liquidity effect prior on both MS and MD equations.
[Pi,H0multi,Hpmulti,H0invmulti,Hpinvmulti] = fn_rnrprior_covres_dobs(nvar,options_.ms.freq,options_.ms.nlags ,xdgel,mu,indxDummy,hpmsmd,indxmsmdeqn);
else
[Pi,H0multi,Hpmulti,H0invmulti,Hpinvmulti] = fn_rnrprior(nvar,options_.ms.freq,options_.ms.nlags ,xdgel,mu);
end
%*** Combines asymmetric prior with linear restrictions
[Ptld,H0invtld,Hpinvtld] = fn_rlrprior(Uiconst,Viconst,Pi,H0multi,Hpmulti,nvar);
%*** Obtains the posterior matrices for estimation and inference
[Pmat,H0inv,Hpinv] = fn_rlrpostr(xtx,xty,yty,Ptld,H0invtld,Hpinvtld,Uiconst,Viconst);
if options_.ms.contemp_reduced_form
%*** Obtain the ML estimate
A0hatinv = chol(H0inv{1}/fss); % upper triangular but lower triangular choleski
A0hat=inv(A0hatinv);
a0indx = find(A0hat);
else
%*** Obtain the ML estimate
% load idenml
x = 10*rand(sum(n0),1);
H0 = eye(sum(n0));
crit = 1.0e-9;
nit = 10000;
%
[fhat,xhat,grad,Hhat,itct,fcount,retcodehat] = ...
csminwel('fn_a0freefun',x,H0,'fn_a0freegrad',crit,nit,Uiconst,nvar,n0,fss,H0inv);
A0hat = fn_tran_b2a(xhat,Uiconst,nvar,n0)
A0hatinv = inv(A0hat);
fhat
xhat
grad
itct
fcount
retcodehat
save outm.mat xhat A0hat A0hatinv grad fhat itct itct fcount retcodehat
end
else
%*** Obtain the posterior matrices for estimation and inference
[Pmat,H0inv,Hpinv] = fn_dlrpostr(xtx,xty,yty,Uiconst,Viconst);
if options_.ms.contemp_reduced_form
%*** Obtain the ML estimate
A0hatinv = chol(H0inv{1}/fss); % upper triangular but lower triangular choleski
A0hat=inv(A0hatinv);
a0indx = find(A0hat);
else
%*** Obtain the ML estimate
% load idenml
x = 10*rand(sum(n0),1);
H0 = eye(sum(n0));
crit = 1.0e-9;
nit = 10000;
%
[fhat,xhat,grad,Hhat,itct,fcount,retcodehat] = ...
csminwel('fn_a0freefun',x,H0,'fn_a0freegrad',crit,nit,Uiconst,nvar,n0,fss,H0inv);
A0hat = fn_tran_b2a(xhat,Uiconst,nvar,n0)
A0hatinv = inv(A0hat);
fhat
xhat
grad
itct
fcount
retcodehat
save outm.mat xhat A0hat A0hatinv grad fhat itct itct fcount retcodehat
end
end
%**** impulse responses
swish = A0hatinv; % each column corresponds to an equation
if options_.ms.contemp_reduced_form
xhat = A0hat(a0indx);
Bhat=Pmat{1};
Fhat = Bhat*A0hat
ghat = NaN;
else
xhat = fn_tran_a2b(A0hat,Uiconst,nvar,n0);
[Fhat,ghat] = fn_gfmean(xhat,Pmat,Viconst,nvar,ncoef,n0,np);
if options_.ms.cross_restrictions
Fhatur0P = Fhat; % ur: unrestriced across A0 and A+
for ki = 1:size(ixmC0Pres,1) % loop through the number of equations in which
% cross-A0-A+ restrictions occur. See St. Louis Note p.5.
ixeq = ixmC0Pres{ki}(1,1); % index for the jth equation in consideration.
Lit = Viconst{ixeq}(ixmC0Pres{ki}(:,2),:); % transposed restriction matrix Li
% V_j(i,:) in f_j(i) = V_j(i,:)*g_j
ci = ixmC0Pres{ki}(:,4) .* A0hat(ixmC0Pres{ki}(:,3),ixeq);
% s * a_j(h) in the restriction f_j(i) = s * a_j(h).
LtH = Lit/Hpinv{ixeq};
HLV = LtH'/(LtH*Lit');
gihat = Viconst{ixeq}'*Fhatur0P(:,ixeq);
Fhat(:,ixeq) = Viconst{ixeq}*(gihat + HLV*(ci-Lit*gihat));
end
end
Fhat
Bhat = Fhat/A0hat; % ncoef-by-nvar reduced form lagged parameters.
end
nn = [nvar options_.ms.nlags imstp];
imfhat = fn_impulse(Bhat,swish,nn); % in the form that is congenial to RATS
imf3hat=reshape(imfhat,size(imfhat,1),nvar,nvar);
% imf3: row--steps, column--nvar responses, 3rd dimension--nvar shocks
imf3shat=permute(imf3hat,[1 3 2]);
% imf3s: permuted so that row--steps, column--nvar shocks,
% 3rd dimension--nvar responses
% Note: reshape(imf3s(1,:,:),nvar,nvar) = A0in (columns -- equations)
if options_.ms.indxgimfhat
figure
end
scaleout = fn_imcgraph(imfhat,nvar,imstp,xlab,ylab,options_.ms.indxgimfhat);
imfstd = max(abs(scaleout)'); % row: nvar (largest number); used for standard deviations
%
% %**** save stds. of both data and impulse responses in idfile1
% temp = [std(yactqmyge(:,3:end)); std(yactyrge(:,3:end)); imfstd]; %<<>>
% save idenyimstd.prn temp -ascii % export forecast and impulse response to the file "idenyimstd.prn", 3-by-nvar
% %
% %**** save stds. of both data and impulse responses in idfile1
% temp = [std(yactqmyge(:,3:end)); std(yactyrge(:,3:end)); imfstd]; %<<>>
% save idenyimstd.prn temp -ascii % export forecast and impulse response to the file "idenyimstd.prn", 3-by-nvar
% if options_.ms.indxparr
% idfile1='idenyimstd';
% end
%=====================================
% Now, out-of-sample forecasts. Note: Hm1t does not change with A0.
%=====================================
%
% * updating the last row of X (phi) with the current (last row of) y.
tcwx = nvar*options_.ms.nlags ; % total coefficeint without exogenous variables
phil = phi(size(phi,1),:);
phil(nvar+1:tcwx) = phil(1:tcwx-nvar);
phil(1:nvar) = y(end,:);
%*** exogenous variables excluding constant terms
if (nexo>1)
Xexoe = fn_dataext([yrEnd qmEnd],[yrEnd qmEnd],xdatae(:,[1:2 2+nvar+1:2+nvar+nexo-1]));
phil(1,tcwx+1:tcwx+nexo-1) = Xexoe(1,3:end);
end
%
%*** ML unconditional point forecast
nn = [nvar options_.ms.nlags nfqm];
if nexo<2
yforehat = fn_forecast(Bhat,phil,nn); % nfqm-by-nvar, in log
else
Xfexoe = fn_dataext(fdates(1,:),fdates(numel(fdates),:),xdatae(:,[1:2 2+nvar+1:2+nvar+nexo-1]));
%Xfexoe = fn_dataext(fdates(1,:),fdates(end,:),xdatae(:,[1:2 2+nvar+1:2+nvar+nexo-1]));
yforehat = fn_forecast(Bhat,phil,nn,nexo,Xfexoe(:,3:end)); % nfqm-by-nvar, in log
end
yforehate = [fdates yforehat];
%
yact1e = fn_dataext([yrEnd-nayr 1],[yrEnd qmEnd],xdatae(:,1:nvar+2));
if options_.ms.real_pseudo_forecast
%yact2e = fn_dataext([yrEnd-nayr 1],E2yrqm,xdatae);
yact2e = fn_dataext([yrEnd-nayr 1],[fdates(end,1) options_.ms.freq],xdatae(:,1:nvar+2));
else
yact2e=yact1e;
end
yafhate = [yact1e; yforehate]; % actual and forecast
%
%===== Converted to mg, qg, and calendar yg
%
[yafyrghate,yafyrhate,yafqmyghate] = fn_datana(yafhate,options_.ms.freq,options_.ms.log_var(1:nlogeno),options_.ms.percent_var(1:npereno));
% actual and forecast growth rates
[yact2yrge,yact2yre,yact2qmyge] = fn_datana(yact2e,options_.ms.freq,options_.ms.log_var(1:nlogeno),options_.ms.percent_var(1:npereno));
% only actual growth rates
yafyrghate
if options_.ms.indxgforhat
keyindx = [1:nvar];
conlab=['unconditional'];
figure
yafyrghate(:,3:end) = yafyrghate(:,3:end)/100;
yact2yrge(:,3:end) = yact2yrge(:,3:end)/100;
fn_foregraph(yafyrghate,yact2yrge,keyindx,rnum,cnum,options_.ms.freq,ylab,forelabel,conlab)
end
%-------------------------------------------------
% Setup for point conditional forecast
% ML Conditional Forecast
%-------------------------------------------------
%
%% See Zha's note "Forecast (1)" p. 5, RATS manual (some errors in RATS), etc.
%
%% Some notations: y(t+1) = y(t)B1 + e(t+1)inv(A0). e(t+1) is 1-by-n.
%% Let r(t+1)=e(t+1)inv(A0) + e(t+2)C + .... where inv(A0) is impulse
%% response at t=1, C at t=2, etc. The row of inv(A0) or C is
%% all responses to one shock.
%% Let r be q-by-1 (such as r(1) = r(t+1)
%% = y(t+1) (constrained) - y(t+1) (forecast)).
%% Use impulse responses to find out R (k-by-q) where k=nvar*nsteps
%% where nsteps the largest constrained step. The key of the program
%% is to creat R using impulse responses
%% Optimal solution for shock e where R'*e=r and e is k-by-1 is
%% e = R*inv(R'*R)*r.
%
if (nconstr > 0)
%*** initializing
stepcon=cell(nconstr,1); % initializing, value y conditioned
valuecon=zeros(nconstr,1); % initializing, value y conditioned
varcon=zeros(nconstr,1); % initializing, endogous variables conditioned
varcon(:)=PorR; % 1: Pcm; 3: FFR; 5: CPI
%
for i=1:nconstr
if i<=nconstr1
stepcon{i}=i; % FFR
elseif i<=2*nconstr1
stepcon{i}=i-nconstr1; % FFR
elseif i<=3*nconstr1
stepcon{i}=i-2*nconstr1; % FFR
elseif i<=4*nconstr1
stepcon{i}=i-3*nconstr1; % FFR
elseif i<=5*nconstr1
stepcon{i}=i-4*nconstr1; % FFR
elseif i<=6*nconstr1
stepcon{i}=i-5*nconstr1; % FFR
end
end
% for i=1:nconstr
% stepcon{i}=i; % FFR
% end
% bend=12;
% stepcon{1}=[1:bend]'; % average over
% stepcon{nconstr1+1}=[1:options_.ms.freq-qmSub]'; % average over the remaing months in 1st forecast year
% stepcon{nconstr1+2}=[options_.ms.freq-qmSub+1:options_.ms.freq-qmSub+12]'; % average over 12 months next year
% stepcon{nconstr1+3}=[options_.ms.freq-qmSub+13:options_.ms.freq-qmSub+24]'; % average over 12 months. 3rd year
% stepcon{nconstr1+4}=[options_.ms.freq-qmSub+25:options_.ms.freq-qmSub+36]'; % average over 12 months. 4th year
% %**** avearage condition over, say, options_.ms.freq periods
% if qmEnd==options_.ms.freq
% stepcon{1}=[1:options_.ms.freq]'; % average over the remaing periods in 1st forecast year
% else
% stepcon{1}=[1:options_.ms.freq-qmEnd]'; % average over the remaing periods in 1st forecast year
% end
% for kj=2:nconstr
% stepcon{kj}=[length(stepcon{kj-1})+1:length(stepcon{kj-1})+options_.ms.freq]'; % average over 12 months next year
% end
if options_.ms.real_pseudo_forecast
% %*** conditions in every period
% for i=1:nconstr
% valuecon(i) = yact(actup+i,varcon(i));
% %valuecon(i) = mean( yact(actup+1:actup+bend,varcon(i)) );
% %valuecon(i) = 0.060; % 95:01
% %valuecon(i) = (0.0475+0.055)/2; % 94:10
% end
% %*** average condtions over,say, options_.ms.freq periods.
% for i=nconstr1+1:nconstr1+nconstr2
% i=1;
% valuecon(nconstr1+i) = ( ( mean(ylast12Cal(:,varcon(nconstr1+i)),1) + ...
% log(1+yactCalyg(yAg-yFg+i,varcon(nconstr1+i))/100) )*options_.ms.freq - ...
% yCal_1(:,varcon(nconstr1+i)) ) ./ length(stepcon{nconstr1+i});
% % the same as unconditional "yactCalyg" 1st calendar year
% i=2;
% valuecon(nconstr1+i) = mean(ylast12Cal(:,varcon(nconstr1+i))) + ...
% log(1+yactCalyg(yAg-yFg+1,varcon(nconstr1+i))/100) ...
% + log(1+yactCalyg(yAg-yFg+i,varcon(nconstr1+i))/100);
% % the same as actual "yactCalgy" 2nd calendar year
% i=3;
% valuecon(nconstr1+i) = valuecon(nconstr1+i-1) + ...
% log(1+yactCalyg(yAg-yFg+i,varcon(nconstr1+i))/100);
% % the same as actual "yactCalgy" 3rd calendar year
% %i=4;
% %valuecon(nconstr1+i) = valuecon(nconstr1+i-1) + ...
% % log(1+yactCalyg(yAg-yFg+i,varcon(nconstr1+i))/100);
% % the same as actual "yactCalgy" 4th calendar year
% end
%*** conditions in every period
vpntM = fn_dataext(E1yrqm, E2yrqm,xdatae); % point value matrix with dates
% vaveM = fn_dataext([yrEnd+1 0],[yrEnd+options_.forecast 0],yact2yre); % average value matrix with dates
for i=1:nconstr
if i<=nconstr1
valuecon(i) = vpntM(i,2+varcon(i)); % 2: first 2 elements are dates
elseif i<=2*nconstr1
valuecon(i) = vpntM(i-nconstr1,2+varcon(i));
elseif i<=3*nconstr1
valuecon(i) = vpntM(i-2*nconstr1,2+varcon(i));
elseif i<=4*nconstr1
valuecon(i) = vpntM(i-3*nconstr1,2+varcon(i));
elseif i<=5*nconstr1
valuecon(i) = vpntM(i-4*nconstr1,2+varcon(i));
elseif i<=6*nconstr1
valuecon(i) = vpntM(i-5*nconstr1,2+varcon(i));
end
end
% %*** average condtions over,say, options_.ms.freq periods.
% if qmEnd==options_.ms.freq
% vaveM = fn_dataext([yrEnd+1 0],[yrEnd+options_.forecast 0],yact2yre); % average value matrix with dates
% valuecon(1) = vaveM(1,2+varcon(1)); % 2: first 2 elements are dates
% else
% vaveM = fn_dataext([yrEnd 0],[yrEnd+options_.forecast 0],yact2yre); % average value matrix with dates
% yactrem = fn_dataext([yrEnd qmEnd+1],[yrEnd options_.ms.freq],xdatae);
% valuecon(1) = sum(yactrem(:,2+varcon(1)),1)/length(stepcon{1});
% % 2: first 2 elements are dates
% end
% for kj=2:nconstr
% valuecon(kj) = vaveM(kj,2+varcon(kj)); % 2: first 2 elements are dates
% end
else
vpntM = dataext([yrEnd qmEnd+1],[yrEnd qmEnd+2],xdatae); % point value matrix with dates
for i=1:nconstr
if i<=nconstr1
valuecon(i) = vpntM(i,2+varcon(i)); % 2: first 2 elements are dates; Poil
elseif i<=2*nconstr1
valuecon(i) = vpntM(i-nconstr1,2+varcon(i)); % 2: first 2 elements are dates; M2
elseif i<=3*nconstr1
valuecon(i) = vpntM(i-2*nconstr1,2+varcon(i)); % 2: first 2 elements are dates; FFR
elseif i<=4*nconstr1
valuecon(i) = vpntM(i-3*nconstr1,2+varcon(i)); % 2: first 2 elements are dates; CPI
elseif i<=5*nconstr1
valuecon(i) = vpntM(i-4*nconstr1,2+varcon(i)); % 2: first 2 elements are dates; U
elseif i<=5*nconstr1+nconstr2
valuecon(i)=xdata(end,5)+(i-5*nconstr1)*log(1.001)/options_.ms.freq; %CPI
elseif i<=5*nconstr1+2*nconstr2
valuecon(i)=0.0725; %FFR
else
valuecon(i)=xdata(end,6)+(i-5*nconstr1-2*nconstr2)*0.01/nfqm; %U
end
end
%valuecon(i) = 0.060; % 95:01
end
else
valuecon = [];
stepcon = [];
varcon = [];
end
nstepsm = 0; % initializing, the maximum step in all constraints
for i=1:nconstr
nstepsm = max([nstepsm max(stepcon{i})]);
end
if cnum
if options_.ms.real_pseudo_forecast && options_.ms.banact
for i=1:length(banstp{1})
banval{1}(1:length(banstp{1}),1) = ...
yactCalyg(yAg-yFg+1:yAg-yFg+length(banstp{1}),banvar(1)) - 2;
banval{1}(1:length(banstp{1}),2) = ...
yactCalyg(yAg-yFg+1:yAg-yFg+length(banstp{1}),banvar(1)) + 2;
end
end
end
%===================================================
% ML conditional forecast
%===================================================
%/*
[ychat,Estr,rcon] = fn_fcstidcnd(valuecon,stepcon,varcon,nstepsm,...
nconstr,options_.ms.eq_ms,nvar,options_.ms.nlags ,phil,0,0,yforehat,imf3shat,A0hat,Bhat,...
nfqm,options_.ms.tlindx,options_.ms.tlnumber,options_.ms.ncms,options_.ms.eq_cms);
ychate = [fdates ychat];
yachate = [yact1e; ychate]; % actual and condtional forecast
%===== Converted to mg, qg, and calendar yg
[yacyrghate,yacyrhate,yacqmyghate] = fn_datana(yachate,options_.ms.freq,options_.ms.log_var(1:nlogeno),options_.ms.percent_var(1:npereno));
% actual and conditional forecast growth rates
if options_.ms.indxgdls && nconstr
keyindx = [1:nvar];
% conlab=['conditional on' ylab{PorR(1)}];
conlab=['v-conditions'];
figure
fn_foregraph(yafyrghate,yact2yrge,keyindx,rnum,cnum,options_.ms.freq,ylab,forelabel,conlab)
end
if options_.ms.ncsk
Estr = zeros(nfqm,nvar);
Estr(1:2,:) = [
-2.1838 -1.5779 0.53064 -0.099425 -0.69269 -1.0391
1.9407 3.3138 -0.10563 -0.55457 -0.68772 1.3534
];
Estr(3:6,3) = [0.5*ones(1,4)]'; % MD shocks
Estr(3:10,2) = [1.5 1.5 1.5*ones(1,6)]'; % MS shocks
%Estr(3:6,6) = 1*ones(4,1); % U shocks
%Estr(8:11,4) = 1*ones(4,1); % y shocks
%Estr(3:10,2) = [2.5 2.5 1.5*ones(1,6)]'; % MS shocks alone
nn = [nvar options_.ms.noptions_.ms.nlags nfqm];
ycEhat = forefixe(A0hat,Bhat,phil,nn,Estr);
ycEhate = [fdates ycEhat];
yacEhate = [yact1e; ycEhate]; % actual and condtional forecast
%===== Converted to mg, qg, and calendar yg
[yacEyrghate,yacEyrhate,yacEqmyghate] = datana(yacEhate,options_.ms.freq,options_.ms.log_var(1:nlogeno),options_.ms.percent_var(1:npereno));
% actual and conditional forecast growth rates
disp([sprintf('%4.0f %2.0f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n',yacEyrghate')])
if 1
keyindx = [1:nvar];
% conlab=['conditional on' ylab{PorR(1)}];
conlab=['shock-conditions'];
figure
gyrfore(yacEyrghate,yact2yrge,keyindx,rnum,cnum,ylab,forelabel,conlab)
end
end
%-----------------------------------------------------------
% Compute structural shocks for the whole sample period excluding dummy observations.
%-----------------------------------------------------------
ywod = y(options_.ms.dummy_obs +1:end,:); % without dummy observations
phiwod=phi(options_.ms.dummy_obs +1:end,:); % without dummy observations
eplhat=ywod*A0hat-phiwod*Fhat;
qmStartWod = mod(qmStart+options_.ms.nlags ,options_.ms.freq);
if (~qmStartWod)
qmStartWod = options_.ms.freq;
end
yrStartWod = yrStart + floor((qmStart+options_.ms.nlags -1)/options_.ms.freq);
dateswod = fn_dataext([yrStartWod qmStartWod],[yrEnd qmEnd],xdatae(:,[1:2]));
eplhate = [dateswod eplhat];
Aphat = Fhat;
end
%----------------------------------------
% Tests for LR, HQ, Akaike, Schwarz. The following gives a guidance.
% But the computation has to be done in a different M file by exporting fhat's
% from different idfile's.
%----------------------------------------
%
%if ~options_.ms.contemp_reduced_form
% SpHR=A0in'*A0in;
%end
%%
%if ~isnan(SpHR) && ~options_.ms.contemp_reduced_form
% warning(' ')
% disp('Make sure you run the program with options_.ms.contemp_reduced_form =1 first.')
% disp('Otherwise, the following test results such as Schwartz are incorrect.')
% disp('All other results such as A0ml and imfs, however, are correct.')
% disp('Press anykey to contintue or ctrl-c to stop now')
% pause
% load SpHUout
% logLHU=-fss*sum(log(diag(chol(SpHU)))) -0.5*fss*nvar % unrestricted logLH
% logLHR=-fhat % restricted logLH
% tra = reshape(SpHU,nvar*nvar,1)'*reshape(A0*A0',nvar*nvar,1);
% df=(nvar*(nvar+1)/2 - length(a0indx));
% S=2*(logLHU-logLHR);
% SC = (nvar*(nvar+1)/2 - length(a0indx)) * log(fss);
% disp(['T -- effective sample size: ' num2str(fss)])
% disp(['Trace in the overidentified posterior: ' num2str(tra)])
% disp(['Chi2 term -- 2*(logLHU-logLHR): ' num2str(S)])
% disp(['Degrees of freedom: ' num2str(df)])
% disp(['SC -- df*log(T): ' num2str(SC)])
% disp(['Akaike -- 2*df: ' num2str(2*df)])
% disp(['Classical Asymptotic Prob at chi2 term: ' num2str(cdf('chi2',S,df))])
% %*** The following is the eigenanalysis in the difference between
% %*** unrestricted (U) and restricted (R)
% norm(A0'*SpHU*A0-diag(diag(ones(6))))/6;
% norm(SpHU-A0in'*A0in)/6;
% corU = corr(SpHU);
% corR = corr(SpHR);
% [vU,dU]=eigsort(SpHU,1);
% [vR,dR]=eigsort(SpHR,1);
% [log(diag(dU)) log(diag(dR)) log(diag(dU))-log(diag(dR))];
% sum(log(diag(dU)));
% sum(log(diag(dR)));
%else
% disp('To run SC test, turn options_.ms.contemp_reduced_form =1 first and then turn options_.ms.contemp_reduced_form =0')
%end
%***** Simply regression
%X=[phi(:,3) y(:,2)-phi(:,2) y(:,1)-phi(:,7) ones(fss,1)];
%� Y=y(:,3);
%� b=regress(Y,X)
%=== Computes the roots for the whole system.
rootsinv = fn_varoots(Bhat,nvar,options_.ms.nlags )
abs(rootsinv)
bhat =xhat;
n0const=n0; % For constant parameter models.
n0const=n0; % For constant parameter models.
npconst=np; % For constant parameter models.
save outdata_a0dp_const.mat A0hat bhat Aphat n0const
|