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
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
0057
0058
0059
0060 vx1 = [];
0061
0062 IA = [];
0063 kron_ghu = [];
0064
0065
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
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