init_unfold
Starting unfold toolbox.
Adding subfolders and other toolboxes to path...
Done.
Introduction
Subjects are exploring a face stimulus. Using an eyetracker and the EEG-Eye toolbox we add markers of saccade onsets into our EEG-Data. The data were cleaned for eye-movement related artefacts using ICA.
In this tutorial we try to disentangle stimulus related ERPs and microsaccade related ERPs.
EEG = pop_loadset('C:\Users\behinger\Desktop\face_saccades_opendata_fig10.set')
pop_loadset(): loading file C:\Users\behinger\Desktop\face_saccades_opendata_fig10.set ...
Defining the design
cfgDesign.eventtypes = {'saccade','stimonset'};
% We use intercept-only formulas because we are only interested in the overlap for now
cfgDesign.formula = {'y ~ 1','y~1'};
EEG = uf_designmat(EEG,cfgDesign);
Multiple events with separate model-formula detected
Modeling 2871 event(s) of [saccade] using formula: y~1
Modeling 479 event(s) of [stimonset] using formula: y~1
Timeshift
In order to compensate for the inevitable linear overlap between ERPs, we want to use timeshifting / prepare the designmatrix for the deconvolution step. In this step we generate for each column of the designmatrix timeshifted (by t = 1, t=2, t=3 ...) and append them to the designmatrix.
cfgTimeexpand.timelimits = [-.3,0.8];
EEG = uf_timeexpandDesignmat(EEG,cfgTimeexpand);
uf_timeexpandDesignmat(): Timeexpanding the designmatrix...
...done
Cleaning of data
% A simple threshold function taken from ERPLAB
winrej = uf_continuousArtifactDetect(EEG,'amplitudeThreshold',250);
WARNING: boundary events were not found.
So, basicrap.m will be applied over the full range of data.
Please wait. This might take several seconds...
58 segments were marked.
A total of 133034 samples (6.43 percent of data) was marked as bad.
% We remove very noisy data segments (>250mV) from the designmatrix
EEG = uf_continuousArtifactExclude(EEG,struct('winrej',winrej));
Portions of data removed split up by each event in EEG.event
Type: S 99 modelled eventtime: 1054.90s rejected eventtime: 16.33s percent removed: 1.5%
Type: S100 modelled eventtime: 1.10s rejected eventtime: 1.10s percent removed: 100.0%
Type: S200 modelled eventtime: 1.10s rejected eventtime: 0.00s percent removed: 0.0%
Type: buttonpress modelled eventtime: 526.90s rejected eventtime: 7.25s percent removed: 1.4%
Type: fixation modelled eventtime: 862.05s rejected eventtime: 11.27s percent removed: 1.3%
Type: saccade modelled eventtime: 861.57s rejected eventtime: 11.27s percent removed: 1.3%
Type: stimonset modelled eventtime: 526.90s rejected eventtime: 8.34s percent removed: 1.6%
Removing 6.43% of rows from design matrix (filling them with zeros)
Fit the deconvolution model
EEG= uf_glmfit(EEG,'channel',[32]);
uf_glmfit(): Fitting deconvolution model...solving the equation system
solving electrode 32 (of 1 electrodes in total)... 12 iterations, took 0.2s
LMfit finished
Fit the non-deconvolution model
While epoching changes the EEG.data, the previous EEG.deconv fields & fits do not. Thus the toolbox allows to have two fits, a "dc beta" and a "no-dc beta" concurrently
% We need to provide the same winrej as before, so that approximately the same data is used for the model.
% Only approximately because in epoched data we need to remove a whole trial, whereas deconvolution allows
% partial trial-data to be used.
% Be aware that if you decide to overwrite the EEG structure you need to reload your data to rerun your analysis on continuous data
EEG = uf_epoch(EEG,struct('winrej',winrej,'timelimits',cfgTimeexpand.timelimits));
Deleting 174 events due to data cleaning
pop_epoch():3272 epochs selected
Epoching...
pop_epoch():3272 epochs generated
eeg_checkset: found empty values for field 'timeSinceLastStimulus'
filling with values of other events in the same epochs
Event resorted by increasing latencies.
pop_epoch(): checking epochs for data discontinuity
Recalculating the EEG_epoch field using eeg_checkset, might take some time
Event resorted by increasing latencies.
EEG = uf_glmfit_nodc(EEG);
Plot the results
We choose a single electrode and plot all effects.
ufresult= uf_condense(EEG);
display(ufresult)
ufresult =
unfold: [1×1 struct]
beta: [40×550×2 double]
times: [1×550 double]
chanlocs: [1×40 struct]
param: [1×2 struct]
beta_nodc: [40×550×2 double]
uf_plotParam(ufresult,'channel',32);
In order to directly compare the dc and non-dc model fits we can plot them in the same plot. Not the large baseline offset (no baseline correction so far) that is completly absent in the deconvoluted fit (this is an observeration we commonly have in many different datasets). For the comparison we do want to have baseline correction.
%first plot the deconvoluted betas
g = uf_plotParam(ufresult,'channel',32,'deconv',1,'baseline',[ufresult.times(1) 0]);
plotting all parametersperforming baseline correction
% now plot the non-deconvoluted betas
g = uf_plotParam(ufresult,'channel',32,'deconv',0,'baseline',[ufresult.times(1) 0],'gramm',g);
plotting all parametersperforming baseline correction
New X or Y of different size given, all data from first gramm cleared
It is clear that disregarding the overlap leads to vastly different results for late components, but obviously not for early components, as no overlap happened here.