[FieldTrip] Magnitude of source voltages appear to be too large

Schoffelen, J.M. (Jan Mathijs) janmathijs.schoffelen at donders.ru.nl
Tue May 30 08:53:53 CEST 2023


Hi Prasad,

Units of source level activity are not expected to be the same as the units of the recording device. Dipole amplitudes are expressed in <something>A<something>m, e.g. nAm, Am, microAkm etc
This being said, FieldTrip tries to be consistent w.r.t. the units, and gets them right most of the time, as long as the user’s input is consistent w.r.t itself (i.e. electrode positions defined in m AND headmodel vertex positions also defined in m etc). The safest option would be to input everything according to the base S.I. units (i.e. metric distances in m, and potentials in V).

However, still then, there’s the well known depth bias associated with LCMV beamformer based source reconstructions, which causes the reconstructed amplitudes not to be taken at face value (in other words, comparing the amplitudes of a ‘deep’ virtual channel with the amplitudes of a superficial one is somewhat meaningless, unless a good normalisation has been applied).

Best wishes,
Jan-Mathijs


On 26 May 2023, at 18:47, Prasad Tendolkar - Research Engineer II via fieldtrip <fieldtrip at science.ru.nl<mailto:fieldtrip at science.ru.nl>> wrote:

Hello,

I have obtained the voltage time series of cortical sources using the fieldtrip lcmv method for source reconstruction. I am concerned that the source voltage amplitudes are too large to be physiologically possible. After ensuring that input EEG dataset is in units of volts, I get source voltage amplitudes with root-mean-square voltage values ranging from 0.2799 to 0.8739 Volts. Does that seem reasonable? The EEG data is recorded during a walking task with no external stimulation.

The voltages time series from the source locations are obtained using the following code, “eegData” is the eeglab-preprocessed data converted to a fieldtrip raw datatype, and “roiData” contains the voltage time series of the source locations that I calculated the rms from:

tempElec = ft_read_sens(electrodePos); %electrodePos is the standard_1020.elc from fieldtrip

newElec = tempElec;

for i = 1:length(eegData.label)
    checker = 0;
    for i2 = 1:length(tempElec.label)
        if strcmpi(eegData.label{i},tempElec.label{i2})
            checker = 1;
            newElec.chanpos(i,:) = tempElec.chanpos(i2,:);
            newElec.chantype{i} = tempElec.chantype{i2};
            newElec.chanunit{i} = tempElec.chanunit{i2};
           newElec.elecpos(i,:) = tempElec.elecpos(i2,:);
            newElec.label{i} = tempElec.label{i2};

        end
    end
    if checker == 0
        eegData.elec.label{i}
    end
end

newElec.chanpos(length(eegData.label)+1:end,:) = [];
newElec.chantype(length(eegData.label)+1:end) = [];
newElec.chanunit(length(eegData.label)+1:end) = [];
newElec.elecpos(length(eegData.label)+1:end,:) = [];
newElec.label(length(eegData.label)+1:end) = [];

eegData.elec = newElec;

%% Project electrodes to scalp, headmodel is standard_bem.mat from fieldtrip
if strcmp(headmodel.type, 'bemcp')
    scalp_index = 3;
elseif strcmp(headmodel.type, 'dipoli')
    scalp_index = 1;
end

cfg = [];
cfg.method = 'project'; % onto scalp surface
cfg.headshape = headmodel.bnd(scalp_index); % scalp surface
eegData.elec = ft_electroderealign(cfg, eegData.elec);


cfg = [];
cfg.headmodel = headmodel;
cfg.elec = eegData.elec;
cfg.grid.resolution = 4;
cfg.grid.unit       = 'mm';
cfg.channel = 'all';
grid = ft_prepare_leadfield(cfg);

cfg = [];
cfg.covariance = 'yes';
cfg.covariancewindow = 'all';
timelock_allexp = ft_timelockanalysis(cfg, eegData);

cfg = [];
cfg.covariance = 'yes';
cfg.covariancewindow = 'all';
cfg.keeptrials  = 'yes';
timelock_allexp_all = ft_timelockanalysis(cfg, eegData);

%General source localisation
cfg = [];
cfg.headmodel = vol;
cfg.elec = timelock_allexp.elec;
cfg.grid = grid;
cfg.method = 'lcmv';
cfg.lcmv.fixedori = 'yes';  %Project onto largest variance orientation
cfg.lcmv.keepfilter = 'yes'; %Keep the beamformer weights
cfg.lcmv.lambda = '5%'; %Regularise a little
source_allexp = ft_sourceanalysis(cfg, timelock_allexp);

cfg = [];
cfg.method        = 'nearest';
cfg.parameter = 'tissue';
grid2 = ft_sourceinterpolate(cfg,atlas,grid);  % atlas is a modified version of the AAL atlas provided in fieldtrip with our ROIs
grid2.tissue = fix(grid2.tissue);
grid2.tissuelabel = atlas.tissuelabel;

cfg = [];
cfg.parcellation = 'tissue';
cfg.method = 'svd';
roiData = ft_virtualchannel(cfg,timelock_allexp_all,source_allexp,grid2);

Is there any step that I may have overlooked? Any troubleshooting suggestions would be greatly appreciated


Thanks,
Prasad

_______________________________________________
fieldtrip mailing list
https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
https://urldefense.com/v3/__https://doi.org/10.1371/journal.pcbi.1002202__;!!HJOPV4FYYWzcc1jazlU!4X-bMlTfOHM2uC4DuLXG3julu9Ev6j1wYd_bM4G0ZPng1-MFBmG7tzTlxX6z_yTdFuMvNGS8GQyd7SKhKPLIirTLP-3owg9X9bA9xQ$

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20230530/c1320d24/attachment.htm>


More information about the fieldtrip mailing list