0001 function ConditionalVarianceDecomposition = conditional_variance_decomposition(StateSpaceModel, Steps, SubsetOfVariables,sigma_e_is_diagonal)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 if any(Steps <= 0)
0037 error(['Conditional variance decomposition: All periods must be strictly ' ...
0038 'positive'])
0039 end
0040
0041 number_of_state_innovations = ...
0042 StateSpaceModel.number_of_state_innovations;
0043 transition_matrix = StateSpaceModel.transition_matrix;
0044 number_of_state_equations = ...
0045 StateSpaceModel.number_of_state_equations;
0046 order_var = StateSpaceModel.order_var;
0047 nSteps = length(Steps);
0048
0049 ConditionalVariance = zeros(number_of_state_equations,nSteps,number_of_state_innovations);
0050
0051 if StateSpaceModel.sigma_e_is_diagonal
0052 B = StateSpaceModel.impulse_matrix.* ...
0053 repmat(sqrt(diag(StateSpaceModel.state_innovations_covariance_matrix)'),...
0054 number_of_state_equations,1);
0055 else
0056 B = StateSpaceModel.impulse_matrix*chol(StateSpaceModel.state_innovations_covariance_matrix)';
0057 end
0058
0059 for i=1:number_of_state_innovations
0060 BB = B(:,i)*B(:,i)';
0061 V = zeros(number_of_state_equations,number_of_state_equations);
0062 m = 1;
0063 for h = 1:max(Steps)
0064 V = transition_matrix*V*transition_matrix'+BB;
0065 if h == Steps(m)
0066 ConditionalVariance(order_var,m,i) = diag(V);
0067 m = m+1;
0068 end
0069 end
0070 end
0071
0072 ConditionalVariance = ConditionalVariance(SubsetOfVariables,:,:);
0073
0074 NumberOfVariables = length(SubsetOfVariables);
0075 SumOfVariances = zeros(NumberOfVariables,nSteps);
0076 for h = 1:length(Steps)
0077 SumOfVariances(:,h) = sum(ConditionalVariance(:,h,:),3);
0078 end
0079
0080 ConditionalVarianceDecomposition = zeros(NumberOfVariables,length(Steps),number_of_state_innovations);
0081 for i=1:number_of_state_innovations
0082 for h = 1:length(Steps)
0083 ConditionalVarianceDecomposition(:,h,i) = squeeze(ConditionalVariance(:,h,i))./SumOfVariances(:,h);
0084 end
0085 end