# Average EEG signal across various disorders
This tutorial demonstrates how to compute and visualize the average
EEG signal across various disorders using `mne`, `pandas`, and
`seaborn` in conjunction with `almirah`.
## Setup
First, we'll import the necessary libraries and set the log level for MNE.
```python
import mne
import pandas as pd
import seaborn as sns
from almirah import Dataset
mne.set_log_level(False)
```
## Loading the Dataset
Next, we'll load the dataset and query the EEG files.
```python
ds = Dataset(name="calm-brain")
eeg_header_files = ds.query(datatype="eeg", task="rest", extension=".vhdr")
eeg_data_files = ds.query(datatype="eeg", task="rest", extension=".eeg")
len(eeg_data_files)
```
This should give the total number of EEG files:
1120
We then download the EEG data files.
```python
for file in eeg_data_files:
file.download()
```
## Querying the Database
We connect to the database and query the presenting disorders table.
```python
db = ds.components[2]
db.connect("username", "password")
df = ds.query(table="presenting_disorders")
df[["subject", "session", "addiction"]].head()
```
This displays the first few rows of the queried table in a DataFrame format.
|
subject |
session |
addiction |
0 |
D0019 |
101 |
0 |
1 |
D0019 |
111 |
0 |
2 |
D0020 |
101 |
0 |
3 |
D0020 |
111 |
<NA> |
4 |
D0021 |
101 |
0 |
## Processing the EEG Data
We define functions to compute the mean EEG signal and retrieve the disorders.
```python
def get_eeg_mean(file):
raw = mne.io.read_raw_brainvision(file.path)
return raw.get_data().mean()
def get_disorders(file):
disorders = []
subject, session = file.tags["subject"], file.tags["session"]
filtered_df = df[(df["subject"] == subject) & (df["session"] == session)]
if filtered_df.empty:
print(subject, session)
return None
for column in ["addiction", "bipolar", "dementia", "ocd", "schizophrenia"]:
presence = filtered_df.iloc[0][column]
if not pd.isna(presence) and presence:
disorders.append(column)
return disorders if disorders else ["healthy"]
def file_func(file):
mean_eeg, disorders = get_eeg_mean(file), get_disorders(file)
if not disorders:
return pd.DataFrame()
mean_df = pd.DataFrame({"mean": [mean_eeg] * len(disorders), "disorder": disorders})
return mean_df.dropna()
```
We process the EEG header files to compute the mean EEG signal and retrieve the disorders.
```python
mean_dfs = list(map(file_func, eeg_header_files))
mean_dfs = [df for df in mean_dfs if not df.empty]
mean_df = pd.concat(mean_dfs, sort=False)
mean_df.head()
```
This displays the first few rows of the combined DataFrame.
|
mean |
disorder |
0 |
-0.008766 |
healthy |
1 |
0.000457 |
addiction |
2 |
-0.006335 |
healthy |
3 |
-0.002764 |
healthy |
4 |
-0.008269 |
ocd |
We compute the mean EEG signal for each disorder.
```python
mean_df.groupby("disorder").mean()
```
This displays the mean EEG signal for each disorder.
|
mean |
disorder |
|
addiction |
0.003414 |
bipolar |
0.001613 |
dementia |
0.010485 |
healthy |
0.002449 |
ocd |
-0.000875 |
schizophrenia |
0.005444 |
## Visualizing the Results
We visualize the distribution of the mean EEG signal for each disorder using a violin plot.
```python
ax = sns.violinplot(data=mean_df, x="mean", hue="disorder")
sns.move_legend(ax, "upper left", bbox_to_anchor=(1, 1))
```
This generates the plot:
![png](../images/multimodal/average-eeg-across-disorders.png)
This concludes the tutorial. You've learned how different modalities
can be strung together to perform analysis involving multiple
modalities.