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