diff --git a/matlab/ms-sbvar/identification/exclusions.m b/matlab/ms-sbvar/identification/exclusions.m index 9632356fe2e3f8ce02060999b8a7d6d628facf93..a2447b1ba157060e599b33eb58130441288014a5 100644 --- a/matlab/ms-sbvar/identification/exclusions.m +++ b/matlab/ms-sbvar/identification/exclusions.m @@ -1,4 +1,4 @@ -function [Ui,Vi,n0,np,ixmC0Pres] = exclusions(nvar,nexo,options_ms) +function [Ui,Vi,n0,np,ixmC0Pres,Qi] = exclusions(nvar,nexo,options_ms) % function [Ui,Vi,n0,np,ixmC0Pres] = exclusions(nvar,nexo,options_ms) % % INPUTS diff --git a/matlab/ms-sbvar/sbvar_global_identification_check.m b/matlab/ms-sbvar/sbvar_global_identification_check.m new file mode 100644 index 0000000000000000000000000000000000000000..642220f54fb4f9e90436eba9bbfd9bc8dddcdd88 --- /dev/null +++ b/matlab/ms-sbvar/sbvar_global_identification_check.m @@ -0,0 +1,77 @@ +function indent = sbvar_global_identification_check(options_) +% function sbvar_global_identification_check(options_.ms) +% +% INPUTS +% options_ms: (struct) options +% +% OUTPUTS +% ident: (boolean) false = not identified; true = identified +% +% SPECIAL REQUIREMENTS +% none + +% Copyright (C) 2015 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/>. + +ident = false; + +if isequal(options_.ms.restriction_fname, 'upper_cholesky') || ... + isequal(options_.ms.restriction_fname, 'lower_cholesky') + ident = true; + if ~options_.noprint + disp(' ') + disp('SBVAR: Cholesky identification is always identified') + disp(' ') + end + return +end +nvar = length(options_.varobs); % number of endogenous variables +nexo = 1; + +[Uiconst,Viconst,n0,np,ixmC0Pres,Qi] = exclusions(nvar,nexo,options_.ms ); + +% order column constraints by rank +Qranks = zeros(nvar,2); +for j=1:nvar + Qranks(j,:) = [j,rank(Qi{j})]; +end +Qranks = sortrows(Qranks,-2); + +ident = true; + +for j=1:nvar + i = Qranks(j,1); + for k=1:1 + M = [Qi{i}*rand(size(Qi{i},1),nvar);[eye(j) zeros(j,nvar- ... + j)]]; + disp([j,k,rank(M)]) + if rank(M) < nvar + ident = false + break + end + end +end + +if ~options_.noprint + disp(' ') + if ident + disp('The sufficient condition for SBVAR identification is met') + else + disp('WARNGING: The sufficient condition for SBVAR identification is not met') + end + disp(' ') +end \ No newline at end of file diff --git a/tests/ms-sbvar/test_global_identification_FAILURE.mod b/tests/ms-sbvar/test_global_identification_FAILURE.mod new file mode 100644 index 0000000000000000000000000000000000000000..8ff9cfdddc849b27e42e54847977d271adec1421 --- /dev/null +++ b/tests/ms-sbvar/test_global_identification_FAILURE.mod @@ -0,0 +1,16 @@ +// same as test_lower_cholesky.mod, but using exclusion syntax +var R Pie Y; + +varobs Y Pie R; + +svar_identification; +exclusion lag 0; +equation 1, Pie, Y; +exclusion lag 1; +equation 2, Y; +end; + +sbvar_global_identification_check(options_); + +sbvar(datafile = data,freq=4,initial_year=1959,final_year=2005,nlags=4); + diff --git a/tests/ms-sbvar/test_global_identification_OK.mod b/tests/ms-sbvar/test_global_identification_OK.mod new file mode 100644 index 0000000000000000000000000000000000000000..7e54d9223c74b96284124f8a33923c256edbf0cf --- /dev/null +++ b/tests/ms-sbvar/test_global_identification_OK.mod @@ -0,0 +1,15 @@ +// same as test_lower_cholesky.mod, but using exclusion syntax +var R Pie Y; + +varobs Y Pie R; + +svar_identification; +exclusion lag 0; +equation 1, Pie, Y; +equation 2, Y; +end; + +sbvar_global_identification_check(options_); + +sbvar(datafile = data,freq=4,initial_year=1959,final_year=2005,nlags=4); +