compute_moments_varendo.m 15.1 KB
Newer Older
1
2
function oo_ = compute_moments_varendo(type, options_, M_, oo_, var_list_)

adjemian's avatar
adjemian committed
3
% Computes the second order moments (autocorrelation function, covariance
stepan's avatar
   
stepan committed
4
% matrix and variance decomposition) distributions for all the endogenous variables selected in
adjemian's avatar
adjemian committed
5
% var_list_. The results are saved in oo_
6
%
adjemian's avatar
adjemian committed
7
% INPUTS:
8
9
10
11
12
%   type            [string]                    'posterior' or 'prior'
%   options_        [structure]                 Dynare structure.
%   M_              [structure]                 Dynare structure (related to model definition).
%   oo_             [structure]                 Dynare structure (results).
%   var_list_       [cell of char arrays]       Endogenous variable names.
13
%
adjemian's avatar
adjemian committed
14
15
16
17
18
19
% OUTPUTS
%   oo_             [structure]    Dynare structure (results).
%
% SPECIAL REQUIREMENTS
%   none

20
% Copyright (C) 2008-2021 Dynare Team
adjemian's avatar
adjemian committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
%
% 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
35
% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
36

37

38
fprintf('Estimation::compute_moments_varendo: I''m computing endogenous moments (this may take a while)... \n');
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
if options_.order==1
    if options_.one_sided_hp_filter
        fprintf('Estimation::compute_moments_varendo: theoretical moments incompatible with one-sided HP filter. Skipping computations.\n')
        return
    end
else
    if ~options_.pruning
        fprintf('Estimation::compute_moments_varendo: theoretical moments at order>1 require pruning. Skipping computations.\n')
        return
    else
        if options_.one_sided_hp_filter || options_.hp_filter || options_.bandpass.indicator
            fprintf(['Estimation::compute_moments_varendo: theoretical pruned moments incompatible with filtering. Skipping computations\n'])
        end        
    end
end

56
57
58
if strcmpi(type,'posterior')
    posterior = 1;
    if nargin==4
59
        var_list_ = options_.varobs;
60
    end
61
62
63
    if isfield(oo_,'PosteriorTheoreticalMoments')
        oo_=rmfield(oo_,'PosteriorTheoreticalMoments');
    end
64
65
66
67
68
elseif strcmpi(type,'prior')
    posterior = 0;
    if nargin==4
        var_list_ = options_.prior_analysis_endo_var_list;
        if isempty(var_list_)
69
            options_.prior_analysis_var_list = options_.varobs;
stepan's avatar
   
stepan committed
70
        end
stepan's avatar
   
stepan committed
71
    end
72
73
74
    if isfield(oo_,'PriorTheoreticalMoments')
        oo_=rmfield(oo_,'PriorTheoreticalMoments');
    end
75
else
Johannes Pfeifer's avatar
Johannes Pfeifer committed
76
    error('compute_moments_varendo:: Unknown type!')
77
end
stepan's avatar
   
stepan committed
78

79
NumberOfEndogenousVariables = length(var_list_);
80
81
NumberOfExogenousVariables = M_.exo_nbr;
NumberOfLags = options_.ar;
82
NoDecomposition = options_.nodecomposition;
83
84
85
86
87
if isfield(options_,'conditional_variance_decomposition')
    Steps = options_.conditional_variance_decomposition;
else
    Steps = 0;
end
stepan's avatar
   
stepan committed
88

89
if options_.TeX
90
91
92
    var_list_tex={};
    for var_iter = 1:length(var_list_)
        var_list_tex = vertcat(var_list_tex, M_.endo_names_tex{strmatch(var_list_{var_iter}, M_.endo_names, 'exact')});
93
94
95
    end
end

96
97
98
99
% COVARIANCE MATRIX.
if posterior
    for i=1:NumberOfEndogenousVariables
        for j=i:NumberOfEndogenousVariables
100
            oo_ = posterior_analysis('variance', var_list_{i}, var_list_{j}, [], options_, M_, oo_);
adjemian's avatar
adjemian committed
101
102
        end
    end
