identification: separate error code and option

Solves issues with Monte Carlo sampling where error code affected option for later draws
pac-components
Johannes Pfeifer 2021-11-24 19:01:07 +01:00
parent 459d6ded6e
commit c60a1624d1
4 changed files with 167 additions and 129 deletions

View File

@ -24,7 +24,7 @@ function disp_identification(pdraws, ide_reducedform, ide_moments, ide_spectrum,
% This function is called by % This function is called by
% * dynare_identification.m % * dynare_identification.m
% ========================================================================= % =========================================================================
% Copyright (C) 2010-2019 Dynare Team % Copyright (C) 2010-2021 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
@ -82,7 +82,7 @@ for jide = 1:4
%% Set output strings depending on test %% Set output strings depending on test
if jide == 1 if jide == 1
strTest = 'REDUCED-FORM'; strJacobian = 'Tau'; strMeaning = 'Jacobian of steady state and reduced-form solution matrices'; strTest = 'REDUCED-FORM'; strJacobian = 'Tau'; strMeaning = 'Jacobian of steady state and reduced-form solution matrices';
if ~no_identification_reducedform if ~no_identification_reducedform && ~ isempty(fieldnames(ide_reducedform))
noidentification = 0; ide = ide_reducedform; noidentification = 0; ide = ide_reducedform;
if SampleSize == 1 if SampleSize == 1
Jacob = ide.dREDUCEDFORM; Jacob = ide.dREDUCEDFORM;
@ -97,7 +97,7 @@ for jide = 1:4
elseif options_ident.order == 3 elseif options_ident.order == 3
strMeaning = 'Jacobian of first-order minimal system and third-order accurate mean'; strMeaning = 'Jacobian of first-order minimal system and third-order accurate mean';
end end
if ~no_identification_minimal if ~no_identification_minimal && ~(length(ide_minimal.minimal_state_space)==1 && ide_minimal.minimal_state_space==0)
noidentification = 0; ide = ide_minimal; noidentification = 0; ide = ide_minimal;
if SampleSize == 1 if SampleSize == 1
Jacob = ide.dMINIMAL; Jacob = ide.dMINIMAL;
@ -110,7 +110,7 @@ for jide = 1:4
if options_ident.order > 1 if options_ident.order > 1
strTest = 'SPECTRUM (Mutschler, 2015)'; strTest = 'SPECTRUM (Mutschler, 2015)';
end end
if ~no_identification_spectrum if ~no_identification_spectrum && ~isempty(fieldnames(ide_spectrum))
noidentification = 0; ide = ide_spectrum; noidentification = 0; ide = ide_spectrum;
if SampleSize == 1 if SampleSize == 1
Jacob = ide.dSPECTRUM; Jacob = ide.dSPECTRUM;
@ -123,7 +123,7 @@ for jide = 1:4
if options_ident.order > 1 if options_ident.order > 1
strTest = 'MOMENTS (Mutschler, 2015)'; strJacobian = 'Mbar'; strTest = 'MOMENTS (Mutschler, 2015)'; strJacobian = 'Mbar';
end end
if ~no_identification_moments if ~no_identification_moments && ~isempty(fieldnames(ide_moments))
noidentification = 0; ide = ide_moments; noidentification = 0; ide = ide_moments;
if SampleSize == 1 if SampleSize == 1
Jacob = ide.si_dMOMENTS; Jacob = ide.si_dMOMENTS;
@ -136,20 +136,39 @@ for jide = 1:4
if ~noidentification if ~noidentification
%% display problematic parameters computed by identifcation_checks.m %% display problematic parameters computed by identifcation_checks.m
if ~checks_via_subsets if ~checks_via_subsets
if any(ide.ino) || any(any(ide.ind0==0)) || any(any(ide.jweak_pair)) EffectiveSampleSize=SampleSize;
non_minimal_state_space_error=0;
if SampleSize>1 && jide==2 && any(~ide.minimal_state_space)
EffectiveSampleSize=SampleSize-sum(~ide.minimal_state_space);
non_minimal_state_space_error=1;
ide.ino(~ide.minimal_state_space,:)=[];
ide.ind0(~ide.minimal_state_space,:)=[];
ide.jweak_pair(~ide.minimal_state_space,:)=[];
ide.minimal_state_space(~ide.minimal_state_space,:)=[];
end
if any(ide.ino) || any(any(ide.ind0==0)) || any(any(ide.jweak_pair)) || non_minimal_state_space_error
no_warning_message_display=0; no_warning_message_display=0;
skipline() skipline()
disp([upper(strTest), ':']) disp([upper(strTest), ':'])
disp(' !!!WARNING!!!'); disp(' !!!WARNING!!!');
if SampleSize>1 if SampleSize>1
disp([' The rank of ', strJacobian, ' (', strMeaning, ') is deficient for ', num2str(length(find(ide.ino))),' out of ',int2str(SampleSize),' MC runs!' ]), if non_minimal_state_space_error
fprintf(['\n The minimal state space could not be computed for %u out of %u cases.\n'],SampleSize-EffectiveSampleSize,SampleSize);
end
if jide==2
if sum(ide.ino & ide.minimal_state_space)>0
disp([' The rank of ', strJacobian, ' (', strMeaning, ') is deficient for ', num2str(sum(ide.ino & ide.minimal_state_space)),' out of ',int2str(EffectiveSampleSize),' effective MC runs!' ])
end
else
disp([' The rank of ', strJacobian, ' (', strMeaning, ') is deficient for ', num2str(sum(ide.ino)),' out of ',int2str(EffectiveSampleSize),' effective MC runs!' ]),
end
else else
disp([' The rank of ', strJacobian, ' (', strMeaning, ') is deficient!']), disp([' The rank of ', strJacobian, ' (', strMeaning, ') is deficient!']),
end end
skipline() skipline()
for j=1:totparam_nbr for j=1:totparam_nbr
if any(ide.ind0(:,j)==0) if any(ide.ind0(:,j)==0)
pno = 100*length(find(ide.ind0(:,j)==0))/SampleSize; pno = 100*length(find(ide.ind0(:,j)==0))/EffectiveSampleSize;
if SampleSize>1 if SampleSize>1
disp([' ',name{j},' is not identified for ',num2str(pno),'% of MC runs!' ]) disp([' ',name{j},' is not identified for ',num2str(pno),'% of MC runs!' ])
else else
@ -166,7 +185,7 @@ for jide = 1:4
[jx,jy]=find(jmap_pair==j); [jx,jy]=find(jmap_pair==j);
jstore=[jstore jx(1) jy(1)]; jstore=[jstore jx(1) jy(1)];
if SampleSize > 1 if SampleSize > 1
disp([' [',name{jx(1)},',',name{jy(1)},'] are PAIRWISE collinear for ',num2str((iweak)/SampleSize*100),'% of MC runs!' ]) disp([' [',name{jx(1)},',',name{jy(1)},'] are PAIRWISE collinear for ',num2str((iweak)/EffectiveSampleSize*100),'% of MC runs!' ])
else else
disp([' [',name{jx(1)},',',name{jy(1)},'] are PAIRWISE collinear!' ]) disp([' [',name{jx(1)},',',name{jy(1)},'] are PAIRWISE collinear!' ])
end end
@ -176,7 +195,7 @@ for jide = 1:4
iweak = length(find(ide.jweak(:,j))); iweak = length(find(ide.jweak(:,j)));
if iweak && ~ismember(j,jstore) if iweak && ~ismember(j,jstore)
if SampleSize>1 if SampleSize>1
disp([' ',name{j},' is collinear w.r.t. all other parameters for ',num2str(iweak/SampleSize*100),'% of MC runs!' ]) disp([' ',name{j},' is collinear w.r.t. all other parameters for ',num2str(iweak/EffectiveSampleSize*100),'% of MC runs!' ])
else else
disp([' ',name{j},' is collinear w.r.t. all other parameters!' ]) disp([' ',name{j},' is collinear w.r.t. all other parameters!' ])
end end
@ -241,7 +260,7 @@ end
%% Advanced identificaton patterns %% Advanced identification patterns
if SampleSize==1 && options_ident.advanced if SampleSize==1 && options_ident.advanced
skipline() skipline()
for j=1:size(ide_moments.cosndMOMENTS,2) for j=1:size(ide_moments.cosndMOMENTS,2)

View File

@ -481,7 +481,7 @@ if iload <=0
end end
options_ident.tittxt = parameters; %title text for graphs and figures options_ident.tittxt = parameters; %title text for graphs and figures
% perform identification analysis for single point % perform identification analysis for single point
[ide_moments_point, ide_spectrum_point, ide_minimal_point, ide_hess_point, ide_reducedform_point, ide_dynamic_point, derivatives_info_point, info, options_ident] = ... [ide_moments_point, ide_spectrum_point, ide_minimal_point, ide_hess_point, ide_reducedform_point, ide_dynamic_point, derivatives_info_point, info] = ...
identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); %the 1 at the end implies initialization of persistent variables identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); %the 1 at the end implies initialization of persistent variables
if info(1)~=0 if info(1)~=0
% there are errors in the solution algorithm % there are errors in the solution algorithm
@ -498,7 +498,7 @@ if iload <=0
params = prior_draw(); params = prior_draw();
options_ident.tittxt = 'Random_prior_params'; %title text for graphs and figures options_ident.tittxt = 'Random_prior_params'; %title text for graphs and figures
% perform identification analysis % perform identification analysis
[ide_moments_point, ide_spectrum_point, ide_minimal_point, ide_hess_point, ide_reducedform_point, ide_dynamic_point, derivatives_info_point, info, options_ident] = ... [ide_moments_point, ide_spectrum_point, ide_minimal_point, ide_hess_point, ide_reducedform_point, ide_dynamic_point, derivatives_info_point, info] = ...
identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1);
end end
end end
@ -552,7 +552,7 @@ if iload <=0
end end
options_ident.tittxt = []; % clear title text for graphs and figures options_ident.tittxt = []; % clear title text for graphs and figures
% run identification analysis % run identification analysis
[ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide_dynamic, ide_derivatives_info, info, options_MC] = ... [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide_dynamic, ide_derivatives_info, info, error_indicator] = ...
identification_analysis(params, indpmodel, indpstderr, indpcorr, options_MC, dataset_info, prior_exist, 0); % the 0 implies that we do not initialize persistent variables anymore identification_analysis(params, indpmodel, indpstderr, indpcorr, options_MC, dataset_info, prior_exist, 0); % the 0 implies that we do not initialize persistent variables anymore
if iteration==0 && info(1)==0 % preallocate storage in the first admissable run if iteration==0 && info(1)==0 % preallocate storage in the first admissable run
@ -564,7 +564,7 @@ if iload <=0
STO_si_dDYNAMIC = zeros([size(ide_dynamic.si_dDYNAMIC, 1), modparam_nbr, MAX_RUNS_BEFORE_SAVE_TO_FILE]); STO_si_dDYNAMIC = zeros([size(ide_dynamic.si_dDYNAMIC, 1), modparam_nbr, MAX_RUNS_BEFORE_SAVE_TO_FILE]);
STO_DYNAMIC = zeros(size(ide_dynamic.DYNAMIC, 1), SampleSize); STO_DYNAMIC = zeros(size(ide_dynamic.DYNAMIC, 1), SampleSize);
IDE_DYNAMIC.ind_dDYNAMIC = ide_dynamic.ind_dDYNAMIC; IDE_DYNAMIC.ind_dDYNAMIC = ide_dynamic.ind_dDYNAMIC;
IDE_DYNAMIC.in0 = zeros(SampleSize, modparam_nbr); IDE_DYNAMIC.ino = zeros(SampleSize, modparam_nbr);
IDE_DYNAMIC.ind0 = zeros(SampleSize, modparam_nbr); IDE_DYNAMIC.ind0 = zeros(SampleSize, modparam_nbr);
IDE_DYNAMIC.jweak = zeros(SampleSize, modparam_nbr); IDE_DYNAMIC.jweak = zeros(SampleSize, modparam_nbr);
IDE_DYNAMIC.jweak_pair = zeros(SampleSize, modparam_nbr*(modparam_nbr+1)/2); IDE_DYNAMIC.jweak_pair = zeros(SampleSize, modparam_nbr*(modparam_nbr+1)/2);
@ -576,7 +576,7 @@ if iload <=0
STO_si_dREDUCEDFORM = zeros([size(ide_reducedform.si_dREDUCEDFORM, 1), totparam_nbr, MAX_RUNS_BEFORE_SAVE_TO_FILE]); STO_si_dREDUCEDFORM = zeros([size(ide_reducedform.si_dREDUCEDFORM, 1), totparam_nbr, MAX_RUNS_BEFORE_SAVE_TO_FILE]);
STO_REDUCEDFORM = zeros(size(ide_reducedform.REDUCEDFORM, 1), SampleSize); STO_REDUCEDFORM = zeros(size(ide_reducedform.REDUCEDFORM, 1), SampleSize);
IDE_REDUCEDFORM.ind_dREDUCEDFORM = ide_reducedform.ind_dREDUCEDFORM; IDE_REDUCEDFORM.ind_dREDUCEDFORM = ide_reducedform.ind_dREDUCEDFORM;
IDE_REDUCEDFORM.in0 = zeros(SampleSize, 1); IDE_REDUCEDFORM.ino = zeros(SampleSize, 1);
IDE_REDUCEDFORM.ind0 = zeros(SampleSize, totparam_nbr); IDE_REDUCEDFORM.ind0 = zeros(SampleSize, totparam_nbr);
IDE_REDUCEDFORM.jweak = zeros(SampleSize, totparam_nbr); IDE_REDUCEDFORM.jweak = zeros(SampleSize, totparam_nbr);
IDE_REDUCEDFORM.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2); IDE_REDUCEDFORM.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2);
@ -593,7 +593,7 @@ if iload <=0
STO_si_dMOMENTS = zeros([size(ide_moments.si_dMOMENTS, 1), totparam_nbr, MAX_RUNS_BEFORE_SAVE_TO_FILE]); STO_si_dMOMENTS = zeros([size(ide_moments.si_dMOMENTS, 1), totparam_nbr, MAX_RUNS_BEFORE_SAVE_TO_FILE]);
STO_MOMENTS = zeros(size(ide_moments.MOMENTS, 1), SampleSize); STO_MOMENTS = zeros(size(ide_moments.MOMENTS, 1), SampleSize);
IDE_MOMENTS.ind_dMOMENTS = ide_moments.ind_dMOMENTS; IDE_MOMENTS.ind_dMOMENTS = ide_moments.ind_dMOMENTS;
IDE_MOMENTS.in0 = zeros(SampleSize, 1); IDE_MOMENTS.ino = zeros(SampleSize, 1);
IDE_MOMENTS.ind0 = zeros(SampleSize, totparam_nbr); IDE_MOMENTS.ind0 = zeros(SampleSize, totparam_nbr);
IDE_MOMENTS.jweak = zeros(SampleSize, totparam_nbr); IDE_MOMENTS.jweak = zeros(SampleSize, totparam_nbr);
IDE_MOMENTS.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2); IDE_MOMENTS.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2);
@ -611,7 +611,7 @@ if iload <=0
if ~options_MC.no_identification_spectrum if ~options_MC.no_identification_spectrum
STO_dSPECTRUM = zeros([size(ide_spectrum.dSPECTRUM, 1), size(ide_spectrum.dSPECTRUM, 2), MAX_RUNS_BEFORE_SAVE_TO_FILE]); STO_dSPECTRUM = zeros([size(ide_spectrum.dSPECTRUM, 1), size(ide_spectrum.dSPECTRUM, 2), MAX_RUNS_BEFORE_SAVE_TO_FILE]);
IDE_SPECTRUM.ind_dSPECTRUM = ide_spectrum.ind_dSPECTRUM; IDE_SPECTRUM.ind_dSPECTRUM = ide_spectrum.ind_dSPECTRUM;
IDE_SPECTRUM.in0 = zeros(SampleSize, 1); IDE_SPECTRUM.ino = zeros(SampleSize, 1);
IDE_SPECTRUM.ind0 = zeros(SampleSize, totparam_nbr); IDE_SPECTRUM.ind0 = zeros(SampleSize, totparam_nbr);
IDE_SPECTRUM.jweak = zeros(SampleSize, totparam_nbr); IDE_SPECTRUM.jweak = zeros(SampleSize, totparam_nbr);
IDE_SPECTRUM.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2); IDE_SPECTRUM.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2);
@ -626,12 +626,13 @@ if iload <=0
if ~options_MC.no_identification_minimal if ~options_MC.no_identification_minimal
STO_dMINIMAL = zeros([size(ide_minimal.dMINIMAL, 1), size(ide_minimal.dMINIMAL, 2), MAX_RUNS_BEFORE_SAVE_TO_FILE]); STO_dMINIMAL = zeros([size(ide_minimal.dMINIMAL, 1), size(ide_minimal.dMINIMAL, 2), MAX_RUNS_BEFORE_SAVE_TO_FILE]);
IDE_MINIMAL.ind_dMINIMAL = ide_minimal.ind_dMINIMAL; IDE_MINIMAL.ind_dMINIMAL = ide_minimal.ind_dMINIMAL;
IDE_MINIMAL.in0 = zeros(SampleSize, 1); IDE_MINIMAL.ino = zeros(SampleSize, 1);
IDE_MINIMAL.ind0 = zeros(SampleSize, totparam_nbr); IDE_MINIMAL.ind0 = zeros(SampleSize, totparam_nbr);
IDE_MINIMAL.jweak = zeros(SampleSize, totparam_nbr); IDE_MINIMAL.jweak = zeros(SampleSize, totparam_nbr);
IDE_MINIMAL.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2); IDE_MINIMAL.jweak_pair = zeros(SampleSize, totparam_nbr*(totparam_nbr+1)/2);
IDE_MINIMAL.cond = zeros(SampleSize, 1); IDE_MINIMAL.cond = zeros(SampleSize, 1);
IDE_MINIMAL.Mco = zeros(SampleSize, totparam_nbr); IDE_MINIMAL.Mco = zeros(SampleSize, totparam_nbr);
IDE_MINIMAL.minimal_state_space = zeros(SampleSize, 1);
else else
STO_dMINIMAL = {}; STO_dMINIMAL = {};
IDE_MINIMAL = {}; IDE_MINIMAL = {};
@ -654,7 +655,7 @@ if iload <=0
IDE_DYNAMIC.Mco(iteration,:) = ide_dynamic.Mco; IDE_DYNAMIC.Mco(iteration,:) = ide_dynamic.Mco;
% store results for reduced form % store results for reduced form
if ~options_MC.no_identification_reducedform if ~options_MC.no_identification_reducedform && ~error_indicator.identification_reducedform
STO_REDUCEDFORM(:,iteration) = ide_reducedform.REDUCEDFORM; STO_REDUCEDFORM(:,iteration) = ide_reducedform.REDUCEDFORM;
STO_si_dREDUCEDFORM(:,:,run_index) = ide_reducedform.si_dREDUCEDFORM; STO_si_dREDUCEDFORM(:,:,run_index) = ide_reducedform.si_dREDUCEDFORM;
IDE_REDUCEDFORM.cond(iteration,1) = ide_reducedform.cond; IDE_REDUCEDFORM.cond(iteration,1) = ide_reducedform.cond;
@ -666,7 +667,7 @@ if iload <=0
end end
% store results for moments % store results for moments
if ~options_MC.no_identification_moments if ~options_MC.no_identification_moments && ~error_indicator.identification_moments
STO_MOMENTS(:,iteration) = ide_moments.MOMENTS; STO_MOMENTS(:,iteration) = ide_moments.MOMENTS;
STO_si_dMOMENTS(:,:,run_index) = ide_moments.si_dMOMENTS; STO_si_dMOMENTS(:,:,run_index) = ide_moments.si_dMOMENTS;
IDE_MOMENTS.cond(iteration,1) = ide_moments.cond; IDE_MOMENTS.cond(iteration,1) = ide_moments.cond;
@ -680,7 +681,7 @@ if iload <=0
end end
% store results for spectrum % store results for spectrum
if ~options_MC.no_identification_spectrum if ~options_MC.no_identification_spectrum && ~error_indicator.identification_spectrum
STO_dSPECTRUM(:,:,run_index) = ide_spectrum.dSPECTRUM; STO_dSPECTRUM(:,:,run_index) = ide_spectrum.dSPECTRUM;
IDE_SPECTRUM.cond(iteration,1) = ide_spectrum.cond; IDE_SPECTRUM.cond(iteration,1) = ide_spectrum.cond;
IDE_SPECTRUM.ino(iteration,1) = ide_spectrum.ino; IDE_SPECTRUM.ino(iteration,1) = ide_spectrum.ino;
@ -691,14 +692,19 @@ if iload <=0
end end
% store results for minimal system % store results for minimal system
if ~options_MC.no_identification_minimal if ~options_MC.no_identification_minimal
STO_dMINIMAL(:,:,run_index) = ide_minimal.dMINIMAL; if ~error_indicator.identification_minimal
IDE_MINIMAL.cond(iteration,1) = ide_minimal.cond; STO_dMINIMAL(:,:,run_index) = ide_minimal.dMINIMAL;
IDE_MINIMAL.ino(iteration,1) = ide_minimal.ino; IDE_MINIMAL.cond(iteration,1) = ide_minimal.cond;
IDE_MINIMAL.ind0(iteration,:) = ide_minimal.ind0; IDE_MINIMAL.ino(iteration,1) = ide_minimal.ino;
IDE_MINIMAL.jweak(iteration,:) = ide_minimal.jweak; IDE_MINIMAL.ind0(iteration,:) = ide_minimal.ind0;
IDE_MINIMAL.jweak_pair(iteration,:) = ide_minimal.jweak_pair; IDE_MINIMAL.jweak(iteration,:) = ide_minimal.jweak;
IDE_MINIMAL.Mco(iteration,:) = ide_minimal.Mco; IDE_MINIMAL.jweak_pair(iteration,:) = ide_minimal.jweak_pair;
IDE_MINIMAL.Mco(iteration,:) = ide_minimal.Mco;
IDE_MINIMAL.minimal_state_space(iteration,:) = ide_minimal.minimal_state_space;
else
IDE_MINIMAL.minimal_state_space(iteration,:) = ide_minimal.minimal_state_space;
end
end end
% save results to file: either to avoid running into memory issues, i.e. (run_index==MAX_RUNS_BEFORE_SAVE_TO_FILE) or if finished (iteration==SampleSize) % save results to file: either to avoid running into memory issues, i.e. (run_index==MAX_RUNS_BEFORE_SAVE_TO_FILE) or if finished (iteration==SampleSize)
@ -900,7 +906,7 @@ if SampleSize > 1
fprintf('\nTesting %s.\n',tittxt); fprintf('\nTesting %s.\n',tittxt);
if ~iload if ~iload
options_ident.tittxt = tittxt; %title text for graphs and figures options_ident.tittxt = tittxt; %title text for graphs and figures
[ide_moments_max, ide_spectrum_max, ide_minimal_max, ide_hess_max, ide_reducedform_max, ide_dynamic_max, derivatives_info_max, info_max, options_ident] = ... [ide_moments_max, ide_spectrum_max, ide_minimal_max, ide_hess_max, ide_reducedform_max, ide_dynamic_max, derivatives_info_max, info_max] = ...
identification_analysis(pdraws(jmax,:), indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); %the 1 at the end initializes some persistent variables identification_analysis(pdraws(jmax,:), indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); %the 1 at the end initializes some persistent variables
save([IdentifDirectoryName '/' fname '_identif.mat'], 'ide_hess_max', 'ide_moments_max', 'ide_spectrum_max', 'ide_minimal_max','ide_reducedform_max', 'ide_dynamic_max', 'jmax', '-append'); save([IdentifDirectoryName '/' fname '_identif.mat'], 'ide_hess_max', 'ide_moments_max', 'ide_spectrum_max', 'ide_minimal_max','ide_reducedform_max', 'ide_dynamic_max', 'jmax', '-append');
end end
@ -918,7 +924,7 @@ if SampleSize > 1
fprintf('Testing %s.\n',tittxt); fprintf('Testing %s.\n',tittxt);
if ~iload if ~iload
options_ident.tittxt = tittxt; %title text for graphs and figures options_ident.tittxt = tittxt; %title text for graphs and figures
[ide_moments_min, ide_spectrum_min, ide_minimal_min, ide_hess_min, ide_reducedform_min, ide_dynamic_min, derivatives_info_min, info_min, options_ident] = ... [ide_moments_min, ide_spectrum_min, ide_minimal_min, ide_hess_min, ide_reducedform_min, ide_dynamic_min, derivatives_info_min, info_min] = ...
identification_analysis(pdraws(jmin,:), indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); %the 1 at the end initializes persistent variables identification_analysis(pdraws(jmin,:), indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); %the 1 at the end initializes persistent variables
save([IdentifDirectoryName '/' fname '_identif.mat'], 'ide_hess_min', 'ide_moments_min','ide_spectrum_min','ide_minimal_min','ide_reducedform_min', 'ide_dynamic_min', 'jmin', '-append'); save([IdentifDirectoryName '/' fname '_identif.mat'], 'ide_hess_min', 'ide_moments_min','ide_spectrum_min','ide_minimal_min','ide_reducedform_min', 'ide_dynamic_min', 'jmin', '-append');
end end
@ -940,7 +946,7 @@ if SampleSize > 1
fprintf('\nTesting %s.\n',tittxt); fprintf('\nTesting %s.\n',tittxt);
if ~iload if ~iload
options_ident.tittxt = tittxt; %title text for graphs and figures options_ident.tittxt = tittxt; %title text for graphs and figures
[ide_moments_(j), ide_spectrum_(j), ide_minimal_(j), ide_hess_(j), ide_reducedform_(j), ide_dynamic_(j), derivatives_info_(j), info_resolve, options_ident] = ... [ide_moments_(j), ide_spectrum_(j), ide_minimal_(j), ide_hess_(j), ide_reducedform_(j), ide_dynamic_(j), derivatives_info_(j), info_resolve] = ...
identification_analysis(pdraws(jcrit(j),:), indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1); identification_analysis(pdraws(jcrit(j),:), indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, 1);
end end
advanced0 = options_ident.advanced; options_ident.advanced = 1; %make sure advanced setting is on advanced0 = options_ident.advanced; options_ident.advanced = 1; %make sure advanced setting is on

