Home > . > calib.m

calib

PURPOSE ^

SYNOPSIS ^

function M_.Sigma_e = calib(var_indices,targets,var_weights,nar,cova,M_.Sigma_e)

DESCRIPTION ^

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function M_.Sigma_e = calib(var_indices,targets,var_weights,nar,cova,M_.Sigma_e)
0002   global oo_ M_  vx
0003   
0004   ncstr = 0;
0005   ni = size(var_indices,1);
0006   for i=1:nar+3
0007     ncstr = ncstr + size(var_indices{i},1);
0008   end
0009   if cova
0010     if ncstr < M_.exo_nbr*(M_.exo_nbr+1)/2
0011       error(['number of preset variances is smaller than number of shock' ...
0012          ' variances and covariances to be estimated !'])
0013     end
0014   else
0015     if ncstr < M_.exo_nbr
0016       error(['number of preset variances is smaller than number of shock' ...
0017          ' variances to be estimated !'])
0018     end
0019   end
0020   
0021   % computes approximate solution at order 1
0022   dr = resol(oo_.steady_state,0,0,1);
0023   
0024   ghx = dr.ghx;
0025   ghu = dr.ghu;
0026   npred = dr.npred;
0027   nstatic = dr.nstatic;
0028   kstate = dr.kstate;
0029   order = dr.order_var;
0030   iv(order) = [1:M_.endo_nbr];
0031   iv = iv';
0032   nx = size(ghx,2);
0033 
0034   ikx = [nstatic+1:nstatic+npred];
0035   
0036   A = zeros(nx,nx);
0037   A(1:npred,:)=ghx(ikx,:);
0038   offset_r = npred;
0039   offset_c = 0;
0040   i0 = find(kstate(:,2) == M_.maximum_lag+1);
0041   n0 = size(i0,1);
0042   for i=M_.maximum_lag:-1:2
0043     i1 = find(kstate(:,2) == i);
0044     n1 = size(i1,1);
0045     j = zeros(n1,1);
0046     for j1 = 1:n1
0047       j(j1) = find(kstate(i0,1)==kstate(i1(j1),1));
0048     end
0049     A(offset_r+1:offset_r+n1,offset_c+j)=eye(n1);
0050     offset_r = offset_r + n1;
0051     offset_c = offset_c + n0;
0052     i0 = i1;
0053     n0 = n1;
0054   end
0055   ghu1 = [ghu(ikx,:);zeros(nx-npred,M_.exo_nbr)];
0056 %  IA = speye(nx*nx)-kron(A,A);
0057 %  kron_ghu = kron(ghu1,ghu1);
0058   
0059   % vx1 such that vec(sigma_x) = vx1 * vec(M_.Sigma_e) (predetermined vars)
0060 vx1 = [];
0061   % vx1 = IA\kron_ghu;
0062   IA = [];
0063   kron_ghu = [];
0064   
0065   % computes required variables and indices among required variables
0066   iiy = [];
0067   for i=1:nar+3
0068     if i ~= 3 & ~isempty(var_indices{i})
0069       iiy = union(iiy, iv(var_indices{i}(:,1)));
0070     end
0071   end
0072   if ~isempty(var_indices{2})
0073     iiy = union(iiy, iv(var_indices{2}(:,2)));
0074   end
0075   ny = size(iiy,1);
0076 
0077   for i=1:nar+3
0078     if i ~= 3 & ~isempty(var_indices{i})
0079       var_indices{i}(:,1) = indnv(iv(var_indices{i}(:,1)),iiy);
0080     end
0081     if i ~= 2 & i ~= 3 & ~isempty(var_indices{i})
0082       var_indices{i} = sub2ind([ny ny],var_indices{i},var_indices{i});
0083     end
0084   end
0085   if ~isempty(var_indices{2})
0086     var_indices{2}(:,2) = indnv(iv(var_indices{2}(:,2)),iiy);
0087     var_indices{2} = sub2ind([ny ny],var_indices{2}(:,1),var_indices{2}(:,2));
0088   end
0089   if ~isempty(var_indices{3})
0090     var_indices{3} = sub2ind([M_.exo_nbr M_.exo_nbr],var_indices{3}(:,1),var_indices{3}(:,2));
0091   end
0092   if isempty(M_.Sigma_e)
0093     M_.Sigma_e = 0.01*eye(M_.exo_nbr);
0094     b = 0.1*ghu1*ghu1';
0095   else
0096     b = ghu1*M_.Sigma_e*ghu1';
0097     M_.Sigma_e = chol(M_.Sigma_e+1e-14*eye(M_.exo_nbr));
0098   end
0099   options=optimset('LargeScale','on','MaxFunEvals',20000*ny,'TolX',1e-4, ...
0100            'TolFun',1e-4,'Display','Iter','MaxIter',10000);
0101 %  [M_.Sigma_e,f]=fminunc(@calib_obj,M_.Sigma_e,options,A,ghu1,ghx(iiy,:),ghu(iiy,:),targets,var_weights,var_indices,nar);
0102   [M_.Sigma_e,f]=fmincon(@calib_obj,diag(M_.Sigma_e).^2,-eye(M_.exo_nbr),zeros(M_.exo_nbr,1),[],[],[],[],[],options,A,ghu1,ghx(iiy,:),ghu(iiy,:),targets,var_weights,var_indices,nar);
0103   M_.Sigma_e = diag(M_.Sigma_e);
0104   
0105   objective = calib_obj2(diag(M_.Sigma_e),A,ghu1,ghx(iiy,:),ghu(iiy,:),targets,var_weights,var_indices,nar);
0106   disp('CALIBRATION')
0107   disp('')
0108   if ~isempty(var_indices{1})
0109     disp(sprintf('%16s %14s %14s %14s %14s','Std. Dev','Target','Obtained','Diff'));
0110     str = '   ';
0111     for i=1:size(var_indices{1},1)
0112       [i1,i2] = ind2sub([ny ny],var_indices{1}(i));
0113       str = sprintf('%16s: %14.2f %14.2f %14.2f',M_.endo_names(order(iiy(i1)),:),targets{1}(i),objective{1}(i),objective{1}(i)-targets{1}(i));
0114       disp(str);
0115     end
0116   end
0117   if ~isempty(var_indices{2})
0118     disp(sprintf('%32s %14s %14s','Correlations','Target','Obtained','Diff'));
0119     str = '   ';
0120     for i=1:size(var_indices{2},1)
0121       [i1,i2]=ind2sub([ny ny],var_indices{2}(i));
0122       str = sprintf('%16s,%16s: %14.2f %14.2f %14.2f',M_.endo_names(order(iiy(i1)),:), ...
0123             M_.endo_names(order(iiy(i2)),:),targets{2}(i),objective{2}(i),objective{2}(i)-targets{2}(i));
0124       disp(str);
0125     end
0126   end
0127   if ~isempty(var_indices{3})
0128     disp(sprintf('%32s %16s %16s','Constrained shocks (co)variances','Target','Obtained'));
0129     str = '   ';
0130     for i=1:size(var_indices{3},1)
0131       [i1,i2]=ind2sub([M_.exo_nbr M_.exo_nbr],var_indices{3}(i));
0132       if i1 == i2
0133     str = sprintf('%32s: %16.4f %16.4f',M_.exo_name(order(i1),:), ...
0134               targets{3}(i),objective{3}(i));
0135       else
0136     str = sprintf('%16s,%16s: %16.4f %16.4f',M_.exo_name(order(i1),:), ...
0137               M_.exo_name(order(i2), :),targets{3}(i),objective{3}(i));
0138       end
0139       disp(str);
0140     end
0141   end
0142   flag = 1;
0143   for j=4:nar+3
0144     if ~isempty(var_indices{j})
0145       if flag
0146     disp(sprintf('%16s %16s %16s','Autocorrelations','Target','Obtained'));
0147     str = '   ';
0148     flag = 0;
0149       end
0150       for i=1:size(var_indices{j},1)
0151     [i1,i2] = ind2sub([ny ny],var_indices{j}(i));
0152     str = sprintf('%16s(%d): %16.4f %16.4f',M_.endo_names(order(iiy(i1)),:), ...
0153               j-3,targets{j}(i),objective{j}(i));
0154       disp(str);
0155       end
0156     end
0157   end    
0158   
0159   disp('');
0160   disp('Calibrated variances')
0161   str = '   ';
0162   for i=1:M_.exo_nbr
0163     str = [str sprintf('%16s',M_.exo_name(i,:))];
0164   end
0165   disp(str);
0166   disp('');
0167   str = '      ';
0168   for i=1:M_.exo_nbr
0169     str = [str sprintf('%16f',M_.Sigma_e(i,i))];
0170   end
0171   disp(str);
0172   
0173 
0174   
0175   % 10/9/02 MJ

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003