Home > spm_vbglmar_slice > spm_vb_a.m

spm_vb_a

PURPOSE ^

Update AR coefficients in VB GLM-AR model

SYNOPSIS ^

function [slice] = spm_vb_a (Y,slice)

DESCRIPTION ^

 Update AR coefficients in VB GLM-AR model 
 FORMAT [slice] = spm_vb_a (Y,slice)

 Y             [T x N] time series 
 slice         data structure 

 %W% Will Penny and Nelson Trujillo-Barreto %E%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [slice] = spm_vb_a (Y,slice)
0002 % Update AR coefficients in VB GLM-AR model
0003 % FORMAT [slice] = spm_vb_a (Y,slice)
0004 %
0005 % Y             [T x N] time series
0006 % slice         data structure
0007 %
0008 % %W% Will Penny and Nelson Trujillo-Barreto %E%
0009 
0010 if slice.verbose
0011     disp('Updating a');
0012 end
0013 
0014 p=slice.p;
0015 k=slice.k;
0016 N=slice.N;
0017 T=slice.T;
0018 Jk = kron(diag(slice.mean_beta),slice.D);
0019 J=slice.Ha*Jk*slice.Ha';
0020 
0021 Y_err_w = Y(p+1:T,:) - slice.X(p+1:T,:)*reshape(slice.w_mean,k,N);
0022 
0023 for n=1:N,
0024     
0025     % Set up indexes
0026     wblock_n      = [(n-1)*k+1:n*k]; % Indexes for regression coeffs
0027     block_n       = [(n-1)*p+1:n*p]; % Indexes for AR coeffs
0028     block_ni          = [1:N*p];
0029     block_ni(block_n) = [];
0030     Jnn               = J(block_n,block_n);
0031     Jni               = J(block_n,block_ni);
0032     
0033     w_mean=slice.w_mean(wblock_n);
0034     
0035     % C_tilde and D_tilde:
0036     % Previously equation 50 in paper VB1
0037     % but now using more efficient cross-covariance formulae in paper VB3
0038     C1=slice.I.Gy(:,:,n);
0039     C2=reshape(slice.I.S'*slice.w2{n}(:),p,p);
0040     C3=-slice.I.W_tilde(:,:,n);
0041     C4=C3';
0042     C_til=C1+C2+C3+C4;
0043    
0044     D1=slice.I.gy(:,n)';
0045     D2=(-slice.I.rxy(:,:,n)*w_mean)';
0046     D3=(-slice.I.Gxy(:,:,n)*w_mean)';
0047     D4=slice.w2{n}(:)'*slice.I.R1;
0048     D_til=D1+D2+D3+D4;
0049     
0050     % Spatially regularised AR coefficients - paper VB4
0051     slice.a_cov{n}  = inv(slice.mean_lambda(n)*C_til + Jnn);
0052     a_mean = slice.a_cov{n}*(slice.mean_lambda(n)*D_til'-Jni*slice.a_mean(block_ni,1));
0053     slice.a_mean(block_n,1)=a_mean;
0054     slice.a2{n}=a_mean*a_mean'+slice.a_cov{n};
0055     
0056     % Intermediate quantities for updating other parameters
0057     % - see section on cross-covariance formulae in paper VB3
0058     slice.I.A2_tilde(:,:,n)=reshape(slice.I.S*slice.a2{n}(:),k,k);
0059     slice.I.A3a_tilde(:,:,n)=-reshape(slice.I.R1*a_mean,k,k);
0060 end
0061  
0062 slice.ap_mean = reshape(slice.a_mean,p,N);
0063

Generated on Mon 23-Aug-2004 14:59:38 by m2html © 2003