123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- function [P] = spm_dcm_fit(P,use_parfor)
- % Bayesian inversion of DCMs using Variational Laplace
- % FORMAT [DCM] = spm_dcm_fit(P)
- %
- % P - {N x M} DCM structure array (or filenames) from N subjects
- % use_parfor - if true, will attempt to run in parallel (default: false)
- % NB: all DCMs are loaded into memory
- %
- % DCM - Inverted (1st level) DCM structures with posterior densities
- %__________________________________________________________________________
- %
- % This routine is just a wrapper that calls the appropriate dcm inversion
- % routine for a set a pre-specifed DCMs.
- %
- % If called with a cell array, each column is assumed to contain 1st level
- % DCMs inverted under the same model. Each row contains a different data
- % set (or subject).
- %__________________________________________________________________________
- % Copyright (C) 2015 Wellcome Trust Centre for Neuroimaging
- % Karl Friston
- % $Id: spm_dcm_fit.m 7364 2018-07-03 14:02:46Z peter $
- if nargin < 2, use_parfor = false; end
- % get filenames and set up
- %--------------------------------------------------------------------------
- if ~nargin
- [P, sts] = spm_select([1 Inf],'^DCM.*\.mat$','Select DCM*.mat files');
- if ~sts, return; end
- end
- if ischar(P), P = cellstr(P); end
- if isstruct(P), P = {P}; end
- % Number of subjects (data) and models (of those data)
- %--------------------------------------------------------------------------
- [Ns,Nm] = size(P);
- % Find model class and modality
- %--------------------------------------------------------------------------
- try, load(P{1}); catch, DCM = P{1}; end
- model = spm_dcm_identify(DCM);
- if isempty(model)
- warning('unknown inversion scheme');
- return
- end
- % Get data structure for each subject (column)
- %--------------------------------------------------------------------------
- for i = 1:Ns
- for j = 2:Nm
- switch model
- case{'DEM'}
- P{i, j}.xY = P{i, 1}.Y;
- otherwise
- P{i, j}.xY = P{i, 1}.xY;
- end
- end
- end
- % Estimate
- %--------------------------------------------------------------------------
- if use_parfor
- % Estimate DCMs in parallel using parfor
- P = spm_dcm_load(P);
-
- parfor i = 1:numel(P)
- P{i} = fit_dcm(P{i}, model);
- end
- else
- % Estimate DCMs without parfor
- for i = 1:numel(P)
- try
- DCM = load(P{i});
- DCM = DCM.DCM;
- catch
- DCM = P{i};
- end
- P{i} = fit_dcm(DCM, model);
- end
- end
-
- % -------------------------------------------------------------------------
- function DCM = fit_dcm(DCM, model)
- % Inverts a DCM.
- % DCM - the DCM structure
- % model - a string identifying the model type (see spm_dcm_identify)
-
- switch model
- % fMRI model
- %----------------------------------------------------------------------
- case{'fMRI'}
- DCM = spm_dcm_estimate(DCM);
- % conventional neural-mass and mean-field models
- %----------------------------------------------------------------------
- case{'fMRI_CSD'}
- DCM = spm_dcm_fmri_csd(DCM);
- % conventional neural-mass and mean-field models
- %----------------------------------------------------------------------
- case{'ERP'}
- DCM = spm_dcm_erp(DCM);
- % cross-spectral density model (complex)
- %----------------------------------------------------------------------
- case{'CSD'}
- DCM = spm_dcm_csd(DCM);
- % cross-spectral density model (steady-state responses)
- %----------------------------------------------------------------------
- case{'TFM'}
- DCM = spm_dcm_tfm(DCM);
- % induced responses
- %----------------------------------------------------------------------
- case{'IND'}
- DCM = spm_dcm_ind(DCM);
- % phase coupling
- %----------------------------------------------------------------------
- case{'PHA'}
- DCM = spm_dcm_phase(DCM);
- % cross-spectral density model (steady-state responses)
- %----------------------------------------------------------------------
- case{'NFM'}
- DCM = spm_dcm_nfm(DCM);
- % behavioural Markov decision process model
- %----------------------------------------------------------------------
- case{'MDP'}
- DCM = spm_dcm_mdp(DCM);
- % generic nonlinear system identification
- %----------------------------------------------------------------------
- case{'NLSI'}
- [Ep,Cp,Eh,F] = spm_nlsi_GN(DCM.M,DCM.xU,DCM.xY);
- DCM.Ep = Ep;
- DCM.Eh = Eh;
- DCM.Cp = Cp;
- DCM.F = F;
- % hierarchical dynamic mmodel
- %----------------------------------------------------------------------
- case{'DEM'}
- DCM = spm_DEM(DCM);
- % default
- %----------------------------------------------------------------------
- otherwise
- try
- DCM = feval(model, DCM);
- catch
- error('unknown DCM');
- end
- end
|