[Eeglablist] Analysis of Frontal Alpha Asymmetry - am I on the right track?

Cedric Cannard ccannard at protonmail.com
Thu Jul 30 10:19:27 PDT 2020


Dear Katia,

Interesting questions. Thanks Tarik for the great reference. Here are some more specific answers. Please anyone correct my if I am wrong somewhere.

1) It's the same. You'll just save time if you run it only on your channels of interest. Power spectrum is calculated on each channel one by one.

2) Yes this is generally what is done for frontal asymmetry analyses:
"Because the FFT converts each time-domain epoch to a power spectrum, the average of these power spectra is ultimately taken as the basis for analysis (Panel E). Alpha power, either total (μV2 by summing all spectral points in the frequency range) or density (μV2/Hz by summing all spectral points in the frequency range and dividing by the range in Hz), is most often examined." (Smith et al. 2017)
I don't know about the density method.

3) Yes, absolute power = 10^(power_dB/10) and power_dB = 10*log10(power_abs). The spectopo function gives you power in dB by default.
I believe your FCA method is actually incorrect as it gives you the natural log of the already logged values from spectopo. you do log(10*log10(power_abs)). Whereas log(power_abs) is the recommended method as provided by your links (not sure what unit that would be though):
"To calculate alpha asymmetry scores, alpha power at any given site is first natural log transformed, as untransformed power values tend to be positively skewed. Then, a difference score (ln[right]-ln[left] alpha power) can then summarize the relative activity at homologous right and left leads. Higher asymmetry scores calculated this way putatively reflect relatively greater left frontal activity (assuming that alpha is inversely related to cortical network activity). Additionally, this log-difference score provides some degree of correction for overall alpha power, such as those due to individual differences in skull thickness that influence signal amplitude ". (Smith et al., 2017)

So I believe your correct steps would be:

left_ind = [4 8 9]; %AF7, F7, F5
right_ind = [7 15 16]; %AF8, F6, F8

%LEFT SIDE
[spectra_left, freqs] = spectopo(EEG.data(left_ind,:,:), EEG.pnts, EEG.srate, 'winsize', EEG.srate, 'wintype', 'hamming', 'overlap', EEG.srate/2, 'plot','off');
spectra_left = 10.^(spectra_left/10);  %convert to absolute power
alphaIdx = find(freqs >= 8 & freqs <= 13);

%Mean alpha for each channel on abs values
for i = 1:length(left_ind)
    mean_alpha_left(i,:) = mean(spectra_left(i,alphaIdx));
end
left_alpha = log(mean(mean_alpha_left)); %average alpha across channels and get the natural log

%Do the same for right side

%Calculate difference
alpha_asymmetry = right_alpha - left_alpha;

%Do this for each subject, and don't forget correction for multiple comparisons during stats :)

I am not sure if you should do the log before or after averaging between electrodes of one side. It shouldn't be very different in the results anyway I think. Maybe someone can give feedback about this.

As for your question about negative values, I checked and I don't think it would interfere with your asymmetry results:
if power_abs_right = 0.2144 and power_abs_left = 4.5511
then their natural log values will be -1.540 for right and 1.515 for left (negative log corresponding to a values < 1, so left power is > right in this example).
After substraction, right-left = -3.0554, meaning the asymmetry lateralized to the left side, which corresponds to the abs power values.
And the other way works too:
If power_log_right = 1.540 and power_log_left = -1.515, then the resulting asymmetry would be 3.0554, which is asymmetry lateralized to the right side, corresponding to the values.

4) It's the same.
When inputting frames = 0 (default), the function will do:
if frames == 0
  frames = size(data,2); % assume one epoch
end
Meaning 0 will take the size of your data by default. If non-epoched data, that will be whole dataset, if epoched, it is the length of your epoch (in samples). And EEG.pnts = size(EEG.data,2), so it is the same :)

Good luck,

Cédric Cannard


‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Sunday, July 26, 2020 7:39 PM, Tarik S Bel-Bahar <tarikbelbahar at gmail.com> wrote:

