تحلیل سیگنال‌های MEG/EEG با کتابخانه MNE پایتون


در این مقاله به تحلیل سیگنال‌های EEG/MEG با استفاده از پکیج MNE-Python می‌پردازیم. اینکه چطور دیتاست را بخوانیم، ترایال‌ها را جدا کنیم و یا آنها را رسم کنیم. در این مقاله مهم‌ترین ساختار داده‌های پکیج MNE-Python معرفی می‌شوند: Raw, Epochs.

برای شروع کار، ابتدا نیاز است که ماژول‌های ضروری پایتون را import کنیم:

Python

import numpy as np
import mne

خواندن داده با کمک کتابخانه MNE

ساختار داده‌های MNE-Python مبتنی بر فرمت فایل fif هستند اما توابعی در این پکیج وجود دارند که با استفاده از آنها می‌توان انواع دیگر فرمت‌های داده را خواند مانند .gdf همچنین MNE-Python واسطی دارد که با استفاده از آن می‌توانید دیتاست‌های public را در اختیار داشته باشید. به عبارت دیگر این پکیج MNE، دیتاست های در دسترس عموم را برای شما دانلود و مدیریت می‌کند. علاوه بر آن می‌توانید دیتاست‌های خودتان را نیز در این پکیج پردازش کنید.

در این آموزش می‌خواهیم یکی از دیتاست‌های موجود در پکیج MNE را بخوانیم (دیتاستی به نام Sample) که حاوی داده‌های EEG و MEG از یک سابجکت است که آزمایش شنوایی-بینایی انجام داده است و به طور همزمان اسکن‌های MRI این سابجکت ثبت شده است. تابع mne.datasets.sample.data_path به طور خودکار دیتاست را دانلود می‌کند و سپس مسیر دایرکتوری دیتاست را بر می‌گرداند. برای آموزش ما از نسخه‌ی downsample شده و فیلترگذاری شده‌ی داده استفاده کرده‌ایم Sample_audvis_filt-0-40_raw.fif.

Python

sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = (sample_data_folder / "MEG" / "sample" /"sample_audvis_filt-0-40_raw.fif")
raw = mne.io.read_raw_fif(sample_data_raw_file)

Output:
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_filt-0-40_raw.fif...
   Read a total of 4 projection items:
      PCA-v1 (1 x 102)  idle
      PCA-v2 (1 x 102)  idle
      PCA-v3 (1 x 102)  idle
     Average EEG reference (1 x 60)  idle
   Range : 6450 ... 48149 =     42.956 ...   320.665 secs
Ready.

به طور پیش فرض، تابع read_raw_fif برخی اطلاعات مربوط به فایلی که در حال لود شدن است را نشان می‌دهد: برای مثال به ما می‌گوید که همراه با داده‌ی ثبت شده، آیتم‌های projection نیز وجود دارند. علاوه بر اطلاعاتی که در قسمت خروجی نشان داده شده‌اند، شما می‌توانید جزئیات بیشتری از Raw را بدست آورید و تنها کافی است از دستورات زیر استفاده کنید:

Python

print(raw)
print(raw.info)

Output:
<Raw | sample_audvis_filt-0-40_raw.fif, 376 x 41700 (277.7 s), ~3.3 MB, data not loaded>
<Info | 15 non-empty values
bads: 2 items (MEG 2443, EEG 053)
ch_names: MEG 0113, MEG 0112, MEG 0111, MEG 0122, MEG 0123, MEG 0121, MEG ...
chs: 204 Gradiometers, 102 Magnetometers, 9 Stimulus, 60 EEG, 1 EOG

custom_ref_applied: False
dev_head_t: MEG device -> head transform
dig: 146 items (3 Cardinal, 4 HPI, 61 EEG, 78 Extra)
file_id: 4 items (dict)
highpass: 0.1 Hz
hpi_meas: 1 item (list)
hpi_results: 1 item (list)
lowpass: 40.0 Hz
meas_date: 2002-12-03 19:01:10 UTC
meas_id: 4 items (dict)
nchan: 376
projs: PCA-v1: off, PCA-v2: off, PCA-v3: off, Average EEG reference: off
sfreq: 150.2 Hz

