MVGC "GCCA compatibility mode" demo
Demonstrates usage of the MVGC toolbox in "GCCA compatibility mode"; see Miscellaneous issues in the Help documentation. This is partly for the benefit of former users of the Granger Causal Connectivity Analysis (GCCA) Toolbox [2], and partly as an implementation of a more "traditional" approach to Granger causality computation. The chief difference is that here two separate VAR regressions - the full and reduced regressions (see [1]) - are explicitly performed (see GCCA_tsdata_to_pwcgc), in contrast to the MVGC Toolbox preferred approach (see mvgc_demo), which only requires a full regression and is consequently more flexible and numerically accurate.
Granger-causal pairwise-conditional analysis is demonstrated on generated VAR data for a 5-node network with known causal structure (see var5_test), as in the main MVGC Toolbox demonstration script, mvgc_demo. A drawback of the traditional dual regression approach is that in the frequency domain, conditional spectral causalities cannot be estimated to an acceptable standard; see [1] and GCCA_tsdata_to_smvgc for more detail.
Contents
References
[1] L. Barnett and A. K. Seth, The MVGC Multivariate Granger Causality Toolbox: A New Approach to Granger-causal Inference, J. Neurosci. Methods 223, 2014 [ preprint ].
[2] A. K. Seth, "A MATLAB toolbox for Granger causal connectivity analysis", J. Neurosci. Methods 186, 2010.
Parameters
ntrials = 10; % number of trials nobs = 1000; % number of observations per trial regmode = 'OLS'; % VAR model estimation regression mode ('OLS', 'LWR' or empty for default) icregmode = 'LWR'; % information criteria regression mode ('OLS', 'LWR' or empty for default) morder = 'AIC'; % model order to use ('actual', 'AIC', 'BIC' or supplied numerical value) momax = 20; % maximum model order for model order estimation tstat = ''; % statistical test for MVGC: 'chi2' for Geweke's chi2 test (default) or'F' for Granger's F-test alpha = 0.05; % significance level for significance test mhtc = 'FDR'; % multiple hypothesis test correction (see routine 'significance') seed = 0; % random seed (0 for unseeded)
Generate VAR test data
Note: This is where you would read in your own time series data; it should be assigned to the variable X (see below and Common variable names and data structures).
% Seed random number generator. rng_seed(seed); % Get VAR coefficients for 5-node test network. AT = var5_test; nvars = size(AT,1); % number of variables % Residuals covariance matrix. SIGT = eye(nvars); % Generate VAR time series data with normally distributed residuals for % specified coefficients and covariance matrix. ptic('\n*** var_to_tsdata... '); X = var_to_tsdata(AT,SIGT,nobs,ntrials); ptoc;
Model order estimation
% Calculate information criteria up to max model order ptic('\n*** tsdata_to_infocrit\n'); [AIC,BIC] = tsdata_to_infocrit(X,momax,icregmode); ptoc('*** tsdata_to_infocrit took '); [~,bmo_AIC] = min(AIC); [~,bmo_BIC] = min(BIC); % Plot information criteria. figure(1); clf; plot((1:momax)',[AIC BIC]); legend('AIC','BIC'); amo = size(AT,3); % actual model order fprintf('\nbest model order (AIC) = %d\n',bmo_AIC); fprintf('best model order (BIC) = %d\n',bmo_BIC); fprintf('actual model order = %d\n',amo); % Select model order if strcmpi(morder,'actual') morder = amo; fprintf('\nusing actual model order = %d\n',morder); elseif strcmpi(morder,'AIC') morder = bmo_AIC; fprintf('\nusing AIC best model order = %d\n',morder); elseif strcmpi(morder,'BIC') morder = bmo_BIC; fprintf('\nusing BIC best model order = %d\n',morder); else fprintf('\nusing specified model order = %d\n',morder); end
Granger causality estimation
% Calculate time-domain pairwise-conditional causalities. Return VAR parameters % so we can check VAR. ptic('\n*** GCCA_tsdata_to_pwcgc... '); [F,A,SIG] = GCCA_tsdata_to_pwcgc(X,morder,regmode); % use same model order for reduced as for full regressions ptoc; % Check for failed (full) regression assert(~isbad(A),'VAR estimation failed'); % Check for failed GC calculation assert(~isbad(F,false),'GC calculation failed'); % Check VAR parameters (but don't bail out on error - GCCA mode is quite forgiving!) rho = var_specrad(A); fprintf('\nspectral radius = %f\n',rho); if rho >= 1, fprintf(2,'WARNING: unstable VAR (unit root)\n'); end if ~isposdef(SIG), fprintf(2,'WARNING: residuals covariance matrix not positive-definite\n'); end % Significance test using theoretical null distribution, adjusting for multiple % hypotheses. pval = mvgc_pval(F,morder,nobs,ntrials,1,1,nvars-2,tstat); sig = significance(pval,alpha,mhtc); % Plot time-domain causal graph, p-values and significance. figure(2); clf; subplot(1,3,1); plot_pw(F); title('Pairwise-conditional GC'); subplot(1,3,2); plot_pw(pval); title('p-values'); subplot(1,3,3); plot_pw(sig); title(['Significant at p = ' num2str(alpha)]) fprintf(2,'\nNOTE: no frequency-domain pairwise-conditional causality calculation in GCCA compatibility mode!\n');