103
104
105
else
    for i=1:NumberOfEndogenousVariables
        for j=i:NumberOfEndogenousVariables
106
            oo_ = prior_analysis('variance', var_list_{i}, var_list_{j}, [], options_, M_, oo_);
adjemian's avatar
adjemian committed
107
108
        end
    end
109
end
110

111
112
113
% CORRELATION FUNCTION.
if posterior
    for h=NumberOfLags:-1:1
stepan's avatar
   
stepan committed
114
        for i=1:NumberOfEndogenousVariables
115
            for j=1:NumberOfEndogenousVariables
116
                oo_ = posterior_analysis('correlation', var_list_{i}, var_list_{j}, h, options_, M_, oo_);
stepan's avatar
   
stepan committed
117
            end
adjemian's avatar
adjemian committed
118
        end
stepan's avatar
   
stepan committed
119
    end
120
121
else
    for h=NumberOfLags:-1:1
stepan's avatar
   
stepan committed
122
        for i=1:NumberOfEndogenousVariables
123
            for j=1:NumberOfEndogenousVariables
124
                oo_ = prior_analysis('correlation', var_list_{i}, var_list_{j}, h, options_, M_, oo_);
stepan's avatar
   
stepan committed
125
126
            end
        end
127
128
    end
end
129

130
% VARIANCE DECOMPOSITION.
131
132
133
134
if options_.order==1
    if M_.exo_nbr > 1
        if ~NoDecomposition
            temp=NaN(NumberOfEndogenousVariables,NumberOfExogenousVariables);
135
            if posterior
136
                for i=1:NumberOfEndogenousVariables
137
                    for j=1:NumberOfExogenousVariables
138
139
                        oo_ = posterior_analysis('decomposition', var_list_{i}, M_.exo_names{j}, [], options_, M_, oo_);
                        temp(i,j) = oo_.PosteriorTheoreticalMoments.dsge.VarianceDecomposition.Mean.(var_list_{i}).(M_.exo_names{j});
140
141
                    end
                end
142
143
                title='Posterior mean variance decomposition (in percent)';
                save_name_string='dsge_post_mean_var_decomp_uncond';
144
            else
145
                for i=1:NumberOfEndogenousVariables
146
                    for j=1:NumberOfExogenousVariables
147
148
                        oo_ = prior_analysis('decomposition', var_list_{i}, M_.exo_names{j}, [], options_, M_, oo_);
                        temp(i,j)=oo_.PriorTheoreticalMoments.dsge.VarianceDecomposition.Mean.(var_list_{i}).(M_.exo_names{j});
149
150
                    end
                end
151
152
                title='Prior mean variance decomposition (in percent)';
                save_name_string='dsge_prior_mean_var_decomp_uncond';
153
            end
154
            title=add_filter_subtitle(title, options_);
155
            headers = M_.exo_names;
156
157
158
            headers(M_.exo_names_orig_ord) = headers;
            headers = vertcat(' ', headers);
            lh = cellofchararraymaxlength(var_list_)+2;
159
            dyntable(options_, title, headers, var_list_, 100*temp, lh, 8, 2);
160
            if options_.TeX
161
162
163
                headers = M_.exo_names_tex;
                headers = vertcat(' ', headers);
                labels = var_list_tex;
164
165
                lh = size(labels,2)+2;
                dyn_latex_table(M_, options_, title, save_name_string, headers, labels, 100*temp, lh, 8, 2);
166
            end
167
            skipline();
168
        end
169
        skipline();
170
        if ~all(diag(M_.H)==0)
171
            [observable_name_requested_vars, varlist_pos] = intersect(var_list_, options_.varobs, 'stable');
172
            if ~isempty(observable_name_requested_vars)
173
                NumberOfObservedEndogenousVariables = length(observable_name_requested_vars);
174
                temp = NaN(NumberOfObservedEndogenousVariables, NumberOfExogenousVariables+1);
175
176
177
                if posterior
                    for i=1:NumberOfObservedEndogenousVariables
                        for j=1:NumberOfExogenousVariables
