Cheong Tong Hou # 腦科學研究中在MNE-python中常用的物件(Raw,Epoch,Evoked,Time-frequency) # Raw 是資料來源 Raw: * mne.io.Raw(fname, allow_maxshield=False, preload=False,on_split_missing='raise', verbose=None) raw data 有各式各樣的來源檔,較常見的是(.cnt、.ctf、.cdt、.edf),亦可以從csv檔中讀取數據 讀取各式各樣的檔案有各自對應的function Example: * .cdt---mne.io.read_raw_cnt(...) .ctf---mne.io.read_raw_ctf(...) .cdt---mne.io.read_raw_curry(...) .edf---mne.io.read_raw_edf(...) .cvs---mne.io.RawArray(...) # Epoch 是由已經處理的raw所取得 Epoch: * mne.Epochs(raw, events, event_id=None, tmin=- 0.2, tmax=0.5, baseline=(None, 0), picks=None, preload=False, reject=None, flat=None, proj=True, decim=1, reject_tmin=None, reject_tmax=None, detrend=None, on_missing='raise', reject_by_annotation=True, metadata=None, event_repeated='error', verbose=None) Epoch是raw data的時間序列中有作maker的時段進行分段,Epoch可由實驗設計或個人需求而設定時間長度 # Evoked 平均後的Epoch物件 Evoked: * mne.Evoked(fname, condition=None, proj=True, kind='average', allow_maxshield=False, verbose=None) Example: * evoked=epochs['event'].average() Evoked是把Epoch的各個或單個maker作平均後去觀察腦波狀況 # Time-frequency Time-frequency常用的function有3個: * mne.time_frequency.AverageTFR(...) * mne.time_frequency.EpochsTFR(...) * mne.time_frequency.CrossSpectralDensity(...) Time-frequency在腦科學的領域中用於病理上的觀察,亦可以用於一般腦波數據上去觀察event中的腦波頻率的變化 ``` 上述的4個class中,底下其實還有各種的子集,並且對作為輸入的數據有很大的彈性, 若想了解更多可以到mne的官網上查看或是與我們相互交流^_^ ``` # 視覺呈現 ``` 在腦科學視覺呈現上,較常呈現的是Evoked、topographic、time-frequency ``` * Evoked:mne.viz.plot_evoked(...) * Topographic:mne.viz.plot_topomap(...) * Time-frequency:mne.viz.plot_tfr_topomap(...) # 機械學習在腦科學中的角色 ``` import numpy as np import matplotlib.pyplot as plt from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression import mne from mne.datasets import sample from mne.decoding import (SlidingEstimator, GeneralizingEstimator, Scaler, cross_val_multiscore, LinearModel, get_coef, Vectorizer, CSP) data_path='(the path your data save)' file=data_path+'/(file_name)' epochs= mne.read_epochs(file, preload= True) a=epochs['event_a'].get_data() b=epochs['event_b'].get_data() ds=np.concatenate((a,b),axis=0) temp_a=np.ones(a.shape[0]) temp_b=np.zeros(b.shape[0]) rds=np.concatenate((temp_a,temp_b),axis=0) # start train clf = make_pipeline(StandardScaler(), LogisticRegression(solver='lbfgs')) time_decod = SlidingEstimator(clf, n_jobs=-1, scoring='roc_auc', verbose=True) scores = cross_val_multiscore(time_decod, ds, rs, cv=5, n_jobs=-1) scores = np.mean(scores, axis=0) # plot fig, ax = plt.subplots() ax.plot(epochs.times, scores, label='score') ax.axhline(.5, color='k', linestyle='--', label='chance') ax.set_xlabel('Times') ax.set_ylabel('AUC') # Area Under the Curve ax.legend() ax.axvline(.0, color='k', linestyle='-') ax.set_title('Sensor space decoding')