From fe6aa88c2745f2f1374e791489766295bc20c7d7 Mon Sep 17 00:00:00 2001 From: Marco Ratto <marco.ratto@jrc.ec.europa.eu> Date: Wed, 4 Apr 2012 10:36:32 +0200 Subject: [PATCH] 1) check if AHess is positive semi-definite; 2) fix memory issues related to chh 3) fix issue for the rare case of empty indok (octave) --- matlab/identification_analysis.m | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/matlab/identification_analysis.m b/matlab/identification_analysis.m index 2347418f88..695b2d44bb 100644 --- a/matlab/identification_analysis.m +++ b/matlab/identification_analysis.m @@ -138,6 +138,10 @@ if info(1)==0, [fval,cost_flag,ys,trend_coeff,info,M_,options_,bayestopt_,oo_,DLIK,AHess] = dsge_likelihood(params',data_info,options_,M_,estim_params_,bayestopt_,oo_,derivatives_info); % fval = DsgeLikelihood(xparam1,data_info,options_,M_,estim_params_,bayestopt_,oo_); AHess=-AHess; + if min(eig(AHess))<0, + error('Analytic Hessian is not positive semi-definite!') + end +% chol(AHess); ide_hess.AHess= AHess; deltaM = sqrt(diag(AHess)); iflag=any((deltaM.*deltaM)==0); @@ -153,7 +157,9 @@ if info(1)==0, cmm = NaN(size(siJ,1),size(siJ,1)); ind1=find(ide_hess.ind0); cmm = siJ(:,ind1)*((AHess(ind1,ind1))\siJ(:,ind1)'); - chh = siH(:,ind1)*((AHess(ind1,ind1))\siH(:,ind1)'); + temp1=((AHess(ind1,ind1))\siH(:,ind1)'); + diag_chh=sum(siH(:,ind1)'.*temp1)'; +% chh = siH(:,ind1)*((AHess(ind1,ind1))\siH(:,ind1)'); ind1=ind1(ind1>offset); clre = siLRE(:,ind1-offset)*((AHess(ind1,ind1))\siLRE(:,ind1-offset)'); rhoM=sqrt(1./diag(inv(tildaM(indok,indok)))); @@ -190,12 +196,16 @@ if info(1)==0, % rhoM=sqrt(1-1./diag(inv(tildaM))); % rhoM=(1-1./diag(inv(tildaM))); ind1=find(ide_hess.ind0); - chh = siH(:,ind1)*((MIM(ind1,ind1))\siH(:,ind1)'); + temp1=((MIM(ind1,ind1))\siH(:,ind1)'); + diag_chh=sum(siH(:,ind1)'.*temp1)'; +% chh = siH(:,ind1)*((MIM(ind1,ind1))\siH(:,ind1)'); ind1=ind1(ind1>offset); clre = siLRE(:,ind1-offset)*((MIM(ind1,ind1))\siLRE(:,ind1-offset)'); - rhoM(indok)=sqrt(1./diag(inv(tildaM(indok,indok)))); - normaliz(indok) = (sqrt(diag(inv(tildaM(indok,indok))))./deltaM(indok))'; %sqrt(diag(inv(MIM(indok,indok))))'; -% deltaM = deltaM.*abs(params'); + if ~isempty(indok), + rhoM(indok)=sqrt(1./diag(inv(tildaM(indok,indok)))); + normaliz(indok) = (sqrt(diag(inv(tildaM(indok,indok))))./deltaM(indok))'; %sqrt(diag(inv(MIM(indok,indok))))'; + end + % deltaM = deltaM.*abs(params') flag_score=0; end ide_strength_J(indok) = (1./(normaliz(indok)'./abs(params(indok)'))); @@ -212,7 +222,8 @@ if info(1)==0, % isok = find((abs(TAU)>=1.e-8)); % quant(isok,:) = siH(isok,:)./repmat(TAU(isok,1),1,nparam); % quant(inok,:) = siH(inok,:)./repmat(mean(abs(TAU)),length(inok),nparam); - quant = siH./repmat(sqrt(diag(chh)),1,nparam); +% quant = siH./repmat(sqrt(diag(chh)),1,nparam); + quant = siH./repmat(sqrt(diag_chh),1,nparam); siHnorm = vnorm(quant).*normaliz1; % siHnorm = vnorm(siH./repmat(TAU,1,nparam)).*normaliz; quant=[]; -- GitLab