View File

@ -1,5 +1,5 @@
function [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide_dynamic, derivatives_info, info, options_ident] = identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, init) function [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide_dynamic, derivatives_info, info, error_indicator] = identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, init)
% [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide_dynamic, derivatives_info, info, options_ident] = identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, init) % [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide_dynamic, derivatives_info, info, error_indicator] = identification_analysis(params, indpmodel, indpstderr, indpcorr, options_ident, dataset_info, prior_exist, init)
% ------------------------------------------------------------------------- % -------------------------------------------------------------------------
% This function wraps all identification analysis, i.e. it % This function wraps all identification analysis, i.e. it
% (1) wraps functions for the theoretical identification analysis based on moments (Iskrev, 2010), % (1) wraps functions for the theoretical identification analysis based on moments (Iskrev, 2010),
@ -47,8 +47,8 @@ function [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide
% info about first-order perturbation derivatives, used in dsge_likelihood.m % info about first-order perturbation derivatives, used in dsge_likelihood.m
% * info [integer] % * info [integer]
% output from dynare_resolve % output from dynare_resolve
% * options_ident [structure] % * error_indicator [structure]
% updated identification options % indicator on problems
% ------------------------------------------------------------------------- % -------------------------------------------------------------------------
% This function is called by % This function is called by
% * dynare_identification.m % * dynare_identification.m
@ -71,7 +71,7 @@ function [ide_moments, ide_spectrum, ide_minimal, ide_hess, ide_reducedform, ide
% * stoch_simul % * stoch_simul
% * vec % * vec
% ========================================================================= % =========================================================================
% Copyright (C) 2008-2020 Dynare Team % Copyright (C) 2008-2021 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
@ -115,7 +115,6 @@ if ~isempty(estim_params_)
end end
%get options (see dynare_identification.m for description of options) %get options (see dynare_identification.m for description of options)
order = options_ident.order;
nlags = options_ident.ar; nlags = options_ident.ar;
advanced = options_ident.advanced; advanced = options_ident.advanced;
replic = options_ident.replic; replic = options_ident.replic;
@ -126,11 +125,11 @@ checks_via_subsets = options_ident.checks_via_subsets;
tol_deriv = options_ident.tol_deriv; tol_deriv = options_ident.tol_deriv;
tol_rank = options_ident.tol_rank; tol_rank = options_ident.tol_rank;
tol_sv = options_ident.tol_sv; tol_sv = options_ident.tol_sv;
no_identification_strength = options_ident.no_identification_strength; error_indicator.identification_strength=0;
no_identification_reducedform = options_ident.no_identification_reducedform; error_indicator.identification_reducedform=0;
no_identification_moments = options_ident.no_identification_moments; error_indicator.identification_moments=0;
no_identification_minimal = options_ident.no_identification_minimal; error_indicator.identification_minimal=0;
no_identification_spectrum = options_ident.no_identification_spectrum; error_indicator.identification_spectrum=0;
%Compute linear approximation and fill dr structure %Compute linear approximation and fill dr structure
[oo_.dr,info,M_,oo_] = compute_decision_rules(M_,options_,oo_); [oo_.dr,info,M_,oo_] = compute_decision_rules(M_,options_,oo_);
@ -140,71 +139,71 @@ if info(1) == 0 %no errors in solution
[MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs); [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs);
if isempty(dMINIMAL) if isempty(dMINIMAL)
% Komunjer and Ng is not computed if (1) minimality conditions are not fullfilled or (2) there are more shocks and measurement errors than observables, so we need to reset options % Komunjer and Ng is not computed if (1) minimality conditions are not fullfilled or (2) there are more shocks and measurement errors than observables, so we need to reset options
no_identification_minimal = 1; error_indicator.identification_minimal = 1;
options_ident.no_identification_minimal = 1; %options_ident.no_identification_minimal = 1;
end end
if init if init
%check stationarity %check stationarity
if ~no_identification_moments if ~options_ident.no_identification_moments
if any(any(isnan(MOMENTS))) if any(any(isnan(MOMENTS)))
if options_.diffuse_filter == 1 % use options_ as it inherits diffuse_filter from options_ident if set by user if options_.diffuse_filter == 1 % use options_ as it inherits diffuse_filter from options_ident if set by user
error('There are NaN''s in the theoretical moments. Make sure that for non-stationary models stationary transformations of non-stationary observables are used for checking identification. [TIP: use first differences].') error('There are NaN''s in the theoretical moments. Make sure that for non-stationary models stationary transformations of non-stationary observables are used for checking identification. [TIP: use first differences].')
else else
error('There are NaN''s in the theoretical moments. Please check whether your model has units roots, and you forgot to set diffuse_filter=1.' ) error('There are NaN''s in the theoretical moments. Please check whether your model has units roots, and you forgot to set diffuse_filter=1.' )
end end
error_indicator.identification_moments=1;
end end
ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %index for non-zero rows ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %index for non-zero rows
if isempty(ind_dMOMENTS) && any(any(isnan(dMOMENTS))) if isempty(ind_dMOMENTS) && any(any(isnan(dMOMENTS)))
error('There are NaN in the dMOMENTS matrix.' ) error('There are NaN in the dMOMENTS matrix.')
end error_indicator.identification_moments=1;
end
end end
if ~no_identification_spectrum if ~options_ident.no_identification_spectrum
ind_dSPECTRUM = (find(max(abs(dSPECTRUM'),[],1) > tol_deriv)); %index for non-zero rows ind_dSPECTRUM = (find(max(abs(dSPECTRUM'),[],1) > tol_deriv)); %index for non-zero rows
if any(any(isnan(dSPECTRUM))) if any(any(isnan(dSPECTRUM)))
warning_SPECTRUM = 'WARNING: There are NaN in the dSPECTRUM matrix. Note that identification based on spectrum does not support non-stationary models (yet).\n'; warning_SPECTRUM = 'WARNING: There are NaN in the dSPECTRUM matrix. Note that identification based on spectrum does not support non-stationary models (yet).\n';
warning_SPECTRUM = [warning_SPECTRUM ' Skip identification analysis based on spectrum.\n']; warning_SPECTRUM = [warning_SPECTRUM ' Skip identification analysis based on spectrum.\n'];
fprintf(warning_SPECTRUM); fprintf(warning_SPECTRUM);
%reset options to neither display nor plot dSPECTRUM anymore %set indicator to neither display nor plot dSPECTRUM anymore
no_identification_spectrum = 1; error_indicator.identification_spectrum = 1;
options_ident.no_identification_spectrum = 1;
end end
end end
if ~no_identification_minimal if ~options_ident.no_identification_minimal
ind_dMINIMAL = (find(max(abs(dMINIMAL'),[],1) > tol_deriv)); %index for non-zero rows ind_dMINIMAL = (find(max(abs(dMINIMAL'),[],1) > tol_deriv)); %index for non-zero rows
if any(any(isnan(dMINIMAL))) if any(any(isnan(dMINIMAL)))
warning_MINIMAL = 'WARNING: There are NaN in the dMINIMAL matrix. Note that identification based on minimal system does not support non-stationary models (yet).\n'; warning_MINIMAL = 'WARNING: There are NaN in the dMINIMAL matrix. Note that identification based on minimal system does not support non-stationary models (yet).\n';
warning_MINIMAL = [warning_MINIMAL ' Skip identification analysis based on minimal system.\n']; warning_MINIMAL = [warning_MINIMAL ' Skip identification analysis based on minimal system.\n'];
fprintf(warning_MINIMAL); fprintf(warning_MINIMAL);
%reset options to neither display nor plot dMINIMAL anymore %set indicator to neither display nor plot dMINIMAL anymore
no_identification_minimal = 1; error_indicator.identification_minimal = 1;
options_ident.no_identification_minimal = 1;
end end
end end
if no_identification_moments && no_identification_minimal && no_identification_spectrum %The following cannot be reached yet due to erroring out when
%error_indicator.identification_moments is triggered
if error_indicator.identification_moments && error_indicator.identification_minimal && error_indicator.identification_spectrum
%display error if all three criteria fail %display error if all three criteria fail
error(sprintf('identification_analyis: Stationarity condition(s) failed and/or diffuse_filter option missing.\nMake sure that for non-stationary models stationary transformations of non-stationary observables are used for checking identification.\n[TIP: use first differences].')); error(sprintf('identification_analyis: Stationarity condition(s) failed and/or diffuse_filter option missing.\nMake sure that for non-stationary models stationary transformations of non-stationary observables are used for checking identification.\n[TIP: use first differences].'));
end end
% Check order conditions % Check order conditions
if ~no_identification_moments if ~options_ident.no_identification_moments && ~error_indicator.identification_moments
%check order condition of Iskrev (2010) %check order condition of Iskrev (2010)
while length(ind_dMOMENTS) < totparam_nbr && nlags < 10 while length(ind_dMOMENTS) < totparam_nbr && nlags < 10
%Try to add lags to autocovariogram if order condition fails %Try to add lags to autocovariogram if order condition fails
disp('The number of moments with non-zero derivative is smaller than the number of parameters') disp('The number of moments with non-zero derivative is smaller than the number of parameters')
disp(['Try increasing ar = ', int2str(nlags+1)]) disp(['Try increasing ar = ', int2str(nlags+1)])
nlags = nlags + 1; nlags = nlags + 1;
options_ident.no_identification_minimal = 1; %do not recompute dMINIMAL options_ident_local=options_ident;
options_ident.no_identification_spectrum = 1; %do not recompute dSPECTRUM options_ident_local.no_identification_minimal = 1; %do not recompute dMINIMAL
options_ident.ar = nlags; %store new lag number options_ident_local.no_identification_spectrum = 1; %do not recompute dSPECTRUM
options_.ar = nlags; %store new lag number options_ident_local.ar = nlags; %store new lag number
[~, ~, ~, ~, ~, ~, MOMENTS, dMOMENTS, ~, ~, ~, ~] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs); options_.ar = nlags; %store new lag number
[~, ~, ~, ~, ~, ~, MOMENTS, dMOMENTS, ~, ~, ~, ~] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident_local, indpmodel, indpstderr, indpcorr, indvobs);
ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %new index with non-zero rows ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %new index with non-zero rows
end end
options_ident.no_identification_minimal = no_identification_minimal; % reset option to original setting
options_ident.no_identification_spectrum = no_identification_spectrum; % reset option to original setting
if length(ind_dMOMENTS) < totparam_nbr if length(ind_dMOMENTS) < totparam_nbr
warning_MOMENTS = 'WARNING: Order condition for dMOMENTS failed: There are not enough moments and too many parameters.\n'; warning_MOMENTS = 'WARNING: Order condition for dMOMENTS failed: There are not enough moments and too many parameters.\n';
warning_MOMENTS = [warning_MOMENTS ' The number of moments with non-zero derivative is smaller than the number of parameters up to 10 lags.\n']; warning_MOMENTS = [warning_MOMENTS ' The number of moments with non-zero derivative is smaller than the number of parameters up to 10 lags.\n'];
@ -212,31 +211,30 @@ if info(1) == 0 %no errors in solution
warning_MOMENTS = [warning_MOMENTS ' Skip identification analysis based on moments.\n']; warning_MOMENTS = [warning_MOMENTS ' Skip identification analysis based on moments.\n'];
warning_MOMENTS = [warning_MOMENTS ' Skip identification strenght analysis.\n']; warning_MOMENTS = [warning_MOMENTS ' Skip identification strenght analysis.\n'];
fprintf(warning_MOMENTS); fprintf(warning_MOMENTS);
%reset options to neither display nor plot dMOMENTS anymore %set indicator to neither display nor plot dMOMENTS anymore
no_identification_moments = 1; error_indicator.identification_moments = 1;
options_ident.no_identification_moments = 1; %options_ident.no_identification_moments = 1;
no_identification_strength = 1; error_indicator.identification_strength = 1;
options_ident.no_identification_strength = 1; %options_ident.no_identification_strength = 1;
end end
end end
if ~no_identification_minimal if ~options_ident.no_identification_minimal && ~error_indicator.identification_minimal
if length(ind_dMINIMAL) < size(dMINIMAL,2) if length(ind_dMINIMAL) < size(dMINIMAL,2)
warning_MINIMAL = 'WARNING: Order condition for dMINIMAL failed: There are too many parameters or too few observable variables.\n'; warning_MINIMAL = 'WARNING: Order condition for dMINIMAL failed: There are too many parameters or too few observable variables.\n';
warning_MINIMAL = [warning_MINIMAL ' The number of minimal system elements with non-zero derivative is smaller than the number of parameters.\n']; warning_MINIMAL = [warning_MINIMAL ' The number of minimal system elements with non-zero derivative is smaller than the number of parameters.\n'];
warning_MINIMAL = [warning_MINIMAL ' Either reduce the list of parameters, or increase number of observables.\n']; warning_MINIMAL = [warning_MINIMAL ' Either reduce the list of parameters, or increase number of observables.\n'];
warning_MINIMAL = [warning_MINIMAL ' Skip identification analysis based on minimal state space system.\n']; warning_MINIMAL = [warning_MINIMAL ' Skip identification analysis based on minimal state space system.\n'];
fprintf(warning_MINIMAL); fprintf(warning_MINIMAL);
%resest options to neither display nor plot dMINIMAL anymore %set indicator to neither display nor plot dMINIMAL anymore
no_identification_minimal = 1; error_indicator.identification_minimal = 1;
options_ident.no_identification_minimal = 1;
end end
end end
%Note that there is no order condition for dSPECTRUM, as the matrix is always of dimension totparam_nbr by totparam_nbr %Note that there is no order condition for dSPECTRUM, as the matrix is always of dimension totparam_nbr by totparam_nbr
if no_identification_moments && no_identification_minimal && no_identification_spectrum if error_indicator.identification_moments && error_indicator.identification_minimal && error_indicator.identification_spectrum
%error if all three criteria fail %error if all three criteria fail
error('identification_analyis: Order condition(s) failed'); error('identification_analyis: Order condition(s) failed');
end end
if ~no_identification_reducedform if ~options_ident.no_identification_reducedform && ~error_indicator.identification_reducedform
ind_dREDUCEDFORM = (find(max(abs(dREDUCEDFORM'),[],1) > tol_deriv)); %index with non-zero rows ind_dREDUCEDFORM = (find(max(abs(dREDUCEDFORM'),[],1) > tol_deriv)); %index with non-zero rows
end end
ind_dDYNAMIC = (find(max(abs(dDYNAMIC'),[],1) > tol_deriv)); %index with non-zero rows ind_dDYNAMIC = (find(max(abs(dDYNAMIC'),[],1) > tol_deriv)); %index with non-zero rows
@ -244,16 +242,16 @@ if info(1) == 0 %no errors in solution
DYNAMIC = DYNAMIC(ind_dDYNAMIC); %focus only on non-zero entries DYNAMIC = DYNAMIC(ind_dDYNAMIC); %focus only on non-zero entries
si_dDYNAMIC = (dDYNAMIC(ind_dDYNAMIC,:)); %focus only on non-zero rows si_dDYNAMIC = (dDYNAMIC(ind_dDYNAMIC,:)); %focus only on non-zero rows
if ~no_identification_reducedform if ~options_ident.no_identification_reducedform && ~error_indicator.identification_reducedform
REDUCEDFORM = REDUCEDFORM(ind_dREDUCEDFORM); %focus only on non-zero entries REDUCEDFORM = REDUCEDFORM(ind_dREDUCEDFORM); %focus only on non-zero entries
si_dREDUCEDFORM = (dREDUCEDFORM(ind_dREDUCEDFORM,:)); %focus only on non-zero rows si_dREDUCEDFORM = (dREDUCEDFORM(ind_dREDUCEDFORM,:)); %focus only on non-zero rows
end end
if ~no_identification_moments if ~options_ident.no_identification_moments && ~error_indicator.identification_moments
MOMENTS = MOMENTS(ind_dMOMENTS); %focus only on non-zero entries MOMENTS = MOMENTS(ind_dMOMENTS); %focus only on non-zero entries
si_dMOMENTS = (dMOMENTS(ind_dMOMENTS,:)); %focus only on non-zero derivatives si_dMOMENTS = (dMOMENTS(ind_dMOMENTS,:)); %focus only on non-zero derivatives
%% MOMENTS IDENTIFICATION STRENGTH ANALYSIS %% MOMENTS IDENTIFICATION STRENGTH ANALYSIS
if ~no_identification_strength && init %only for initialization of persistent vars if ~options_ident.no_identification_strength && ~error_indicator.identification_strength && init %only for initialization of persistent vars
ide_strength_dMOMENTS = NaN(1,totparam_nbr); %initialize ide_strength_dMOMENTS = NaN(1,totparam_nbr); %initialize
ide_strength_dMOMENTS_prior = NaN(1,totparam_nbr); %initialize ide_strength_dMOMENTS_prior = NaN(1,totparam_nbr); %initialize
ide_uncert_unnormaliz = NaN(1,totparam_nbr); %initialize ide_uncert_unnormaliz = NaN(1,totparam_nbr); %initialize
@ -438,7 +436,7 @@ if info(1) == 0 %no errors in solution
ide_dynamic.dDYNAMIC = dDYNAMIC; ide_dynamic.dDYNAMIC = dDYNAMIC;
ide_dynamic.DYNAMIC = DYNAMIC; ide_dynamic.DYNAMIC = DYNAMIC;
if ~no_identification_reducedform if ~options_ident.no_identification_reducedform && ~error_indicator.identification_reducedform
if normalize_jacobians if normalize_jacobians
norm_dREDUCEDFORM = max(abs(si_dREDUCEDFORM),[],2); norm_dREDUCEDFORM = max(abs(si_dREDUCEDFORM),[],2);
norm_dREDUCEDFORM = norm_dREDUCEDFORM(:,ones(totparam_nbr,1)); norm_dREDUCEDFORM = norm_dREDUCEDFORM(:,ones(totparam_nbr,1));
@ -453,7 +451,7 @@ if info(1) == 0 %no errors in solution
ide_reducedform.REDUCEDFORM = REDUCEDFORM; ide_reducedform.REDUCEDFORM = REDUCEDFORM;
end end
if ~no_identification_moments if ~options_ident.no_identification_moments && ~error_indicator.identification_moments
if normalize_jacobians if normalize_jacobians
norm_dMOMENTS = max(abs(si_dMOMENTS),[],2); norm_dMOMENTS = max(abs(si_dMOMENTS),[],2);
norm_dMOMENTS = norm_dMOMENTS(:,ones(totparam_nbr,1)); norm_dMOMENTS = norm_dMOMENTS(:,ones(totparam_nbr,1));
@ -469,7 +467,7 @@ if info(1) == 0 %no errors in solution
if advanced if advanced
% here we do not normalize (i.e. we set norm_dMOMENTS=1) as the OLS in ident_bruteforce is very sensitive to norm_dMOMENTS % here we do not normalize (i.e. we set norm_dMOMENTS=1) as the OLS in ident_bruteforce is very sensitive to norm_dMOMENTS
[ide_moments.pars, ide_moments.cosndMOMENTS] = ident_bruteforce(dMOMENTS(ind_dMOMENTS,:), max_dim_cova_group, options_.TeX, options_ident.name_tex, options_ident.tittxt, options_ident.tol_deriv); [ide_moments.pars, ide_moments.cosndMOMENTS] = ident_bruteforce(dMOMENTS(ind_dMOMENTS,:), max_dim_cova_group, options_.TeX, options_ident.name_tex, options_ident.tittxt, tol_deriv);
end end
%here we focus on the unnormalized S and V, which is then used in plot_identification.m and for prior_mc > 1 %here we focus on the unnormalized S and V, which is then used in plot_identification.m and for prior_mc > 1
@ -485,7 +483,7 @@ if info(1) == 0 %no errors in solution
end end
end end
if ~no_identification_minimal if ~options_ident.no_identification_minimal && ~error_indicator.identification_minimal
if normalize_jacobians if normalize_jacobians
ind_dMINIMAL = (find(max(abs(dMINIMAL'),[],1) > tol_deriv)); %index for non-zero rows ind_dMINIMAL = (find(max(abs(dMINIMAL'),[],1) > tol_deriv)); %index for non-zero rows
norm_dMINIMAL = max(abs(dMINIMAL(ind_dMINIMAL,:)),[],2); norm_dMINIMAL = max(abs(dMINIMAL(ind_dMINIMAL,:)),[],2);
@ -499,7 +497,7 @@ if info(1) == 0 %no errors in solution
ide_minimal.dMINIMAL = dMINIMAL; ide_minimal.dMINIMAL = dMINIMAL;
end end
if ~no_identification_spectrum if ~options_ident.no_identification_spectrum && ~error_indicator.identification_spectrum
if normalize_jacobians if normalize_jacobians
ind_dSPECTRUM = (find(max(abs(dSPECTRUM'),[],1) > tol_deriv)); %index for non-zero rows ind_dSPECTRUM = (find(max(abs(dSPECTRUM'),[],1) > tol_deriv)); %index for non-zero rows
tilda_dSPECTRUM = zeros(size(dSPECTRUM)); tilda_dSPECTRUM = zeros(size(dSPECTRUM));
@ -523,23 +521,33 @@ if info(1) == 0 %no errors in solution
if checks_via_subsets if checks_via_subsets
% identification_checks_via_subsets is only for debugging % identification_checks_via_subsets is only for debugging
[ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal] = ... [ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal] = ...
identification_checks_via_subsets(ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal, totparam_nbr, modparam_nbr, options_ident); identification_checks_via_subsets(ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal, totparam_nbr, modparam_nbr, options_ident, error_indicator);
if ~error_indicator.identification_minimal
ide_minimal.minimal_state_space=1;
else
ide_minimal.minimal_state_space=0;
end
else else
[ide_dynamic.cond, ide_dynamic.rank, ide_dynamic.ind0, ide_dynamic.indno, ide_dynamic.ino, ide_dynamic.Mco, ide_dynamic.Pco, ide_dynamic.jweak, ide_dynamic.jweak_pair] = ... [ide_dynamic.cond, ide_dynamic.rank, ide_dynamic.ind0, ide_dynamic.indno, ide_dynamic.ino, ide_dynamic.Mco, ide_dynamic.Pco, ide_dynamic.jweak, ide_dynamic.jweak_pair] = ...
identification_checks(dDYNAMIC(ind_dDYNAMIC,:)./norm_dDYNAMIC, 1, tol_rank, tol_sv, modparam_nbr); identification_checks(dDYNAMIC(ind_dDYNAMIC,:)./norm_dDYNAMIC, 1, tol_rank, tol_sv, modparam_nbr);
if ~no_identification_reducedform if ~options_ident.no_identification_reducedform && ~error_indicator.identification_reducedform
[ide_reducedform.cond, ide_reducedform.rank, ide_reducedform.ind0, ide_reducedform.indno, ide_reducedform.ino, ide_reducedform.Mco, ide_reducedform.Pco, ide_reducedform.jweak, ide_reducedform.jweak_pair] = ... [ide_reducedform.cond, ide_reducedform.rank, ide_reducedform.ind0, ide_reducedform.indno, ide_reducedform.ino, ide_reducedform.Mco, ide_reducedform.Pco, ide_reducedform.jweak, ide_reducedform.jweak_pair] = ...
identification_checks(dREDUCEDFORM(ind_dREDUCEDFORM,:)./norm_dREDUCEDFORM, 1, tol_rank, tol_sv, totparam_nbr); identification_checks(dREDUCEDFORM(ind_dREDUCEDFORM,:)./norm_dREDUCEDFORM, 1, tol_rank, tol_sv, totparam_nbr);
end end
if ~no_identification_moments if ~options_ident.no_identification_moments && ~error_indicator.identification_moments
[ide_moments.cond, ide_moments.rank, ide_moments.ind0, ide_moments.indno, ide_moments.ino, ide_moments.Mco, ide_moments.Pco, ide_moments.jweak, ide_moments.jweak_pair] = ... [ide_moments.cond, ide_moments.rank, ide_moments.ind0, ide_moments.indno, ide_moments.ino, ide_moments.Mco, ide_moments.Pco, ide_moments.jweak, ide_moments.jweak_pair] = ...
identification_checks(dMOMENTS(ind_dMOMENTS,:)./norm_dMOMENTS, 1, tol_rank, tol_sv, totparam_nbr); identification_checks(dMOMENTS(ind_dMOMENTS,:)./norm_dMOMENTS, 1, tol_rank, tol_sv, totparam_nbr);
end end
if ~no_identification_minimal if ~options_ident.no_identification_minimal
[ide_minimal.cond, ide_minimal.rank, ide_minimal.ind0, ide_minimal.indno, ide_minimal.ino, ide_minimal.Mco, ide_minimal.Pco, ide_minimal.jweak, ide_minimal.jweak_pair] = ... if ~error_indicator.identification_minimal
identification_checks(dMINIMAL(ind_dMINIMAL,:)./norm_dMINIMAL, 2, tol_rank, tol_sv, totparam_nbr); [ide_minimal.cond, ide_minimal.rank, ide_minimal.ind0, ide_minimal.indno, ide_minimal.ino, ide_minimal.Mco, ide_minimal.Pco, ide_minimal.jweak, ide_minimal.jweak_pair] = ...
identification_checks(dMINIMAL(ind_dMINIMAL,:)./norm_dMINIMAL, 2, tol_rank, tol_sv, totparam_nbr);
ide_minimal.minimal_state_space=1;
else
ide_minimal.minimal_state_space=0;
end
end end
if ~no_identification_spectrum if ~options_ident.no_identification_spectrum && ~error_indicator.identification_spectrum
[ide_spectrum.cond, ide_spectrum.rank, ide_spectrum.ind0, ide_spectrum.indno, ide_spectrum.ino, ide_spectrum.Mco, ide_spectrum.Pco, ide_spectrum.jweak, ide_spectrum.jweak_pair] = ... [ide_spectrum.cond, ide_spectrum.rank, ide_spectrum.ind0, ide_spectrum.indno, ide_spectrum.ino, ide_spectrum.Mco, ide_spectrum.Pco, ide_spectrum.jweak, ide_spectrum.jweak_pair] = ...
identification_checks(tilda_dSPECTRUM, 3, tol_rank, tol_sv, totparam_nbr); identification_checks(tilda_dSPECTRUM, 3, tol_rank, tol_sv, totparam_nbr);
end end

