1%%% Test for Dynamic factor model (DFM) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% This script produces results for a variety of dynamic factor models (DFM)
3% using a panel of monthly and quarterly series that can be used for tests.
4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5
6
7%% Clear workspace and set paths.
8close all; clear; clc;
9addpath('functions');
10
11
12%% User inputs.
13vintage = '2016-06-29'; % vintage dataset to use for estimation
14country = 'US';         % United States macroeconomic data
15sample_start  = datenum('2000-01-01','yyyy-mm-dd'); % estimation sample
16
17
18%% Load model specification and dataset.
19% Load model specification structure `Spec`
20Spec = load_spec('test_spec.xls');
21% Load data
22datafile = fullfile('data',country,[vintage '.xls']);
23[X,Time,Z] = load_data(datafile,Spec,sample_start);
24
25% Basic settings
26threshold = 1e-4; % Set to 1e-5 for more robust estimates
27format long
28
29%% Test 1: p=1, k=1, max_iter=1
30Spec.p = 1;
31Spec.k = 1;
32max_iter = 1;
33
34Res = dfm(X,Spec,threshold,max_iter);
35Res = rmfield(Res, {'X_sm', 'Z', 'Vsmooth', 'VVsmooth'});
36
37kp = Spec.k * Spec.p;
38Lambda = Res.C(1:end, 1:Spec.k)';
39f_A = Res.A(1:Spec.k, 1:kp)';
40f_Q = Res.Q(1:Spec.k, 1:Spec.k);
41
42Ad = diag(Res.A);
43Qd = diag(Res.Q);
44
45idio = Spec.k * max(5, Spec.p) + 1;
46params = [Lambda(:)' f_A(:)' nonzeros(chol(f_Q)')' ...
47          Ad(idio:idio+3)' Ad(idio+3+5) Qd(idio:idio+3)' Qd(idio+3+5)]';
48save('test_dfm_111.mat','Res','Spec','params');
49
50
51%% Test 2: p=1, k=1, max_iter=2
52Spec.p = 1;
53Spec.k = 1;
54max_iter = 2;
55
56Res = dfm(X,Spec,threshold,max_iter);
57Res = rmfield(Res, {'X_sm', 'Z', 'Vsmooth', 'VVsmooth'});
58
59kp = Spec.k * Spec.p;
60Lambda = Res.C(1:end, 1:Spec.k)';
61f_A = Res.A(1:Spec.k, 1:kp)';
62f_Q = Res.Q(1:Spec.k, 1:Spec.k);
63
64Ad = diag(Res.A);
65Qd = diag(Res.Q);
66
67idio = Spec.k * max(5, Spec.p) + 1;
68params = [Lambda(:)' f_A(:)' nonzeros(chol(f_Q)')' ...
69          Ad(idio:idio+3)' Ad(idio+3+5) Qd(idio:idio+3)' Qd(idio+3+5)]';
70save('test_dfm_112.mat','Res','Spec','params');
71
72
73%% Test 3: p=1, k=1, max_iter=5000
74Spec.p = 1;
75Spec.k = 1;
76max_iter = 5000;
77
78Res = dfm(X,Spec,threshold,max_iter);
79Res = rmfield(Res, {'X_sm', 'Z', 'Vsmooth', 'VVsmooth'});
80
81kp = Spec.k * Spec.p;
82Lambda = Res.C(1:end, 1:Spec.k)';
83f_A = Res.A(1:Spec.k, 1:kp)';
84f_Q = Res.Q(1:Spec.k, 1:Spec.k);
85
86Ad = diag(Res.A);
87Qd = diag(Res.Q);
88
89idio = Spec.k * max(5, Spec.p) + 1;
90params = [Lambda(:)' f_A(:)' nonzeros(chol(f_Q)')' ...
91          Ad(idio:idio+3)' Ad(idio+3+5) Qd(idio:idio+3)' Qd(idio+3+5)]';
92save('test_dfm_11F.mat','Res','Spec','params');
93
94%% Test 4: p=2, k=2, max_iter=1
95Spec.p = 2;
96Spec.k = 2;
97max_iter = 1;
98
99Res = dfm(X,Spec,threshold,max_iter);
100Res = rmfield(Res, {'X_sm', 'Z', 'Vsmooth', 'VVsmooth'});
101
102kp = Spec.k * Spec.p;
103Lambda = Res.C(1:end, 1:Spec.k)';
104f_A = Res.A(1:Spec.k, 1:kp)';
105f_Q = Res.Q(1:Spec.k, 1:Spec.k);
106
107Ad = diag(Res.A);
108Qd = diag(Res.Q);
109
110idio = Spec.k * max(5, Spec.p) + 1;
111params = [Lambda(:)' f_A(:)' nonzeros(chol(f_Q)')' ...
112          Ad(idio:idio+3)' Ad(idio+3+5) Qd(idio:idio+3)' Qd(idio+3+5)]';
113save('test_dfm_221.mat','Res','Spec','params');
114
115
116%% Test 5: p=2, k=2, max_iter=2
117Spec.p = 2;
118Spec.k = 2;
119max_iter = 2;
120
121Res = dfm(X,Spec,threshold,max_iter);
122Res = rmfield(Res, {'X_sm', 'Z', 'Vsmooth', 'VVsmooth'});
123
124kp = Spec.k * Spec.p;
125Lambda = Res.C(1:end, 1:Spec.k)';
126f_A = Res.A(1:Spec.k, 1:kp)';
127f_Q = Res.Q(1:Spec.k, 1:Spec.k);
128
129Ad = diag(Res.A);
130Qd = diag(Res.Q);
131
132idio = Spec.k * max(5, Spec.p) + 1;
133params = [Lambda(:)' f_A(:)' nonzeros(chol(f_Q)')' ...
134          Ad(idio:idio+3)' Ad(idio+3+5) Qd(idio:idio+3)' Qd(idio+3+5)]';
135save('test_dfm_222.mat','Res','Spec','params');
136
137
138%% Test 6: p=2, k=2, max_iter=5000
139Spec.p = 2;
140Spec.k = 2;
141max_iter = 5000;
142
143Res = dfm(X,Spec,threshold,max_iter);
144Res = rmfield(Res, {'X_sm', 'Z', 'Vsmooth', 'VVsmooth'});
145
146kp = Spec.k * Spec.p;
147Lambda = Res.C(1:end, 1:Spec.k)';
148f_A = Res.A(1:Spec.k, 1:kp)';
149f_Q = Res.Q(1:Spec.k, 1:Spec.k);
150
151Ad = diag(Res.A);
152Qd = diag(Res.Q);
153
154idio = Spec.k * max(5, Spec.p) + 1;
155params = [Lambda(:)' f_A(:)' nonzeros(chol(f_Q)')' ...
156          Ad(idio:idio+3)' Ad(idio+3+5) Qd(idio:idio+3)' Qd(idio+3+5)]';
157save('test_dfm_22F.mat','Res','Spec','params');
158