From b4c04a27cc6d51267e78692840c147180c621235 Mon Sep 17 00:00:00 2001 From: adjemian Date: Tue, 2 Sep 2008 10:16:44 +0000 Subject: [PATCH] Added autocorrelogram for the posterior draws. git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@2017 ac1d8469-bf42-47a9-8791-bf33cf982152 --- matlab/global_initialization.m | 2 +- matlab/mh_autocorrelation_function.m | 103 +++++++++++++++++++++++++++ matlab/sample_autocovariance.m | 48 +++++++++++++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 matlab/mh_autocorrelation_function.m create mode 100644 matlab/sample_autocovariance.m diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index 7f07232dd..3db39ff5e 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -182,7 +182,7 @@ function global_initialization() options_.proposal_distribution = 'rand_multivariate_normal'; options_.student_degrees_of_freedom = 3; options_.trace_plot_ma = 200; - + options_.mh_autocorrelation_function_size = 30; % Misc options_.conf_sig = 0.6; diff --git a/matlab/mh_autocorrelation_function.m b/matlab/mh_autocorrelation_function.m new file mode 100644 index 000000000..a3f3e1aba --- /dev/null +++ b/matlab/mh_autocorrelation_function.m @@ -0,0 +1,103 @@ +function mh_autocorrelation_function(options_,M_,estim_params_,type,blck,name1,name2) +% This function plots the autocorrelation of the sampled draws in the +% posterior distribution. +% +% +% INPUTS +% +% options_ [structure] Dynare structure. +% M_ [structure] Dynare structure (related to model definition). +% estim_params_ [structure] Dynare structure (related to estimation). +% type [string] 'DeepParameter', 'MeasurementError' (for measurement equation error) or 'StructuralShock' (for structural shock). +% blck [integer] Number of the mh chain. +% name1 [string] Object name. +% name2 [string] Object name. +% +% OUTPUTS +% None +% +% SPECIAL REQUIREMENTS + +% Copyright (C) 2003-2008 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 . + +% Cet the column index: +if nargin<7 + column = name2index(options_, M_, estim_params_, type, name1); +else + column = name2index(options_, M_, estim_params_, type, name1, name2); +end + +if isempty(column) + return +end + +% Get informations about the posterior draws: +DirectoryName = CheckPath('metropolis'); +try + load([DirectoryName '/' M_.fname '_mh_history.mat']); +catch + disp(['trace_plot:: I can''t find ' M_.fname '_results.mat !']) + disp(['trace_plot:: Did you run a metropolis?']) + return +end + +FirstMhFile = record.KeepedDraws.FirstMhFile; +FirstLine = record.KeepedDraws.FirstLine; ifil = FirstLine; +TotalNumberOfMhFiles = sum(record.MhDraws(:,2)); +TotalNumberOfMhDraws = sum(record.MhDraws(:,1)); +NumberOfDraws = TotalNumberOfMhDraws-floor(options_.mh_drop*TotalNumberOfMhDraws); +clear record; + +% Get all the posterior draws: +PosteriorDraws = GetAllPosteriorDraws(column, FirstMhFile, FirstLine, TotalNumberOfMhFiles, NumberOfDraws, blck); + +% Compute the autocorrelation function: +[autocov,autocor] = sample_autocovariance(PosteriorDraws,options_.mh_autocorrelation_function_size); + +% Plot the posterior draws: + +if strcmpi(type,'DeepParameter') + TYPE = 'parameter '; +elseif strcmpi(type,'StructuralShock') + if nargin<7 + TYPE = 'the standard deviation of structural shock '; + else + TYPE = 'the correlation between structural shocks '; + end +elseif strcmpi(type,'MeasurementError') + if nargin<7 + TYPE = 'the standard deviation of measurement error '; + else + TYPE = 'the correlation between measurement errors '; + end +end + +if nargin<7 + FigureName = ['autocorrelogram for ' TYPE name1]; +else + FigureName = ['autocorrelogram for ' TYPE name1 ' and ' name2]; +end + +if options_.mh_nblck>1 + FigureName = [ FigureName , ' (block number' int2str(blck) ').']; +end + + +figure('Name',FigureName) +bar(0:options_.mh_autocorrelation_function_size,autocor,'k'); +axis tight \ No newline at end of file diff --git a/matlab/sample_autocovariance.m b/matlab/sample_autocovariance.m new file mode 100644 index 000000000..12bd34e86 --- /dev/null +++ b/matlab/sample_autocovariance.m @@ -0,0 +1,48 @@ +function [autocov,autocor] = sample_autocovariance(data,q) +% Computes the autocovariance function associated to a time series. +% +% +% INPUTS +% +% data [double] T*1 vector of data. +% q [integer] Order of the autocovariance function. +% +% OUTPUTS +% autocov [double] (q+1)*1 vector, autocovariance function (first scalar is the variance). +% autocor [double] (q+1)*1 vector, autocorrelation function (first scalar is equal to one). +% +% SPECIAL REQUIREMENTS + +% Copyright (C) 2003-2008 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 . + +autocov = zeros(q+1,1); + +demeaned_data = data(:) - mean(data(:)); +sample_size = length( data(q+1:end) ); +lagged_indices = transpose(0:-1:-q); + +for t = 1:sample_size + tt = t+q; + autocov = autocov + demeaned_data(tt)*demeaned_data(tt+lagged_indices); +end + +autocov = autocov/sample_size ; + +if nargout>1 + autocor = autocov / autocov(1); +end \ No newline at end of file