> https://urldefense.com/v3/https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6449497/;!!Mih3wA!VuktivcTazEYxkwB_zD1LqGHqEotYeiXcposSGzL2kdPuaohLWRtoj3FxjaaF9BmnmikKA$
>
> On Sun, Jul 26, 2020, 11:58 AM Katarzyna Dudzikowska <
> k.a.dudzikowska at gmail.com> wrote:
>
> > Dear all,
> > First of all, thank you for all the help I have gotten from this mailing
> > list so far, I really appreciate it!
> > For my MSc thesis I am trying to run a Frontal Alpha Asymmetry analysis.
> > The end goal is an individual numeric score capturing interhemispheric
> > difference in alpha activation for each of my subjects. I have extracted
> > 1-sec-long epoch from each trial and I am going to derive the score from a
> > dataset containing just these epochs. A typical dataset, in case it
> > matters, has around 300 epochs, 250 frames per epoch (as sampling rate is
> > 250Hz).
> > Rather than use just one pair of electrodes, I want to use an aggregate of
> > AF8, F6 and F8 for the right and AF7, F5 and F7 for the left hemisphere.
> > Based on the previous literature, I want to run a fast Fourier transform
> > analysis with a 50% Hamming window on the epoched dataset, extract alpha
> > frequency power (8-13Hz), average across the right-side channels to obtain
> > right alpha power and across the left-side channels to obtain left alpha
> > power, log transform these values and subtract the left from the right to
> > get my final score.
> > This sounds simple enough, but I am not sure
> > a) whether the code I have written definitely does the things I described
> > above (I think so, but I would really love to get some feedback)
> > b) whether before I log transform and subtract the values I should "compute
> > absolute power" as described by Makoto here:
> > https://sccn.ucsd.edu/wiki/Makoto's_useful_EEGLAB_code#How_to_extract_EEG_power_of_frequency_bands_.2806.2F06.2F2020_updated.29
> > I have to admit that I do not understand why I would/wouldn't and what it
> > does. I have searched the list and found some discussions you had on this
> > topic, but I didn't understand much of it I'm afraid.
> > Below is the code I compiled from literature + Makoto's advice I link
> > above + this post:
> > https://sccn.ucsd.edu/pipermail/eeglablist/2007/001903.html
> > Does it make sense?
> > %Define channels of interest:
> > left_ind = [4 8 9]; %AF7, F7, F5
> > right_ind = [7 15 16]; %AF8, F6, F8
> > %Obtain power spectra at specified channels on the left and on the right
> > [spectraL, freqs] = spectopo(EEG.data(left_ind,:,:), EEG.pnts, EEG.srate,
> > 'winsize', EEG.srate, ...
> > 'wintype', 'hamming', 'overlap', EEG.srate/2, 'plot', 'off');
> > [spectraR] = spectopo(EEG.data(right_ind,:,:), EEG.pnts, EEG.srate,
> > 'winsize', EEG.srate, ...
> > 'wintype', 'hamming', 'overlap', EEG.srate/2, 'plot', 'off');
> > % Aggregate of the chosen channels
> > spectraLagg = mean(spectraL)
> > spectraRagg = mean(spectraR)
> > %Define alpha power as between 8 and 13Hz.
> > alpha_ind = find(freqs>=8 & freqs<=13);
> > % Here I am looking at two options and I have no idea which one to choose:
> > alphaL = mean(spectraLagg(alpha_ind));
> > alphaR = mean(spectraRagg(alpha_ind));
> > FCA = log(alphaL) - log(alphaR)
> > alphaLb = mean(10.^(spectraLagg(alpha_ind )/10));
> > alphaRb = mean(10.^(spectraRagg(alpha_ind )/10));
> > FCAb = log(alphaLb) - log(alphaRb)
> > My most pertinent questions are:
> >
> > 1.  Is it acceptable to run spectopo() only on selected channels or should I
> >     run it on the whole dataset and then extract the channels I am interested
> >     in? Does it make any difference?
> >
> > 2.  Is it acceptable to simply average across my channels of interest to
> >     obtain a composite alpha power score, or should I employ some more
> >     sophisticated calculation?
> >
> > 3.  The most most-pertinent question: should I go with FCAa or FCAb? For
> >     this dataset one ends up being a positive and the other a negative number,
> >     so this is a really important choice that I have no idea how to make. From
> >     what I understand it has to do with the values being expressed in either
> >     decibels or in uV^2, correct? Raw spectopo() output (is that dB?)? contains
> >     negative values which obviously mess things up for me when I average, so I
> >     am leaning towards option b, but the fact that similar transformation was
> >     not mentioned in any of the papers I looked at makes me doubt myself.
> >
> > 4.  I also have a question regarding the spectopo() function. In the
> >     eeglablist post I link above, Arno calls the function with EEG.pnts as the
> >     second argument (frames per epoch). But in Makoto's example the value used
> >     is 0. Why would it ever be 0? Should it be 0 or EEG.pnts?
> >
> >
> > I will be so incredibly grateful to get your input: for my first foray into
> > the world of EEG analysis I picked a method that nobody I know has ever
> > used, so I am completely relying on what I can find out myself and your
> > kindness :)
> > Best regards,
> > Katia Dudzikowska
> >
> > Eeglablist page: http://sccn.ucsd.edu/eeglab/eeglabmail.html
> > To unsubscribe, send an empty email to
> > eeglablist-unsubscribe at sccn.ucsd.edu
> > For digest mode, send an email with the subject "set digest mime" to
> > eeglablist-request at sccn.ucsd.edu
>
> Eeglablist page: http://sccn.ucsd.edu/eeglab/eeglabmail.html
> To unsubscribe, send an empty email to eeglablist-unsubscribe at sccn.ucsd.edu
> For digest mode, send an email with the subject "set digest mime" to eeglablist-request at sccn.ucsd.edu





More information about the eeglablist mailing list