آبجکت Raw همچنین چندین تابع رسم built-in دارد؛ در این بخش ما Power Spectral Density (PSD) هر سنسور را با استفاده از تابع compute_psd محاسبه می‌کنیم و همچنین هر سنسور را با استفاده از دستور plot رسم می‌کنیم. تنها فرکانس‌های پایین‌تر از 50 هرتز را رسم می‌کنیم.

Python

raw.compute_psd(fmax=50).plot(picks="data", exclude="bads")
raw.plot(duration=5, n_channels=30)

PSD MNE

MEG Plot

 

پیش پردازش سیگنال مغزی با کتابخانه MNE

پکیج MNE-Python انواع رویکردها و تکنیک‌های پیش پردازش را پشتیبانی می‌کند (از جمله maxwell filtering، Signal-space projection، independent component analysis، Filtering و Downsampling و …). لیست کامل این رویکردها را می‌توانید در ماژول‌های mne.preprocessing و mne.filter مشاهده کنید. در این بخش می‌خواهیم با استفاده از روش ICA داده را تمیز کنیم.

Python

# set up and fit the ICA
ica = mne.preprocessing.ICA(n_components=20, random_state=97, max_iter=800)
ica.fit(raw)
ica.exclude = [1, 2]  # details on how we picked these are omitted here
ica.plot_properties(raw, picks=ica.exclude)

ICA_MNEPython

بعد از آنکه مطمئن شدیم کدامیک از کامپوننت‌ها را می‌خواهیم حذف کنیم آنها را به پارامتر exclude  می‌دهیم سپس ICA را روی سیگنال خام اعمال می‌کنیم. متد apply مستلزم آن است که داده‌ی خام در حافظه بارگذاری شود برای این منظور ابتدا از load_data استفاده می‌کنیم.

جدا کردن ترایال‌ها از داده‌ی پیوسته با کمک کتابخانه MNE

آبجکت Raw و آرایه‌های رویداد نیاز هستند تا بتوان آبجکت Epochs را ساخت. Epochs در MNE همان ترایال در واسط مغز کامپیوتر است. برای ساخت آن کافی است از کلاس Epochs استفاده کنیم. باید اطلاعات مربوط به ترایال‌ها را با پارامتر event_id به تابع mne.Epochs بدهیم و tmin و tmax (ثانیه ی ابتدا و انتهای ترایال) را مشخص کنیم. به طور پیش فرض داده‌های Raw و Epochs در حافظه قرار نمی‌گیرند (آنها روی دیسک قرار دارند. اما اینجا با استفاده از پارامتر preload=True، این داده‌ها را روی حافظه قرار می‌دهیم.

Python

epochs = mne.Epochs(raw, events, event_id=event_dict, tmin=-0.2,tmax=0.5, reject=reject_criteria,preload=True,)
Output:
Not setting metadata
319 matching events found
Setting baseline interval to [-0.19979521315838786, 0.0] s
Applying baseline correction (mode: mean)
Created an SSP operator (subspace dimension = 4)
4 projection items activated
Using data from preloaded Raw for 319 events and 106 original time points ...
   Rejecting  epoch based on EOG : ['EOG 061']    
   Rejecting  epoch based on EOG : ['EOG 061']    
   Rejecting  epoch based on MAG : ['MEG 1711']    
   Rejecting  epoch based on EOG : ['EOG 061']    
   Rejecting  epoch based on EOG : ['EOG 061']    
   Rejecting  epoch based on MAG : ['MEG 1711']    
   Rejecting  epoch based on EEG : ['EEG 008']    
   Rejecting  epoch based on EOG : ['EOG 061']    
   Rejecting  epoch based on EOG : ['EOG 061']    
   Rejecting  epoch based on EOG : ['EOG 061']
10 bad epochs dropped

در دوره‌ی پکیج MNE پایتون که به زودی آماده خواهد شد، به تمامی این موارد با جزئیات بیشتری می‌پردازیم.

با ما همراه باشید…


دیدگاه ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

code