178
                            temp(i,j,:) = oo_.PosteriorTheoreticalMoments.dsge.VarianceDecompositionME.Mean.(observable_name_requested_vars{i}).(M_.exo_names{j});
179
                        end
180
                        endo_index_varlist = strmatch(observable_name_requested_vars{i}, var_list_, 'exact');
181
182
                        oo_ = posterior_analysis('decomposition', var_list_{endo_index_varlist}, 'ME', [], options_, M_, oo_);
                        temp(i,j+1,:) = oo_.PosteriorTheoreticalMoments.dsge.VarianceDecompositionME.Mean.(observable_name_requested_vars{i}).('ME');
183
                    end
184
185
                    title='Posterior mean variance decomposition (in percent) with measurement error';
                    save_name_string='dsge_post_mean_var_decomp_uncond_ME';
186
                else
187
                    for i=1:NumberOfObservedEndogenousVariables
188
                        for j=1:NumberOfExogenousVariables
189
                            temp(i,j,:) = oo_.PriorTheoreticalMoments.dsge.VarianceDecompositionME.Mean.(observable_name_requested_vars{i}).(M_.exo_names{j});
190
                        end
191
                        endo_index_varlist = strmatch(observable_name_requested_vars{i}, var_list_, 'exact');
192
193
                        oo_ = prior_analysis('decomposition', var_list_{endo_index_varlist}, 'ME', [], options_, M_, oo_);
                        temp(i,j+1,:) = oo_.PriorTheoreticalMoments.dsge.VarianceDecompositionME.Mean.(observable_name_requested_vars{i}).('ME');
194
                    end
195
196
                    title='Prior mean variance decomposition (in percent) with measurement error';
                    save_name_string='dsge_prior_mean_var_decomp_uncond_ME';
197
                end
198
199
200
201
202
203
204
205
                title=add_filter_subtitle(title, options_);
                headers = M_.exo_names;
                headers(M_.exo_names_orig_ord) = headers;
                headers = vertcat(' ', headers, 'ME');
                lh = cellofchararraymaxlength(var_list_)+2;
                dyntable(options_, title, headers, observable_name_requested_vars,100*temp,lh,8,2);
                if options_.TeX
                    headers = M_.exo_names_tex;
