From 0aee5cbf5aa8d0285d3f60d942dda219f86dda59 Mon Sep 17 00:00:00 2001
From: Marco Ratto <marco.ratto@jrc.ec.europa.eu>
Date: Fri, 25 Sep 2015 18:23:21 +0200
Subject: [PATCH] Fill in posterior_mode with info from posterior samples.

---
 matlab/GetPosteriorParametersStatistics.m |  2 +-
 matlab/dynare_estimation_1.m              |  2 +-
 matlab/marginal_density.m                 | 90 ++++++++++++++++++++++-
 3 files changed, 90 insertions(+), 4 deletions(-)

diff --git a/matlab/GetPosteriorParametersStatistics.m b/matlab/GetPosteriorParametersStatistics.m
index a8ee9a58bb..820b6e53f0 100644
--- a/matlab/GetPosteriorParametersStatistics.m
+++ b/matlab/GetPosteriorParametersStatistics.m
@@ -72,7 +72,7 @@ skipline()
 try
     disp(sprintf('Log data density is %f.',oo_.MarginalDensity.ModifiedHarmonicMean))
 catch
-    [marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_);
+    [marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_, bayestopt_);
     disp(sprintf('Log data density is %f.',oo_.MarginalDensity.ModifiedHarmonicMean))
 end
 num_draws=NumberOfDraws*options_.mh_nblck;
diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m
index 79087715a0..2f2e6d4688 100644
--- a/matlab/dynare_estimation_1.m
+++ b/matlab/dynare_estimation_1.m
@@ -443,7 +443,7 @@ if (any(bayestopt_.pshape  >0 ) && options_.mh_replic) || ...
 
         %% Estimation of the marginal density from the Mh draws:
         if options_.mh_replic
-            [marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_);
+            [marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_, bayestopt_);
             % Store posterior statistics by parameter name
             oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bayestopt_, oo_, pnames);
             if ~options_.nograph
diff --git a/matlab/marginal_density.m b/matlab/marginal_density.m
index f24c344f45..32880f34ae 100644
--- a/matlab/marginal_density.m
+++ b/matlab/marginal_density.m
@@ -1,4 +1,4 @@
-function [marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_)
+function [marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_, bayestopt_)
 % function marginal = marginal_density()
 % Computes the marginal density
 %
@@ -58,6 +58,9 @@ lpost_mode = posterior_kernel_at_the_mode;
 xparam1 = posterior_mean;
 hh = inv(SIGMA);
 fprintf(' Done!\n');
+if ~isfield(oo_,'posterior_mode')
+    oo_=fill_mh_mode(posterior_mode',NaN(npar,1),M_,options_,estim_params_,bayestopt_,oo_,'posterior');
+end
 
 % save the posterior mean and the inverse of the covariance matrix
 % (usefull if the user wants to perform some computations using
@@ -120,4 +123,87 @@ while check_coverage
     end
 end
 
-oo_.MarginalDensity.ModifiedHarmonicMean = mean(marginal(:,2));
\ No newline at end of file
+oo_.MarginalDensity.ModifiedHarmonicMean = mean(marginal(:,2));
+
+return
+
+function oo_=fill_mh_mode(xparam1,stdh,M_,options_,estim_params_,bayestopt_,oo_, field_name)
+%function oo_=fill_mh_mode(xparam1,stdh,M_,options_,estim_params_,bayestopt_,oo_, field_name)
+% 
+% INPUTS 
+%   o xparam1       [double]   (p*1) vector of estimate parameters.
+%   o stdh          [double]   (p*1) vector of estimate parameters.
+%   o M_                        Matlab's structure describing the Model (initialized by dynare, see @ref{M_}).          
+%   o estim_params_             Matlab's structure describing the estimated_parameters (initialized by dynare, see @ref{estim_params_}).
+%   o options_                  Matlab's structure describing the options (initialized by dynare, see @ref{options_}).
+%   o bayestopt_                Matlab's structure describing the priors (initialized by dynare, see @ref{bayesopt_}).
+%   o oo_                       Matlab's structure gathering the results (initialized by dynare, see @ref{oo_}).
+%  
+% OUTPUTS 
+%   o oo_                       Matlab's structure gathering the results
+%
+% SPECIAL REQUIREMENTS
+%   None.
+
+
+nvx = estim_params_.nvx;  % Variance of the structural innovations (number of parameters).
+nvn = estim_params_.nvn;  % Variance of the measurement innovations (number of parameters).
+ncx = estim_params_.ncx;  % Covariance of the structural innovations (number of parameters).
+ncn = estim_params_.ncn;  % Covariance of the measurement innovations (number of parameters).
+np  = estim_params_.np ;  % Number of deep parameters.
+nx  = nvx+nvn+ncx+ncn+np; % Total number of parameters to be estimated.
+
+if np
+    ip = nvx+nvn+ncx+ncn+1;
+    for i=1:np
+        name = bayestopt_.name{ip};
+        eval(['oo_.' field_name '_mode.parameters.' name ' = xparam1(ip);']);
+        eval(['oo_.' field_name '_std_at_mode.parameters.' name ' = stdh(ip);']);
+        ip = ip+1;
+    end
+end
+if nvx
+    ip = 1;
+    for i=1:nvx
+        k = estim_params_.var_exo(i,1);
+        name = deblank(M_.exo_names(k,:));
+        eval(['oo_.' field_name '_mode.shocks_std.' name ' = xparam1(ip);']);
+        eval(['oo_.' field_name '_std_at_mode.shocks_std.' name ' = stdh(ip);']);
+        ip = ip+1;
+    end
+ end
+ if nvn
+    ip = nvx+1;
+    for i=1:nvn
+        name = options_.varobs{estim_params_.nvn_observable_correspondence(i,1)};
+        eval(['oo_.' field_name '_mode.measurement_errors_std.' name ' = xparam1(ip);']);
+        eval(['oo_.' field_name '_std_at_mode.measurement_errors_std.' name ' = stdh(ip);']);
+        ip = ip+1;
+    end
+ end
+
+if ncx
+    ip = nvx+nvn+1;
+    for i=1:ncx
+        k1 = estim_params_.corrx(i,1);
+        k2 = estim_params_.corrx(i,2);
+        NAME = [deblank(M_.exo_names(k1,:)) '_' deblank(M_.exo_names(k2,:))];
+        eval(['oo_.' field_name '_mode.shocks_corr.' NAME ' = xparam1(ip);']);
+        eval(['oo_.' field_name '_std_at_mode.shocks_corr.' NAME ' = stdh(ip);']);
+        ip = ip+1;
+    end
+end
+
+if ncn
+    ip = nvx+nvn+ncx+1;
+    for i=1:ncn
+        k1 = estim_params_.corrn(i,1);
+        k2 = estim_params_.corrn(i,2);
+        NAME = [deblank(M_.endo_names(k1,:)) '_' deblank(M_.endo_names(k2,:))];
+        eval(['oo_.' field_name '_mode.measurement_errors_corr.' NAME ' = xparam1(ip);']);
+        eval(['oo_.' field_name '_std_at_mode.measurement_errors_corr.' NAME ' = stdh(ip);']);
+        ip = ip+1;
+    end
+end
+
+return
\ No newline at end of file
-- 
GitLab