diff --git a/matlab/disp_identification.m b/matlab/disp_identification.m index c54be791d54e9f0d6c2040d1da2e58488bb1537d..061db34f0a0081a88bfae8241bfee3a600defa2d 100644 --- a/matlab/disp_identification.m +++ b/matlab/disp_identification.m @@ -1,4 +1,4 @@ -function disp_identification(pdraws, idemodel, idemoments, disp_pcorr) +function disp_identification(pdraws, idemodel, idemoments, name, advanced) % Copyright (C) 2008-2010 Dynare Team % @@ -17,10 +17,10 @@ function disp_identification(pdraws, idemodel, idemoments, disp_pcorr) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <http://www.gnu.org/licenses/>. -global bayestopt_ +global options_ -if nargin<4 | isempty(disp_pcorr), - disp_pcorr=0; +if nargin<5 | isempty(advanced), + advanced=0; end [SampleSize, npar] = size(pdraws); @@ -28,24 +28,18 @@ jok = 0; jokP = 0; jokJ = 0; jokPJ = 0; -if ~any(any(idemodel.ind==0)) - disp(['All parameters are identified in the model in the MC sample (rank of H).' ]), - disp(' ') -end -if ~any(any(idemoments.ind==0)) - disp(['All parameters are identified by J moments in the MC sample (rank of J)' ]), -end + for j=1:npar, - if any(idemodel.ind(j,:)==0), - pno = 100*length(find(idemodel.ind(j,:)==0))/SampleSize; - disp(['Parameter ',bayestopt_.name{j},' is not identified in the model for ',num2str(pno),'% of MC runs!' ]) - disp(' ') - end - if any(idemoments.ind(j,:)==0), - pno = 100*length(find(idemoments.ind(j,:)==0))/SampleSize; - disp(['Parameter ',bayestopt_.name{j},' is not identified by J moments for ',num2str(pno),'% of MC runs!' ]) - disp(' ') - end +% if any(idemodel.ind(j,:)==0), +% pno = 100*length(find(idemodel.ind(j,:)==0))/SampleSize; +% disp(['Parameter ',name{j},' is not identified in the model for ',num2str(pno),'% of MC runs!' ]) +% disp(' ') +% end +% if any(idemoments.ind(j,:)==0), +% pno = 100*length(find(idemoments.ind(j,:)==0))/SampleSize; +% disp(['Parameter ',name{j},' is not identified by J moments for ',num2str(pno),'% of MC runs!' ]) +% disp(' ') +% end if any(idemodel.ind(j,:)==1), iok = find(idemodel.ind(j,:)==1); jok = jok+1; @@ -89,14 +83,32 @@ for j=1:npar, end -dyntable('Multi collinearity in the model:',char('param','min','mean','max'), ... - char(bayestopt_.name(kok)),[mmin, mmean, mmax],10,10,6); -disp(' ') +if any(idemodel.ino), + disp('WARNING !!!') + if SampleSize>1, + disp(['The rank of H (model) is deficient for ', num2str(length(find(idemodel.ino))/SampleSize*100),'% of MC runs!' ]), + else + disp(['The rank of H (model) is deficient!' ]), + end +end for j=1:npar, + if any(idemodel.ind(j,:)==0), + pno = 100*length(find(idemodel.ind(j,:)==0))/SampleSize; + if SampleSize>1 + disp([name{j},' is not identified in the model for ',num2str(pno),'% of MC runs!' ]) + else + disp([name{j},' is not identified in the model!' ]) + end + end iweak = length(find(idemodel.Mco(j,:)'>(1-1.e-10))); if iweak, - disp('WARNING !!!') - disp(['Model derivatives of parameter ',bayestopt_.name{j},' are multi-collinear (with tol = 1.e-10) for ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) +% disp('WARNING !!!') +% disp(['Model derivatives of parameter ',name{j},' are multi-collinear (with tol = 1.e-10) for ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) + if SampleSize>1 + disp([name{j},' is collinear w.r.t. all other params ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) + else + disp([name{j},' is collinear w.r.t. all other params!' ]) + end if npar>(j+1), [ipair, jpair] = find(squeeze(idemodel.Pco(j,j+1:end,:))'>(1-1.e-10)); else @@ -106,47 +118,102 @@ for j=1:npar, for jx=j+1:npar, ixp = find(jx==(jpair+j)); if ~isempty(ixp) - disp(['Model derivatives of parameters [',bayestopt_.name{j},',',bayestopt_.name{jx},'] are collinear (with tol = 1.e-10) for ',num2str(length(ixp)/SampleSize*100),'% of MC runs!' ]) + if SampleSize > 1, + disp([' [',name{j},',',name{jx},'] are PAIRWISE collinear (with tol = 1.e-10) for ',num2str(length(ixp)/SampleSize*100),'% of MC runs!' ]) + else + disp([' [',name{j},',',name{jx},'] are PAIRWISE collinear (with tol = 1.e-10)!' ]) + end end end end end end -disp(' ') +if ~any(idemodel.ino) && ~any(any(idemodel.ind==0)) + disp(['All parameters are identified in the model (rank of H).' ]), + disp(' ') +end -dyntable('Multi collinearity for moments in J:',char('param','min','mean','max'), ... - char(bayestopt_.name(kokJ)),[mminJ, mmeanJ, mmaxJ],10,10,6); -disp(' ') -for j=1:npar, - iweak = length(find(idemoments.Mco(j,:)'>(1-1.e-10))); - if iweak, - disp('WARNING !!!') - disp(['Moment derivatives of parameter ',bayestopt_.name{j},' are multi-collinear (with tol = 1.e-10) for ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) - if npar>(j+1), - [ipair, jpair] = find(squeeze(idemoments.Pco(j,j+1:end,:))'>(1-1.e-10)); - else - [ipair, jpair] = find(squeeze(idemoments.Pco(j,j+1:end,:))>(1-1.e-10)); +if any(idemoments.ino), + disp('WARNING !!!') + if SampleSize > 1, + disp(['The rank of J (moments) is deficient for ', num2str(length(find(idemoments.ino))/SampleSize*100),'% of MC runs!' ]), + else + disp(['The rank of J (moments) is deficient!' ]), + end +end +if any(idemoments.ino), +% disp('WARNING !!!') +% disp(['The rank of J (moments) is deficient for ', num2str(length(find(idemoments.ino))/SampleSize*100),'% of MC runs!' ]), + indno=[]; + for j=1:SampleSize, indno=[indno;idemoments.indno{j}]; end + freqno = mean(indno)*100; + ifreq=find(freqno); +% disp('MOMENT RANK FAILURE DUE TO COLLINEARITY OF PARAMETERS:'); + for j=1:npar, + if any(idemoments.ind(j,:)==0), + pno = 100*length(find(idemoments.ind(j,:)==0))/SampleSize; + if SampleSize > 1 + disp([name{j},' is not identified by J moments for ',num2str(pno),'% of MC runs!' ]) + else + disp([name{j},' is not identified by J moments!' ]) + end end - if ~isempty(jpair), - for jx=j+1:npar, - ixp = find(jx==(jpair+j)); - if ~isempty(ixp) - disp(['Moment derivatives of parameters [',bayestopt_.name{j},',',bayestopt_.name{jx},'] are collinear (with tol = 1.e-10) for ',num2str(length(ixp)/SampleSize*100),'% of MC runs!' ]) + iweak = length(find(idemoments.Mco(j,:)'>(1-1.e-10))); + if iweak, +% disp('WARNING !!!') +% disp(['Moment derivatives of parameter ',name{j},' are multi-collinear (with tol = 1.e-10) for ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) + if SampleSize > 1, + disp([name{j},' is collinear w.r.t. all other params ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) + else + disp([name{j},' is collinear w.r.t. all other params!' ]) + end + if npar>(j+1), + [ipair, jpair] = find(squeeze(idemoments.Pco(j,j+1:end,:))'>(1-1.e-10)); + else + [ipair, jpair] = find(squeeze(idemoments.Pco(j,j+1:end,:))>(1-1.e-10)); + end + if ~isempty(jpair), + for jx=j+1:npar, + ixp = find(jx==(jpair+j)); + if ~isempty(ixp) + if SampleSize > 1 + disp([' [',name{j},',',name{jx},'] are PAIRWISE collinear (with tol = 1.e-10) for ',num2str(length(ixp)/SampleSize*100),'% of MC runs!' ]) + else + disp([' [',name{j},',',name{jx},'] are PAIRWISE collinear (with tol = 1.e-10) !' ]) + end + end end end end end end +if ~any(idemoments.ino) && ~any(any(idemoments.ind==0)) + disp(['All parameters are identified by J moments (rank of J)' ]), + disp(' ') +end + +if ~ options_.noprint & advanced, +disp('Press KEY to continue with identification analysis') +pause; +dyntable('Multi collinearity in the model:',char('param','min','mean','max'), ... + char(name(kok)),[mmin, mmean, mmax],10,10,6); disp(' ') +dyntable('Multi collinearity for moments in J:',char('param','min','mean','max'), ... + char(name(kokJ)),[mminJ, mmeanJ, mmaxJ],10,10,6); +disp(' ') +end -if disp_pcorr, - for j=1:length(kokP), - dyntable([bayestopt_.name{kokP(j)},' pairwise correlations in the model'],char(' ','min','mean','max'), ... - char(bayestopt_.name{jpM{j}}),[pminM{j}' pmeanM{j}' pmaxM{j}'],10,10,3); - end + +% if advanced & (~options_.noprint), +% for j=1:length(kokP), +% dyntable([name{kokP(j)},' pairwise correlations in the model'],char(' ','min','mean','max'), ... +% char(name{jpM{j}}),[pminM{j}' pmeanM{j}' pmaxM{j}'],10,10,3); +% end +% +% for j=1:length(kokPJ), +% dyntable([name{kokPJ(j)},' pairwise correlations in J moments'],char(' ','min','mean','max'), ... +% char(name{jpJ{j}}),[pminJ{j}' pmeanJ{j}' pmaxJ{j}'],10,10,3); +% end +% end +% disp(' ') - for j=1:length(kokPJ), - dyntable([bayestopt_.name{kokPJ(j)},' pairwise correlations in J moments'],char(' ','min','mean','max'), ... - char(bayestopt_.name{jpJ{j}}),[pminJ{j}' pmeanJ{j}' pmaxJ{j}'],10,10,3); - end -end