diff --git a/matlab/dynare_identification.m b/matlab/dynare_identification.m index 632139609..c84faf2c6 100644 --- a/matlab/dynare_identification.m +++ b/matlab/dynare_identification.m @@ -147,7 +147,7 @@ options_ = set_default_option(options_,'datafile',''); options_.mode_compute = 0; options_.plot_priors = 0; options_.smoother=1; -[dataset_,dataset_info,xparam1,hh, M_, options_, oo_, estim_params_,bayestopt_]=dynare_estimation_init(M_.endo_names,fname_,1, M_, options_, oo_, estim_params_, bayestopt_); +[dataset_,dataset_info,xparam1,hh, M_, options_, oo_, estim_params_,bayestopt_,bounds]=dynare_estimation_init(M_.endo_names,fname_,1, M_, options_, oo_, estim_params_, bayestopt_); options_ident = set_default_option(options_ident,'analytic_derivation_mode',options_.analytic_derivation_mode); % if not set by user, inherit default global one if prior_exist @@ -310,7 +310,7 @@ if iload <=0, disp('Testing current parameter values') end [idehess_point, idemoments_point, idemodel_point, idelre_point, derivatives_info_point, info, options_ident] = ... - identification_analysis(params,indx,indexo,options_ident,dataset_, dataset_info, prior_exist, name_tex,1,parameters); + identification_analysis(params,indx,indexo,options_ident,dataset_, dataset_info, prior_exist, name_tex,1,parameters,bounds); if info(1)~=0, skipline() disp('----------- ') @@ -353,7 +353,7 @@ if iload <=0, kk=kk+1; params = prior_draw(); [idehess_point, idemoments_point, idemodel_point, idelre_point, derivatives_info_point, info, options_ident] = ... - identification_analysis(params,indx,indexo,options_ident,dataset_,dataset_info, prior_exist, name_tex,1,'Random_prior_params'); + identification_analysis(params,indx,indexo,options_ident,dataset_,dataset_info, prior_exist, name_tex,1,'Random_prior_params',bounds); end end if info(1) @@ -407,7 +407,7 @@ if iload <=0, params = prior_draw(); end [dum1, ideJ, ideH, ideGP, dum2 , info, options_MC] = ... - identification_analysis(params,indx,indexo,options_MC,dataset_, dataset_info, prior_exist, name_tex,0); + identification_analysis(params,indx,indexo,options_MC,dataset_, dataset_info, prior_exist, name_tex,0,[],bounds); if iteration==0 && info(1)==0, MAX_tau = min(SampleSize,ceil(MaxNumberOfBytes/(size(ideH.siH,1)*nparam)/8)); stoH = zeros([size(ideH.siH,1),nparam,MAX_tau]); diff --git a/matlab/identification_analysis.m b/matlab/identification_analysis.m index 3e05e1639..46613c5c5 100644 --- a/matlab/identification_analysis.m +++ b/matlab/identification_analysis.m @@ -1,4 +1,4 @@ -function [ide_hess, ide_moments, ide_model, ide_lre, derivatives_info, info, options_ident] = identification_analysis(params,indx,indexo,options_ident,dataset_,dataset_info, prior_exist,name_tex,init,tittxt) +function [ide_hess, ide_moments, ide_model, ide_lre, derivatives_info, info, options_ident] = identification_analysis(params,indx,indexo,options_ident,dataset_,dataset_info, prior_exist,name_tex,init,tittxt,bounds) % function [ide_hess, ide_moments, ide_model, ide_lre, derivatives_info, info] = identification_analysis(params,indx,indexo,options_ident,data_info, prior_exist,name_tex,init,analyis_type) % given the parameter vector params, wraps all identification analyses % @@ -122,7 +122,7 @@ if info(1)==0, ide_strength_J=NaN(1,nparam); ide_strength_J_prior=NaN(1,nparam); if init, %~isempty(indok), - normaliz = abs(params); + normaliz = NaN(1,nparam); if prior_exist, if ~isempty(estim_params_.var_exo), normaliz1 = estim_params_.var_exo(:,7)'; % normalize with prior standard deviation @@ -155,12 +155,12 @@ if info(1)==0, info = stoch_simul(char(options_.varobs)); dataset_ = dseries(oo_.endo_simul(options_.varobs_id,100+1:end)',dates('1Q1'), options_.varobs); derivatives_info.no_DLIK=1; - bounds = prior_bounds(bayestopt_, options_.prior_trunc); + %bounds = prior_bounds(bayestopt_, options_.prior_trunc); [fval,info,cost_flag,DLIK,AHess,ys,trend_coeff,M_,options_,bayestopt_,oo_] = dsge_likelihood(params',dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_,derivatives_info); % fval = DsgeLikelihood(xparam1,data_info,options_,M_,estim_params_,bayestopt_,oo_); options_.analytic_derivation = analytic_derivation; AHess=-AHess; - if min(eig(AHess))<0, + if min(eig(AHess))<-1.e-10, error('identification_analysis: Analytic Hessian is not positive semi-definite!') end % chol(AHess); @@ -241,7 +241,7 @@ if info(1)==0, end ide_strength_J(indok) = (1./(normaliz(indok)'./abs(params(indok)'))); ide_strength_J_prior(indok) = (1./(normaliz(indok)'./normaliz1(indok)')); - ide_strength_J(params==0)=ide_strength_J_prior(params==0); + ide_strength_J(params==0)=1./normaliz(params==0)'; deltaM_prior = deltaM.*abs(normaliz1'); deltaM = deltaM.*abs(params'); deltaM(params==0)=deltaM_prior(params==0); diff --git a/matlab/identification_checks.m b/matlab/identification_checks.m index badd71295..208d7ecd4 100644 --- a/matlab/identification_checks.m +++ b/matlab/identification_checks.m @@ -55,6 +55,29 @@ JJ1 = JJ(:,ind1); condJ= cond(JJ1); rankJ = rank(JJ); rankJJ = rankJ; +icheck=0; +if npar>0 && (rankJ 1.e-3))==1, + icheck=1; + ind11 = ind11.*(abs(ee1(:,ee0(j))) <= 1.e-3); % take non-zero columns + end + end + ind1 = ind1(find(ind11)); % take non-zero columns +end + +if icheck, +JJ1 = JJ(:,ind1); +[eu,ee2,ee1] = svd( JJ1, 0 ); +condJ= cond(JJ1); +rankJ = rank(JJ); +rankJJ = rankJ; +end + + % if hess_flag==0, % rankJJ = rank(JJ'*JJ); % end