From f5a6835c6367d568c642735b53a9eae46f93f193 Mon Sep 17 00:00:00 2001 From: Marco Ratto <marco.ratto@jrc.ec.europa.eu> Date: Mon, 29 Apr 2013 13:49:56 +0200 Subject: [PATCH] Fixed bug with calls to dsge smoother which were broken with missing values; Proper use of dataset_ structure and remove the dangerous dat_fil_ utility; Added r2 in output. --- matlab/dynare_sensitivity.m | 2 +- matlab/gsa/dat_fil_.m | 38 ----------- matlab/gsa/filt_mc_.m | 123 +++++++++++++++++++++++------------- 3 files changed, 81 insertions(+), 82 deletions(-) delete mode 100644 matlab/gsa/dat_fil_.m diff --git a/matlab/dynare_sensitivity.m b/matlab/dynare_sensitivity.m index 55217d360f..e96d4b715d 100644 --- a/matlab/dynare_sensitivity.m +++ b/matlab/dynare_sensitivity.m @@ -354,7 +354,7 @@ if options_gsa.rmse, end clear a; % filt_mc_(OutputDirectoryName,data_info); - filt_mc_(OutputDirectoryName,options_gsa); + filt_mc_(OutputDirectoryName,options_gsa,dataset_); end options_.opt_gsa = options_gsa; diff --git a/matlab/gsa/dat_fil_.m b/matlab/gsa/dat_fil_.m deleted file mode 100644 index 397e22a5e5..0000000000 --- a/matlab/gsa/dat_fil_.m +++ /dev/null @@ -1,38 +0,0 @@ -function list_of_exported_variables_ = dat_fil_(dat_fil_to_load_); -% Written by Marco Ratto -% Joint Research Centre, The European Commission, -% (http://eemc.jrc.ec.europa.eu/), -% marco.ratto@jrc.it -% -% Reference: -% M. Ratto, Global Sensitivity Analysis for Macroeconomic models, MIMEO, 2006. - -% Copyright (C) 2012 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/>. - -try - eval(dat_fil_to_load_); -catch - load(dat_fil_to_load_); -end -clear dat_fil_to_load_; - -list_of_local_variables_=who; - -for j=1:length(list_of_local_variables_), - eval(['list_of_exported_variables_.',list_of_local_variables_{j},'=',list_of_local_variables_{j},';']); -end \ No newline at end of file diff --git a/matlab/gsa/filt_mc_.m b/matlab/gsa/filt_mc_.m index 04ebe0bfd3..82fec5e3a4 100644 --- a/matlab/gsa/filt_mc_.m +++ b/matlab/gsa/filt_mc_.m @@ -1,4 +1,4 @@ -function [rmse_MC, ixx] = filt_mc_(OutDir,options_gsa_) +function [rmse_MC, ixx] = filt_mc_(OutDir,options_gsa_,dataset_) % function [rmse_MC, ixx] = filt_mc_(OutDir) % inputs (from opt_gsa structure) % vvarvecm = options_gsa_.var_rmse; @@ -114,20 +114,24 @@ end if ~loadSA, if exist('xparam1','var') M_ = set_all_parameters(xparam1,estim_params_,M_); - steady_(M_,options_,oo_); - ys_mode=oo_.steady_state; + ys_mode=steady_(M_,options_,oo_); end if exist('xparam1_mean','var') M_ = set_all_parameters(xparam1_mean,estim_params_,M_); - steady_(M_,options_,oo_); - ys_mean=oo_.steady_state; + ys_mean=steady_(M_,options_,oo_); end % eval(options_.datafile) - obs = dat_fil_(options_.datafile); + Y = dataset_.data; + gend = dataset_.info.ntobs; + data_index = dataset_.missing.aindex; + missing_value = dataset_.missing.state; + for jx=1:gend, data_indx(jx,data_index{jx})=true; end %stock_gend=data_info.gend; %stock_data = data_info.data; load([DirectoryName '/' M_.fname '_data.mat']); filfilt = dir([DirectoryName filesep M_.fname '_filter_step_ahead*.mat']); + filsmooth = dir([DirectoryName filesep M_.fname '_smooth*.mat']); + filupdate = dir([DirectoryName filesep M_.fname '_update*.mat']); filparam = dir([DirectoryName filesep M_.fname '_param*.mat']); x=[]; logpo2=[]; @@ -151,54 +155,51 @@ if ~loadSA, nobs=options_.nobs; for i=1:size(vvarvecm,1), vj=deblank(vvarvecm(i,:)); - eval(['vobs =obs.',vj,'(fobs:fobs-1+nobs);']) - if options_.prefilter == 1 - %eval([vj,'=',vj,'-bayestopt_.mean_varobs(i);']) - %eval([vj,'=',vj,'-mean(',vj,',1);']) - vobs = vobs-mean(vobs,1); - end - jxj = strmatch(vj,lgy_(dr_.order_var,:),'exact'); - js = strmatch(vj,lgy_,'exact'); + jxj(i) = strmatch(vj,lgy_(dr_.order_var,:),'exact'); + js(i) = strmatch(vj,lgy_,'exact'); + yss(i,:,:)=repmat(sto_ys(:,js(i))',[nobs,1]); + end if exist('xparam1','var') - % if isfield(oo_,'FilteredVariables') - % eval(['rmse_mode(i) = sqrt(mean((vobs(istart:end)-oo_.steady_state(js)-oo_.FilteredVariables.',vj,'(istart:end-1)).^2));']) - % else - [alphahat,etahat,epsilonhat,ahat,SteadyState,trend_coeff,aK] = DsgeSmoother(xparam1,stock_gend,stock_data,{},0); - y0 = squeeze(aK(1,jxj,:)) + ... - kron(ys_mode(js,:),ones(size(aK,3),1)); - % y0 = ahat(jxj,:)' + ... - % kron(ys_mode(js,:),ones(size(ahat,2),1)); - rmse_mode(i) = sqrt(mean((vobs(istart:end)-y0(istart:end-1)).^2)); - % end + [alphahat,etahat,epsilonhat,ahat,SteadyState,trend_coeff,aK] = DsgeSmoother(xparam1,gend,Y,data_index,missing_value); + y0 = transpose( squeeze(aK(1,jxj,1:gend)));% + kron(ys_mode(js),ones(1,gend))); + yobs = transpose( ahat(jxj,:));% + kron(ys_mode(js),ones(1,gend))); + rmse_mode = sqrt(mean((yobs(istart:end,:)-y0(istart:end,:)).^2)); + r2_mode = 1-sum((yobs(istart:end,:)-y0(istart:end,:)).^2)./sum(yobs(istart:end,:).^2); end - y0=zeros(nobs+1,nruns); + y0=yss*0; nbb=0; for j=1:length(filfilt), load([DirectoryName filesep M_.fname '_filter_step_ahead',num2str(j),'.mat']); nb = size(stock,4); - % y0(:,nbb+1:nbb+nb)=squeeze(stock(1,js,:,:)) + ... - % kron(sto_ys(nbb+1:nbb+nb,js)',ones(size(stock,3),1)); - y0(:,nbb+1:nbb+nb)=squeeze(stock(1,js,1:nobs+1,:)) + ... - kron(sto_ys(nbb+1:nbb+nb,js)',ones(nobs+1,1)); - %y0(:,:,size(y0,3):size(y0,3)+size(stock,3))=stock; + y0(:,:,nbb+1:nbb+nb)=y0(:,:,nbb+1:nbb+nb)+squeeze(stock(1,js,1:nobs,:)); + nbb=nbb+nb; + clear stock; + end + yobs=-yss; + nbb=0; + for j=1:length(filupdate), + load([DirectoryName filesep M_.fname '_update',num2str(j),'.mat']); + nb = size(stock,3); + yobs(:,:,nbb+1:nbb+nb)=yobs(:,:,nbb+1:nbb+nb)+squeeze(stock(js,1:nobs,:)); nbb=nbb+nb; clear stock; end y0M=mean(y0,2); + rmse_MC=zeros(nruns,length(js)); + r2_MC=zeros(nruns,length(js)); for j=1:nruns, - rmse_MC(j,i) = sqrt(mean((vobs(istart:end)-y0(istart:end-1,j)).^2)); + rmse_MC(j,:) = sqrt(mean((yobs(:,istart:end,j)'-y0(:,istart:end,j)').^2)); + r2_MC(j,:) = 1-mean((yobs(:,istart:end,j)'-y0(:,istart:end,j)').^2)./mean((yobs(:,istart:end,j)').^2); end if exist('xparam1_mean','var') %eval(['rmse_pmean(i) = sqrt(mean((',vj,'(fobs-1+istart:fobs-1+nobs)-y0M(istart:end-1)).^2));']) - [alphahat,etahat,epsilonhat,ahat,SteadyState,trend_coeff,aK] = DsgeSmoother(xparam1_mean,stock_gend,stock_data,{},0); - y0 = squeeze(aK(1,jxj,:)) + ... - kron(ys_mean(js,:),ones(size(aK,3),1)); - % y0 = ahat(jxj,:)' + ... - % kron(ys_mean(js,:),ones(size(ahat,2),1)); - rmse_pmean(i) = sqrt(mean((vobs(istart:end)-y0(istart:end-1)).^2)); + [alphahat,etahat,epsilonhat,ahat,SteadyState,trend_coeff,aK] = DsgeSmoother(xparam1_mean,gend,Y,data_index,missing_value); + y0 = transpose( squeeze(aK(1,jxj,1:gend)));% + kron(ys_mean(js),ones(1,gend))); + yobs = transpose( ahat(jxj,:));% + kron(ys_mean(js),ones(1,gend))); + rmse_pmean = sqrt(mean((yobs(istart:end,:)-y0(istart:end,:)).^2)); + r2_pmean = 1-mean((yobs(istart:end,:)-y0(istart:end,:)).^2)./mean(yobs(istart:end,:).^2); end - end clear stock_filter; end for j=1:nruns, @@ -208,17 +209,17 @@ if ~loadSA, disp('... done!') if options_.opt_gsa.ppost - save([OutDir,filesep,fnamtmp,'.mat'], 'x', 'logpo2', 'likelihood', 'rmse_MC', 'rmse_mode','rmse_pmean') + save([OutDir,filesep,fnamtmp,'.mat'], 'x', 'logpo2', 'likelihood', 'rmse_MC', 'rmse_mode','rmse_pmean', 'r2_MC', 'r2_mode','r2_pmean') else if options_.opt_gsa.lik_only save([OutDir,filesep,fnamtmp, '.mat'], 'x', 'logpo2','likelihood', '-append') else - save([OutDir,filesep,fnamtmp, '.mat'], 'x', 'logpo2','likelihood', 'rmse_MC','-append') + save([OutDir,filesep,fnamtmp, '.mat'], 'x', 'logpo2','likelihood', 'rmse_MC', 'r2_MC','-append') if exist('xparam1_mean','var') - save([OutDir,filesep,fnamtmp, '.mat'], 'rmse_pmean','-append') + save([OutDir,filesep,fnamtmp, '.mat'], 'rmse_pmean', 'r2_pmean','-append') end if exist('xparam1','var') - save([OutDir,filesep,fnamtmp,'.mat'], 'rmse_mode','-append') + save([OutDir,filesep,fnamtmp,'.mat'], 'rmse_mode', 'r2_mode','-append') end end end @@ -226,7 +227,7 @@ else if options_.opt_gsa.lik_only && options_.opt_gsa.ppost==0 load([OutDir,filesep,fnamtmp, '.mat'],'x','logpo2','likelihood'); else - load([OutDir,filesep,fnamtmp, '.mat'],'x','logpo2','likelihood','rmse_MC','rmse_mode','rmse_pmean'); + load([OutDir,filesep,fnamtmp, '.mat'],'x','logpo2','likelihood','rmse_MC','rmse_mode','rmse_pmean', 'r2_MC', 'r2_mode','r2_pmean'); end lnprior=logpo2(:)-likelihood(:); nruns=size(x,1); @@ -260,16 +261,20 @@ else if options_.opt_gsa.ppost, %nfilt0(i)=length(find(rmse_MC(:,i)<rmse_pmean(i))); rmse_txt=rmse_pmean; + r2_txt=r2_pmean; else if options_.opt_gsa.pprior || ~exist('rmse_pmean'), if exist('rmse_mode'), rmse_txt=rmse_mode; + r2_txt=r2_mode; else rmse_txt=NaN(1,size(rmse_MC,2)); + r2_txt=NaN(1,size(r2_MC,2)); end else %nfilt0(i)=length(find(rmse_MC(:,i)<rmse_pmean(i))); rmse_txt=rmse_pmean; + r2_txt=r2_pmean; end end for j=1:npar+nshock, @@ -427,6 +432,38 @@ else % max(logpo2(ixx(nfilt+1:end,j)))])]) end + %%%%% R2 table + + disp(' ') + disp('R2 over the MC sample:') + disp(' min yr R2 max yr R2') + for j=1:size(vvarvecm,1), + disp([vvarvecm(j,:), sprintf('%15.5g',[(min(r2_MC(:,j))) [(max(r2_MC(:,j)))]])]) + end + r2_MC=r2_MC(:,ivar); + + disp(' ') + disp(['Sample filtered the ',num2str(pfilt*100),'% best R2''s for each observed series ...' ]) + + disp(' ') + disp(' ') + disp('R2 ranges after filtering:') + if options_.opt_gsa.ppost==0 && options_.opt_gsa.pprior, + disp([' best ',num2str(pfilt*100),'% filtered remaining 90%']) + disp([' min max min max posterior mode']) + else + disp([' best filtered remaining ']) + disp([' min max min max posterior mean']) + end + for j=1:size(vvarvecm,1), + disp([vvarvecm(j,:), sprintf('%15.5g',[min(r2_MC(ixx(1:nfilt0(j),j),j)) ... + max(r2_MC(ixx(1:nfilt0(j),j),j)) ... + min(r2_MC(ixx(nfilt0(j)+1:end,j),j)) ... + max(r2_MC(ixx(nfilt0(j)+1:end,j),j)) ... + r2_txt(j)])]) + end + + %%%% R2 table SP=zeros(npar+nshock,size(vvarvecm,1)); for j=1:size(vvarvecm,1), ns=find(PP(:,j)<alpha); -- GitLab