206
                    headers = vertcat(' ', headers, 'ME');
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
                    labels = var_list_tex(varlist_pos);
                    lh = cellofchararraymaxlength(labels)+2;
                    dyn_latex_table(M_, options_, title, save_name_string, headers, labels, 100*temp, lh, 8, 2);
                end
                skipline();
            end
        end
        % CONDITIONAL VARIANCE DECOMPOSITION.
        if Steps
            temp = NaN(NumberOfEndogenousVariables, NumberOfExogenousVariables, length(Steps));
            if posterior
                for i=1:NumberOfEndogenousVariables
                    for j=1:NumberOfExogenousVariables
                        oo_ = posterior_analysis('conditional decomposition', var_list_{i}, M_.exo_names{j}, Steps, options_, M_, oo_);
                        temp(i,j,:) = oo_.PosteriorTheoreticalMoments.dsge.ConditionalVarianceDecomposition.Mean.(var_list_{i}).(M_.exo_names{j});
                    end
                end
                title = 'Posterior mean conditional variance decomposition (in percent)';
                save_name_string = 'dsge_post_mean_var_decomp_cond_h';
            else
                for i=1:NumberOfEndogenousVariables
                    for j=1:NumberOfExogenousVariables
                        oo_ = prior_analysis('conditional decomposition', var_list_{i}, M_.exo_names{j}, Steps, options_, M_, oo_);
                        temp(i,j,:) = oo_.PriorTheoreticalMoments.dsge.ConditionalVarianceDecomposition.Mean.(var_list_{i}).(M_.exo_names{j});
                    end
                end
                title = 'Prior mean conditional variance decomposition (in percent)';
                save_name_string = 'dsge_prior_mean_var_decomp_cond_h';
            end
            for step_iter=1:length(Steps)
                title_print=[title, ' Period ' int2str(Steps(step_iter))];
                headers = M_.exo_names;
                headers(M_.exo_names_orig_ord) = headers;
                headers = vertcat(' ', headers);
                lh = cellofchararraymaxlength(var_list_)+2;
                dyntable(options_,title_print,headers, var_list_,100* ...
                    temp(:,:,step_iter),lh,8,2);
                if options_.TeX
                    headers = M_.exo_names_tex;
                    headers = vertcat(' ', headers);
                    labels = var_list_tex;
                    lh = cellofchararraymaxlength(labels)+2;
                    dyn_latex_table(M_, options_, title_print, [save_name_string, int2str(Steps(step_iter))], headers, labels, 100*temp(:,:,step_iter), lh, 8, 2);
                end
            end
            skipline();
            if ~all(diag(M_.H)==0)
                if ~isempty(observable_name_requested_vars)
                    NumberOfObservedEndogenousVariables = length(observable_name_requested_vars);
                    temp=NaN(NumberOfObservedEndogenousVariables,NumberOfExogenousVariables+1,length(Steps));
                    if posterior
                        for i=1:NumberOfObservedEndogenousVariables
                            for j=1:NumberOfExogenousVariables
                                temp(i,j,:) = oo_.PosteriorTheoreticalMoments.dsge.ConditionalVarianceDecompositionME.Mean.(observable_name_requested_vars{i}).(M_.exo_names{j});
                            end
                            endo_index_varlist = strmatch(observable_name_requested_vars{i}, var_list_, 'exact');
                            oo_ = posterior_analysis('conditional decomposition', var_list_{endo_index_varlist}, 'ME', Steps, options_, M_, oo_);
                            temp(i,j+1,:) = oo_.PosteriorTheoreticalMoments.dsge.ConditionalVarianceDecompositionME.Mean.(observable_name_requested_vars{i}).('ME');
                        end
                        title = 'Posterior mean conditional variance decomposition (in percent) with measurement error';
                        save_name_string = 'dsge_post_mean_var_decomp_ME_cond_h';
                    else
                        for i=1:NumberOfObservedEndogenousVariables
                            for j=1:NumberOfExogenousVariables
                                temp(i,j,:) = oo_.PriorTheoreticalMoments.dsge.ConditionalVarianceDecompositionME.Mean.(observable_name_requested_vars{i}).(M_.exo_names{j});
                            end
                            endo_index_varlist = strmatch(observable_name_requested_vars{i}, var_list_, 'exact');
                            oo_ = prior_analysis('conditional decomposition', var_list_{endo_index_varlist}, 'ME', Steps, options_, M_, oo_);
                            temp(i,j+1,:) = oo_.PriorTheoreticalMoments.dsge.ConditionalVarianceDecompositionME.Mean.(observable_name_requested_vars{i}).('ME');
                        end
                        title = 'Prior mean conditional variance decomposition (in percent) with measurement error';
                        save_name_string = 'dsge_prior_mean_var_decomp_ME_cond_h';
                    end
                    for step_iter=1:length(Steps)
                        title_print = [title, ' Period ' int2str(Steps(step_iter))];
                        headers = M_.exo_names;
                        headers(M_.exo_names_orig_ord) = headers;
284
                        headers = vertcat(' ', headers, 'ME');
285
286
287
288
289
290
291
292
293
                        lh = cellofchararraymaxlength(var_list_)+2;
                        dyntable(options_, title_print, headers, observable_name_requested_vars, 100*temp(:,:,step_iter), lh, 8, 2);
                        if options_.TeX
                            headers = M_.exo_names_tex;
                            headers = vertcat(' ', headers, 'ME');
                            labels = var_list_tex(varlist_pos);
                            lh = cellofchararraymaxlength(labels)+2;
                            dyn_latex_table(M_, options_, title_print, [save_name_string, int2str(Steps(step_iter))], headers, labels, 100*temp(:,:,step_iter), lh, 8, 2);
                        end
294
                    end
295
                    skipline();
296
297
                end
            end
298
        end
299
    end
300
301
else
    fprintf(['Estimation::compute_moments_varendo: (conditional) variance decomposition only available at order=1. Skipping computations\n'])
302
end
303
fprintf('Done!\n\n');