View File

@ -1,5 +1,5 @@
function [ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal] = identification_checks_via_subsets(ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal, totparam_nbr, modparam_nbr, options_ident) function [ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal] = identification_checks_via_subsets(ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal, totparam_nbr, modparam_nbr, options_ident,error_indicator)
%[ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal] = identification_checks_via_subsets(ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal, totparam_nbr, modparam_nbr, options_ident) %[ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal] = identification_checks_via_subsets(ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal, totparam_nbr, modparam_nbr, options_ident,error_indicator)
% ------------------------------------------------------------------------- % -------------------------------------------------------------------------
% Finds problematic sets of paramters via checking the necessary rank condition % Finds problematic sets of paramters via checking the necessary rank condition
% of the Jacobians for all possible combinations of parameters. The rank is % of the Jacobians for all possible combinations of parameters. The rank is
@ -23,22 +23,23 @@ function [ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal]
% INPUTS % INPUTS
% ide_reducedform: [structure] Containing results from identification % ide_reducedform: [structure] Containing results from identification
% analysis based on the reduced-form solution (Ratto % analysis based on the reduced-form solution (Ratto
% and Iskrev, 2011). If ide_reducedform.no_identification_reducedform % and Iskrev, 2011). If either options_ident.no_identification_reducedform
% is 1 then the search for problematic parameter sets will be skipped % or error_indicator.identification_reducedform are 1 then the search for problematic parameter sets will be skipped
% ide_moments: [structure] Containing results from identification % ide_moments: [structure] Containing results from identification
% analysis based on moments (Iskrev, 2010). If % analysis based on moments (Iskrev, 2010). If either
% ide_moments.no_identification_moments is 1 then the search for % options_ident.no_identification_moments or error_indicator.identification_moments are 1 then the search for
% problematic parameter sets will be skipped % problematic parameter sets will be skipped
% ide_spectrum: [structure] Containing results from identification % ide_spectrum: [structure] Containing results from identification
% analysis based on the spectrum (Qu and Tkachenko, 2012). % analysis based on the spectrum (Qu and Tkachenko, 2012).
% If ide_spectrum.no_identification_spectrum is 1 then the search for % If either options_ident.no_identification_spectrum or error_indicator.identification_spectrum are 1 then the search for
% problematic parameter sets will be skipped % problematic parameter sets will be skipped
% ide_minimal: [structure] Containing results from identification % ide_minimal: [structure] Containing results from identification
% analysis based on the minimal state space system % analysis based on the minimal state space system
% (Komunjer and Ng, 2011). If ide_minimal.no_identification_minimal % (Komunjer and Ng, 2011). If either options_ident.no_identification_minimal or
% is 1 then the search for problematic parameter sets will be skipped % error_indicator.identification_minimal are 1 then the search for problematic parameter sets will be skipped
% totparam_nbr: [integer] number of estimated stderr, corr and model parameters % totparam_nbr: [integer] number of estimated stderr, corr and model parameters
% numzerotolrank: [double] tolerance level for rank compuations % numzerotolrank: [double] tolerance level for rank compuations
% error_indicator [structure] indicators whether objects could be computed
% ------------------------------------------------------------------------- % -------------------------------------------------------------------------
% OUTPUTS % OUTPUTS
% ide_reducedform, ide_moments, ide_spectrum, ide_minimal are augmented by the % ide_reducedform, ide_moments, ide_spectrum, ide_minimal are augmented by the
@ -51,7 +52,7 @@ function [ide_dynamic, ide_reducedform, ide_moments, ide_spectrum, ide_minimal]
% This function is called by % This function is called by
% * identification_analysis.m % * identification_analysis.m
% ========================================================================= % =========================================================================
% Copyright (C) 2019 Dynare Team % Copyright (C) 2019-2021 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
@ -113,7 +114,7 @@ else
end end
% initialize for reduced form solution criteria % initialize for reduced form solution criteria
if ~no_identification_reducedform if ~no_identification_reducedform && ~error_indicator.identification_reducedform
dREDUCEDFORM = ide_reducedform.dREDUCEDFORM; dREDUCEDFORM = ide_reducedform.dREDUCEDFORM;
dREDUCEDFORM(ide_reducedform.ind_dREDUCEDFORM,:) = dREDUCEDFORM(ide_reducedform.ind_dREDUCEDFORM,:)./ide_reducedform.norm_dREDUCEDFORM; %normalize dREDUCEDFORM(ide_reducedform.ind_dREDUCEDFORM,:) = dREDUCEDFORM(ide_reducedform.ind_dREDUCEDFORM,:)./ide_reducedform.norm_dREDUCEDFORM; %normalize
if strcmp(tol_rank,'robust') if strcmp(tol_rank,'robust')
@ -136,7 +137,7 @@ else
end end
% initialize for moments criteria % initialize for moments criteria
if ~no_identification_moments if ~no_identification_moments && ~error_indicator.identification_moments
dMOMENTS = ide_moments.dMOMENTS; dMOMENTS = ide_moments.dMOMENTS;
dMOMENTS(ide_moments.ind_dMOMENTS,:) = dMOMENTS(ide_moments.ind_dMOMENTS,:)./ide_moments.norm_dMOMENTS; %normalize dMOMENTS(ide_moments.ind_dMOMENTS,:) = dMOMENTS(ide_moments.ind_dMOMENTS,:)./ide_moments.norm_dMOMENTS; %normalize
if strcmp(tol_rank,'robust') if strcmp(tol_rank,'robust')
@ -159,7 +160,7 @@ else
end end
% initialize for spectrum criteria % initialize for spectrum criteria
if ~no_identification_spectrum if ~no_identification_spectrum && ~error_indicator.identification_spectrum
dSPECTRUM = ide_spectrum.tilda_dSPECTRUM; %tilda dSPECTRUM is normalized dSPECTRUM matrix in identification_analysis.m dSPECTRUM = ide_spectrum.tilda_dSPECTRUM; %tilda dSPECTRUM is normalized dSPECTRUM matrix in identification_analysis.m
%alternative normalization %alternative normalization
%dSPECTRUM = ide_spectrum.dSPECTRUM; %dSPECTRUM = ide_spectrum.dSPECTRUM;
@ -184,7 +185,7 @@ else
end end
% initialize for minimal system criteria % initialize for minimal system criteria
if ~no_identification_minimal if ~no_identification_minimal && ~error_indicator.identification_minimal
dMINIMAL = ide_minimal.dMINIMAL; dMINIMAL = ide_minimal.dMINIMAL;
dMINIMAL(ide_minimal.ind_dMINIMAL,:) = dMINIMAL(ide_minimal.ind_dMINIMAL,:)./ide_minimal.norm_dMINIMAL; %normalize dMINIMAL(ide_minimal.ind_dMINIMAL,:) = dMINIMAL(ide_minimal.ind_dMINIMAL,:)./ide_minimal.norm_dMINIMAL; %normalize
dMINIMAL_par = dMINIMAL(:,1:totparam_nbr); %part of dMINIMAL that is dependent on parameters dMINIMAL_par = dMINIMAL(:,1:totparam_nbr); %part of dMINIMAL that is dependent on parameters
@ -223,7 +224,7 @@ for j=1:totparam_nbr
end end
end end
end end
if ~no_identification_reducedform if ~no_identification_reducedform && ~error_indicator.identification_reducedform
% Columns correspond to single parameters, i.e. full rank would be equal to 1 % Columns correspond to single parameters, i.e. full rank would be equal to 1
if strcmp(tol_rank,'robust') if strcmp(tol_rank,'robust')
if rank(full(dREDUCEDFORM(:,j))) == 0 if rank(full(dREDUCEDFORM(:,j))) == 0
@ -235,7 +236,7 @@ for j=1:totparam_nbr
end end
end end
end end
if ~no_identification_moments if ~no_identification_moments && ~error_indicator.identification_moments
% Columns correspond to single parameters, i.e. full rank would be equal to 1 % Columns correspond to single parameters, i.e. full rank would be equal to 1
if strcmp(tol_rank,'robust') if strcmp(tol_rank,'robust')
if rank(full(dMOMENTS(:,j))) == 0 if rank(full(dMOMENTS(:,j))) == 0
@ -247,13 +248,13 @@ for j=1:totparam_nbr
end end
end end
end end
if ~no_identification_spectrum if ~no_identification_spectrum && ~error_indicator.identification_spectrum
% Diagonal values correspond to single parameters, absolute value needs to be greater than tolerance level % Diagonal values correspond to single parameters, absolute value needs to be greater than tolerance level
if abs(dSPECTRUM(j,j)) < tol_rank if abs(dSPECTRUM(j,j)) < tol_rank
spectrum_problpars{1} = [spectrum_problpars{1};j]; spectrum_problpars{1} = [spectrum_problpars{1};j];
end end
end end
if ~no_identification_minimal if ~no_identification_minimal && ~error_indicator.identification_minimal
% Columns of dMINIMAL_par correspond to single parameters, needs to be augmented with dMINIMAL_rest (part that is independent of parameters), % Columns of dMINIMAL_par correspond to single parameters, needs to be augmented with dMINIMAL_rest (part that is independent of parameters),
% full rank would be equal to 1+dMINIMAL_fixed_rank_nbr % full rank would be equal to 1+dMINIMAL_fixed_rank_nbr
if strcmp(tol_rank,'robust') if strcmp(tol_rank,'robust')
@ -278,7 +279,7 @@ if ~no_identification_dynamic
indparam_dDYNAMIC(dynamic_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam indparam_dDYNAMIC(dynamic_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam
end end
end end
if ~no_identification_reducedform if ~no_identification_reducedform && ~error_indicator.identification_reducedform
if size(reducedform_problpars{1},1) == (totparam_nbr - rank_dREDUCEDFORM) if size(reducedform_problpars{1},1) == (totparam_nbr - rank_dREDUCEDFORM)
%found all nonidentified parameter sets %found all nonidentified parameter sets
no_identification_reducedform = 1; %skip in the following no_identification_reducedform = 1; %skip in the following
@ -287,7 +288,7 @@ if ~no_identification_reducedform
indparam_dREDUCEDFORM(reducedform_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam indparam_dREDUCEDFORM(reducedform_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam
end end
end end
if ~no_identification_moments if ~no_identification_moments && ~error_indicator.identification_moments
if size(moments_problpars{1},1) == (totparam_nbr - rank_dMOMENTS) if size(moments_problpars{1},1) == (totparam_nbr - rank_dMOMENTS)
%found all nonidentified parameter sets %found all nonidentified parameter sets
no_identification_moments = 1; %skip in the following no_identification_moments = 1; %skip in the following
@ -296,7 +297,7 @@ if ~no_identification_moments
indparam_dMOMENTS(moments_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam indparam_dMOMENTS(moments_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam
end end
end end
if ~no_identification_spectrum if ~no_identification_spectrum && ~error_indicator.identification_spectrum
if size(spectrum_problpars{1},1) == (totparam_nbr - rank_dSPECTRUM) if size(spectrum_problpars{1},1) == (totparam_nbr - rank_dSPECTRUM)
%found all nonidentified parameter sets %found all nonidentified parameter sets
no_identification_spectrum = 1; %skip in the following no_identification_spectrum = 1; %skip in the following
@ -305,7 +306,7 @@ if ~no_identification_spectrum
indparam_dSPECTRUM(spectrum_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam indparam_dSPECTRUM(spectrum_problpars{1}) = []; %remove single unidentified parameters from higher-order sets of indparam
end end
end end
if ~no_identification_minimal if ~no_identification_minimal && ~error_indicator.identification_minimal
if size(minimal_problpars{1},1) == (totparam_nbr + dMINIMAL_fixed_rank_nbr - rank_dMINIMAL) if size(minimal_problpars{1},1) == (totparam_nbr + dMINIMAL_fixed_rank_nbr - rank_dMINIMAL)
%found all nonidentified parameter sets %found all nonidentified parameter sets
no_identification_minimal = 1; %skip in the following no_identification_minimal = 1; %skip in the following
@ -323,7 +324,11 @@ indtotparam = unique([indparam_dDYNAMIC indparam_dREDUCEDFORM indparam_dMOMENTS
for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subsets for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subsets
h = dyn_waitbar(0,['Brute force collinearity for ' int2str(j) ' parameters.']); h = dyn_waitbar(0,['Brute force collinearity for ' int2str(j) ' parameters.']);
%Step1: get all possible unique subsets of j elements %Step1: get all possible unique subsets of j elements
if ~no_identification_dynamic || ~no_identification_reducedform || ~no_identification_moments || ~no_identification_spectrum || ~no_identification_minimal if ~no_identification_dynamic ...
|| (~no_identification_reducedform && ~error_indicator.identification_reducedform)...
|| (~no_identification_moments && ~error_indicator.identification_moments)...
|| (~no_identification_spectrum && ~error_indicator.identification_spectrum)...
|| (~no_identification_minimal && ~error_indicator.identification_minimal)
indexj=nchoosek(int16(indtotparam),j); % int16 speeds up nchoosek indexj=nchoosek(int16(indtotparam),j); % int16 speeds up nchoosek
% One could also use a mex version of nchoosek to speed this up, e.g.VChooseK from https://de.mathworks.com/matlabcentral/fileexchange/26190-vchoosek % One could also use a mex version of nchoosek to speed this up, e.g.VChooseK from https://de.mathworks.com/matlabcentral/fileexchange/26190-vchoosek
end end
@ -335,25 +340,25 @@ for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subset
else else
indexj_dDYNAMIC = []; indexj_dDYNAMIC = [];
end end
if ~no_identification_reducedform if ~no_identification_reducedform && ~error_indicator.identification_reducedform
indexj_dREDUCEDFORM = RemoveProblematicParameterSets(indexj,reducedform_problpars); indexj_dREDUCEDFORM = RemoveProblematicParameterSets(indexj,reducedform_problpars);
rankj_dREDUCEDFORM = zeros(size(indexj_dREDUCEDFORM,1),1); rankj_dREDUCEDFORM = zeros(size(indexj_dREDUCEDFORM,1),1);
else else
indexj_dREDUCEDFORM = []; indexj_dREDUCEDFORM = [];
end end
if ~no_identification_moments if ~no_identification_moments && ~error_indicator.identification_moments
indexj_dMOMENTS = RemoveProblematicParameterSets(indexj,moments_problpars); indexj_dMOMENTS = RemoveProblematicParameterSets(indexj,moments_problpars);
rankj_dMOMENTS = zeros(size(indexj_dMOMENTS,1),1); rankj_dMOMENTS = zeros(size(indexj_dMOMENTS,1),1);
else else
indexj_dMOMENTS = []; indexj_dMOMENTS = [];
end end
if ~no_identification_spectrum if ~no_identification_spectrum && ~error_indicator.identification_spectrum
indexj_dSPECTRUM = RemoveProblematicParameterSets(indexj,spectrum_problpars); indexj_dSPECTRUM = RemoveProblematicParameterSets(indexj,spectrum_problpars);
rankj_dSPECTRUM = zeros(size(indexj_dSPECTRUM,1),1); rankj_dSPECTRUM = zeros(size(indexj_dSPECTRUM,1),1);
else else
indexj_dSPECTRUM = []; indexj_dSPECTRUM = [];
end end
if ~no_identification_minimal if ~no_identification_minimal && ~error_indicator.identification_minimal
indexj_dMINIMAL = RemoveProblematicParameterSets(indexj,minimal_problpars); indexj_dMINIMAL = RemoveProblematicParameterSets(indexj,minimal_problpars);
rankj_dMINIMAL = zeros(size(indexj_dMINIMAL,1),1); rankj_dMINIMAL = zeros(size(indexj_dMINIMAL,1),1);
else else
@ -375,7 +380,7 @@ for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subset
end end
end end
end end
if ~no_identification_reducedform if ~no_identification_reducedform && ~error_indicator.identification_reducedform
k_dREDUCEDFORM = k_dREDUCEDFORM+1; k_dREDUCEDFORM = k_dREDUCEDFORM+1;
if k_dREDUCEDFORM <= size(indexj_dREDUCEDFORM,1) if k_dREDUCEDFORM <= size(indexj_dREDUCEDFORM,1)
dREDUCEDFORM_j = dREDUCEDFORM(:,indexj_dREDUCEDFORM(k_dREDUCEDFORM,:)); % pick columns that correspond to parameter subset dREDUCEDFORM_j = dREDUCEDFORM(:,indexj_dREDUCEDFORM(k_dREDUCEDFORM,:)); % pick columns that correspond to parameter subset
@ -386,7 +391,7 @@ for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subset
end end
end end
end end
if ~no_identification_moments if ~no_identification_moments && ~error_indicator.identification_moments
k_dMOMENTS = k_dMOMENTS+1; k_dMOMENTS = k_dMOMENTS+1;
if k_dMOMENTS <= size(indexj_dMOMENTS,1) if k_dMOMENTS <= size(indexj_dMOMENTS,1)
dMOMENTS_j = dMOMENTS(:,indexj_dMOMENTS(k_dMOMENTS,:)); % pick columns that correspond to parameter subset dMOMENTS_j = dMOMENTS(:,indexj_dMOMENTS(k_dMOMENTS,:)); % pick columns that correspond to parameter subset
@ -397,7 +402,7 @@ for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subset
end end
end end
end end
if ~no_identification_minimal if ~no_identification_minimal && ~error_indicator.identification_minimal
k_dMINIMAL = k_dMINIMAL+1; k_dMINIMAL = k_dMINIMAL+1;
if k_dMINIMAL <= size(indexj_dMINIMAL,1) if k_dMINIMAL <= size(indexj_dMINIMAL,1)
dMINIMAL_j = [dMINIMAL_par(:,indexj_dMINIMAL(k_dMINIMAL,:)) dMINIMAL_rest]; % pick columns in dMINIMAL_par that correspond to parameter subset and augment with parameter-indepdendet part dMINIMAL_rest dMINIMAL_j = [dMINIMAL_par(:,indexj_dMINIMAL(k_dMINIMAL,:)) dMINIMAL_rest]; % pick columns in dMINIMAL_par that correspond to parameter subset and augment with parameter-indepdendet part dMINIMAL_rest
@ -408,7 +413,7 @@ for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subset
end end
end end
end end
if ~no_identification_spectrum if ~no_identification_spectrum && ~error_indicator.identification_spectrum
k_dSPECTRUM = k_dSPECTRUM+1; k_dSPECTRUM = k_dSPECTRUM+1;
if k_dSPECTRUM <= size(indexj_dSPECTRUM,1) if k_dSPECTRUM <= size(indexj_dSPECTRUM,1)
dSPECTRUM_j = dSPECTRUM(indexj_dSPECTRUM(k_dSPECTRUM,:),indexj_dSPECTRUM(k_dSPECTRUM,:)); % pick rows and columns that correspond to parameter subset dSPECTRUM_j = dSPECTRUM(indexj_dSPECTRUM(k_dSPECTRUM,:),indexj_dSPECTRUM(k_dSPECTRUM,:)); % pick rows and columns that correspond to parameter subset
@ -426,16 +431,16 @@ for j=2:min(length(indtotparam),max_dim_subsets_groups) % Check j-element subset
if ~no_identification_dynamic if ~no_identification_dynamic
dynamic_problpars{j} = indexj_dDYNAMIC(rankj_dDYNAMIC < j,:); dynamic_problpars{j} = indexj_dDYNAMIC(rankj_dDYNAMIC < j,:);
end end
if ~no_identification_reducedform if ~no_identification_reducedform && ~error_indicator.identification_reducedform
reducedform_problpars{j} = indexj_dREDUCEDFORM(rankj_dREDUCEDFORM < j,:); reducedform_problpars{j} = indexj_dREDUCEDFORM(rankj_dREDUCEDFORM < j,:);
end end
if ~no_identification_moments if ~no_identification_moments && ~error_indicator.identification_moments
moments_problpars{j} = indexj_dMOMENTS(rankj_dMOMENTS < j,:); moments_problpars{j} = indexj_dMOMENTS(rankj_dMOMENTS < j,:);
end end
if ~no_identification_minimal if ~no_identification_minimal && ~error_indicator.identification_minimal
minimal_problpars{j} = indexj_dMINIMAL(rankj_dMINIMAL < (j+dMINIMAL_fixed_rank_nbr),:); minimal_problpars{j} = indexj_dMINIMAL(rankj_dMINIMAL < (j+dMINIMAL_fixed_rank_nbr),:);
end end
if ~no_identification_spectrum if ~no_identification_spectrum && ~error_indicator.identification_spectrum
spectrum_problpars{j} = indexj_dSPECTRUM(rankj_dSPECTRUM < j,:); spectrum_problpars{j} = indexj_dSPECTRUM(rankj_dSPECTRUM < j,:);
end end
% % Optional Step 5: % remove redundant 2-sets, eg. if the problematic sets are [(p1,p2);(p1,p3);(p2,p3)], then the unique problematic parameter sets are actually only [(p1,p2),(p1,p3)] % % Optional Step 5: % remove redundant 2-sets, eg. if the problematic sets are [(p1,p2);(p1,p3);(p2,p3)], then the unique problematic parameter sets are actually only [(p1,p2),(p1,p3)]