Home > . > th_autocovariances.m

th_autocovariances

PURPOSE ^

Copyright (C) 2001 Michel Juillard

SYNOPSIS ^

function [Gamma_y,ivar]=th_autocovariances(dr,ivar)

DESCRIPTION ^

 Copyright (C) 2001 Michel Juillard

 computes the theoretical auto-covariances, Gamma_y, for an AR(p) process 
 with coefficients dr.ghx and dr.ghu and shock variances Sigma_e_
 for a subset of variables ivar (indices in lgy_)
 Theoretical HP filtering is available as an option

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % Copyright (C) 2001 Michel Juillard
0002 %
0003 % computes the theoretical auto-covariances, Gamma_y, for an AR(p) process
0004 % with coefficients dr.ghx and dr.ghu and shock variances Sigma_e_
0005 % for a subset of variables ivar (indices in lgy_)
0006 % Theoretical HP filtering is available as an option
0007 
0008 function [Gamma_y,ivar]=th_autocovariances(dr,ivar)
0009   global M_ options_
0010 
0011   exo_names_orig_ord  = M_.exo_names_orig_ord;
0012   if sscanf(version('-release'),'%d') < 13
0013     warning off
0014   else
0015     eval('warning off MATLAB:dividebyzero')
0016   end
0017   nar = options_.ar;
0018   Gamma_y = cell(nar+1,1);
0019   if isempty(ivar)
0020     ivar = [1:M_.endo_nbr]';
0021   end
0022   nvar = size(ivar,1);
0023   
0024   ghx = dr.ghx;
0025   ghu = dr.ghu;
0026   npred = dr.npred;
0027   nstatic = dr.nstatic;
0028   kstate = dr.kstate;
0029   order = dr.order_var;
0030   iv(order) = [1:length(order)];
0031   nx = size(ghx,2);
0032   
0033   ikx = [nstatic+1:nstatic+npred];
0034   
0035   A = zeros(nx,nx);
0036   k0 = kstate(find(kstate(:,2) <= M_.maximum_lag+1),:);
0037   i0 = find(k0(:,2) == M_.maximum_lag+1);
0038   i00 = i0;
0039   n0 = length(i0);
0040   A(i0,:) = ghx(ikx,:);
0041   AS = ghx(:,i0);
0042   ghu1 = zeros(nx,M_.exo_nbr);
0043   ghu1(i0,:) = ghu(ikx,:);
0044   for i=M_.maximum_lag:-1:2
0045     i1 = find(k0(:,2) == i);
0046     n1 = size(i1,1);
0047     j1 = zeros(n1,1);
0048     j2 = j1;
0049     for k1 = 1:n1
0050       j1(k1) = find(k0(i00,1)==k0(i1(k1),1));
0051       j2(k1) = find(k0(i0,1)==k0(i1(k1),1));
0052     end
0053     AS(:,j1) = AS(:,j1)+ghx(:,i1);
0054     i0 = i1;
0055   end
0056   b = ghu1*M_.Sigma_e*ghu1';
0057 
0058 
0059   [A,B] = kalman_transition_matrix(dr);
0060   % index of predetermined variables in A
0061   i_pred = [nstatic+(1:npred) M_.endo_nbr+1:length(A)];
0062   A = A(i_pred,i_pred);
0063 
0064   if options_.order == 2
0065     [vx,ns_var] =  lyapunov_symm(A,b);
0066     i_ivar = find(~ismember(ivar,dr.order_var(ns_var+nstatic)));
0067     ivar = ivar(i_ivar);
0068     iky = iv(ivar);  
0069     aa = ghx(iky,:);
0070     bb = ghu(iky,:);
0071     Ex = (dr.ghs2(ikx)+dr.ghxx(ikx,:)*vx(:)+dr.ghuu(ikx,:)*M_.Sigma_e(:))/2;
0072     Ex = (eye(n0)-AS(ikx,:))\Ex;
0073     Gamma_y{nar+3} = AS(iky,:)*Ex+(dr.ghs2(iky)+dr.ghxx(iky,:)*vx(:)+dr.ghuu(iky,:)*M_.Sigma_e(:))/2;
0074   end
0075   if options_.hp_filter == 0
0076     if options_.order < 2
0077       [vx, ns_var] =  lyapunov_symm(A,b);
0078       i_ivar = find(~ismember(ivar,dr.order_var(ns_var+nstatic)));
0079       ivar = ivar(i_ivar);
0080       iky = iv(ivar);  
0081       aa = ghx(iky,:);
0082       bb = ghu(iky,:);
0083     end
0084     Gamma_y{1} = aa*vx*aa'+ bb*M_.Sigma_e*bb';
0085     k = find(abs(Gamma_y{1}) < 1e-12);
0086     Gamma_y{1}(k) = 0;
0087     
0088     % autocorrelations
0089     if nar > 0
0090       vxy = (A*vx*aa'+ghu1*M_.Sigma_e*bb');
0091 
0092       sy = sqrt(diag(Gamma_y{1}));
0093       sy = sy *sy';
0094       Gamma_y{2} = aa*vxy./sy;
0095       
0096       for i=2:nar
0097     vxy = A*vxy;
0098     Gamma_y{i+1} = aa*vxy./sy;
0099       end
0100     end
0101     
0102     % variance decomposition
0103     if M_.exo_nbr > 1
0104       Gamma_y{nar+2} = zeros(length(ivar),M_.exo_nbr);
0105       SS(exo_names_orig_ord,exo_names_orig_ord)=M_.Sigma_e+1e-14*eye(M_.exo_nbr);
0106       cs = chol(SS)';
0107       b1(:,exo_names_orig_ord) = ghu1;
0108       b1 = b1*cs;
0109       b2(:,exo_names_orig_ord) = ghu(iky,:);
0110       b2 = b2*cs;
0111       vx  = lyapunov_symm(A,b1*b1');
0112       vv = diag(aa*vx*aa'+b2*b2');
0113       for i=1:M_.exo_nbr
0114     vx1 = lyapunov_symm(A,b1(:,i)*b1(:,i)');
0115     Gamma_y{nar+2}(:,i) = abs(diag(aa*vx1*aa'+b2(:,i)*b2(:,i)'))./vv;
0116       end
0117     end
0118   else
0119     if options_.order < 2
0120       iky = iv(ivar);  
0121       aa = ghx(iky,:);
0122       bb = ghu(iky,:);
0123     end
0124     lambda = options_.hp_filter;
0125     ngrid = options_.hp_ngrid;
0126     freqs = 0 : ((2*pi)/ngrid) : (2*pi*(1 - .5/ngrid)); 
0127     tpos  = exp( sqrt(-1)*freqs);
0128     tneg  =  exp(-sqrt(-1)*freqs);
0129     hp1 = 4*lambda*(1 - cos(freqs)).^2 ./ (1 + 4*lambda*(1 - cos(freqs)).^2);
0130     
0131     mathp_col = [];
0132     IA = eye(size(A,1));
0133     IE = eye(M_.exo_nbr);
0134     for ig = 1:ngrid
0135       f_omega  =(1/(2*pi))*( [inv(IA-A*tneg(ig))*ghu1;IE]...
0136                  *M_.Sigma_e*[ghu1'*inv(IA-A'*tpos(ig)) ...
0137             IE]); % state variables
0138       g_omega = [aa*tneg(ig) bb]*f_omega*[aa'*tpos(ig); bb']; % selected variables
0139       f_hp = hp1(ig)^2*g_omega; % spectral density of selected filtered series
0140       mathp_col = [mathp_col ; (f_hp(:))'];    % store as matrix row
0141                                                % for ifft
0142     end;
0143 
0144     % covariance of filtered series
0145     imathp_col = real(ifft(mathp_col))*(2*pi);
0146 
0147     Gamma_y{1} = reshape(imathp_col(1,:),nvar,nvar);
0148     
0149     % autocorrelations
0150     if nar > 0
0151       sy = sqrt(diag(Gamma_y{1}));
0152       sy = sy *sy';
0153       for i=1:nar
0154     Gamma_y{i+1} = reshape(imathp_col(i+1,:),nvar,nvar)./sy;
0155       end
0156     end
0157     
0158     %variance decomposition
0159     if M_.exo_nbr > 1 
0160       Gamma_y{nar+2} = zeros(nvar,M_.exo_nbr);
0161       SS(exo_names_orig_ord,exo_names_orig_ord)=M_.Sigma_e+1e-14*eye(M_.exo_nbr);
0162       cs = chol(SS)';
0163       SS = cs*cs';
0164       b1(:,exo_names_orig_ord) = ghu1;
0165       b2(:,exo_names_orig_ord) = ghu(iky,:);
0166       mathp_col = [];
0167       IA = eye(size(A,1));
0168       IE = eye(M_.exo_nbr);
0169       for ig = 1:ngrid
0170     f_omega  =(1/(2*pi))*( [inv(IA-A*tneg(ig))*b1;IE]...
0171                    *SS*[b1'*inv(IA-A'*tpos(ig)) ...
0172             IE]); % state variables
0173     g_omega = [aa*tneg(ig) b2]*f_omega*[aa'*tpos(ig); b2']; % selected variables
0174     f_hp = hp1(ig)^2*g_omega; % spectral density of selected filtered series
0175     mathp_col = [mathp_col ; (f_hp(:))'];    % store as matrix row
0176                          % for ifft
0177       end;
0178 
0179       imathp_col = real(ifft(mathp_col))*(2*pi);
0180       vv = diag(reshape(imathp_col(1,:),nvar,nvar));
0181       for i=1:M_.exo_nbr
0182     mathp_col = [];
0183     SSi = cs(:,i)*cs(:,i)';
0184     for ig = 1:ngrid
0185       f_omega  =(1/(2*pi))*( [inv(IA-A*tneg(ig))*b1;IE]...
0186                  *SSi*[b1'*inv(IA-A'*tpos(ig)) ...
0187             IE]); % state variables
0188       g_omega = [aa*tneg(ig) b2]*f_omega*[aa'*tpos(ig); b2']; % selected variables
0189       f_hp = hp1(ig)^2*g_omega; % spectral density of selected filtered series
0190       mathp_col = [mathp_col ; (f_hp(:))'];    % store as matrix row
0191                            % for ifft
0192     end;
0193 
0194     imathp_col = real(ifft(mathp_col))*(2*pi);
0195     Gamma_y{nar+2}(:,i) = abs(diag(reshape(imathp_col(1,:),nvar,nvar)))./vv;
0196       end
0197     end
0198   end
0199   if sscanf(version('-release'),'%d') < 13
0200     warning on
0201   else
0202     eval('warning on MATLAB:dividebyzero')
0203   end
0204

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003