FieldTrip toolbox教程系列(1)-预处理-读取连续的EEG和MEG数据
FieldTrip是MEG, EEG, iEEG和NIRS分析的MATLAB軟件工具箱。它提供預(yù)處理和先進(jìn)的分析方法,如時頻分析,使用偶極子的源重建,分布源和波束形成器和非參數(shù)統(tǒng)計測試。
介紹
ft_preprocessing的一種常見用法是完全讀取內(nèi)存中的連續(xù)數(shù)據(jù)。如果數(shù)據(jù)集相對較小并且計算機(jī)具有足夠的內(nèi)存來一次將所有數(shù)據(jù)保存在內(nèi)存中,則利用ft_preprocessing是可行的。
背景
使用這種方法,可以將文件中的所有數(shù)據(jù)讀取到內(nèi)存中,應(yīng)用過濾器,然后將數(shù)據(jù)分割為感興趣的數(shù)據(jù)段。
過程
采取以下步驟來讀取數(shù)據(jù)、應(yīng)用過濾器、參考數(shù)據(jù)(針對EEG數(shù)據(jù)),可選地在事件或觸發(fā)器周圍選擇感興趣的數(shù)據(jù)片段,或者將連續(xù)的數(shù)據(jù)切割成合適的等長片段。
使用ft_preprocessing讀取EEG通道的數(shù)據(jù),應(yīng)用濾波器并重新參考相連的乳突;
使用ft_preprocessing讀取水平和垂直EOG通道的數(shù)據(jù),并計算水平和垂直雙極EOG偏差。
使用ft_appenddata將EEG和EOG合并為單個數(shù)據(jù)表示形式
使用ft_definetrial根據(jù)觸發(fā)事件確定感興趣的數(shù)據(jù)片段
使用ft_redefinetrial將連續(xù)數(shù)據(jù)分段到試驗(yàn)中
使用ft_redefinetrial將連續(xù)數(shù)據(jù)分段為一秒的片段
本教程中使用的數(shù)據(jù)集
在本教程中,我們將使用兩個數(shù)據(jù)集,一個帶有EEG數(shù)據(jù),另一個帶有MEG數(shù)據(jù)。
Irina Siminova在一項(xiàng)研究以圖片,視覺顯示的文字或聽覺呈現(xiàn)的單詞表示的刺激的語義處理的研究中,獲得了EEG數(shù)據(jù)集SubjectEEG.zip。采用64通道腦產(chǎn)品腦電放大器,60個頭皮電極置于電極帽內(nèi),其中一個電極置于右眼下方獲取數(shù)據(jù)。采集后使用重新參考計算信號“EOGv”和“EOGh”。在采集過程中,所有通道均以左乳突為參考,并在耳垂處放置一個電極作為接地。通道1-60對應(yīng)于位于頭部的電極,但位于右側(cè)乳突的通道53除外。通道61、62、63根本不連接到電極。通道64連接到位于左眼下方的電極。因此,我們有62個感興趣的頻道:60個來自頭部+ eogh + eogv。
MEG數(shù)據(jù)集Subject01.zip是Lin Wang在語義一致和不一致句子的語言研究中獲取。實(shí)驗(yàn)中使用了三種類型的句子:完全一致(FC)、完全不一致(FIC)和初始一致(IC)。三種條件中每一種條件都有87個試驗(yàn),并添加了一組87個填充句。
將連續(xù)的EEG數(shù)據(jù)讀入內(nèi)存
預(yù)處理并將數(shù)據(jù)讀入內(nèi)存的最簡單方法是是只使用數(shù)據(jù)集作為配置參數(shù)調(diào)用ft_preprocessing函數(shù)。
cfg = []; cfg.dataset = 'subj2.vhdr'; data_eeg = ft_preprocessing(cfg)>> data_eeg data_eeg =hdr: [1x1 struct]label: {64x1 cell}trial: {[64x1974550 double]}time: {[1x1974550 double]} fsample: 500cfg: [1x1 struct]這將從文件中讀取數(shù)據(jù)作為一個長連續(xù)段,而不需要任何額外的過濾。所得數(shù)據(jù)表示為一項(xiàng)非常長期的試驗(yàn)。要繪制其中一個通道的電位,您可以簡單地使用MATLAB plot函數(shù)。
chansel = 1; plot(data_eeg.time{1}, data_eeg.trial{1}(chansel, :)) xlabel('time (s)') ylabel('channel amplitude (uV)') legend(data_eeg.label(chansel))將連續(xù)的MEG數(shù)據(jù)讀入內(nèi)存
如果磁盤上的數(shù)據(jù)以分段或epoched的格式存儲,即文件格式已經(jīng)反映了實(shí)驗(yàn)中的試驗(yàn),則對ft_preprocessing的調(diào)用將返回正在讀取的數(shù)據(jù)并將其分段成原始試驗(yàn)的數(shù)據(jù)。
cfg = []; cfg.dataset = 'subj2.vhdr'; data_eeg = ft_preprocessing(cfg)>> data_eeg data_eeg =hdr: [1x1 struct]label: {64x1 cell}trial: {[64x1974550 double]}time: {[1x1974550 double]} fsample: 500cfg: [1x1 struct]該已分割的MEG數(shù)據(jù)集包含266個試驗(yàn)。以下示例顯示了如何在試驗(yàn)的子集中繪制數(shù)據(jù)。
for trialsel=1:10chansel = 1; % this is the STIM channel that contains the triggerfigureplot(data_meg.time{trialsel}, data_meg.trial{trialsel}(chansel, :))xlabel('time (s)')ylabel('channel amplitude (a.u.)')title(sprintf('trial %d', trialsel)); end如果要強(qiáng)制將epoched的數(shù)據(jù)解釋為連續(xù)數(shù)據(jù),則可以使用cfg.continuous選項(xiàng),如下所示:
cfg = []; cfg.dataset = 'Subject01.ds'; cfg.continuous = 'yes'; % force it to be continuous data_meg = ft_preprocessing(cfg);chansel = 2; % this is SCLK01 plot(data_meg.time{1}, data_meg.trial{1}(chansel, :)) xlabel('time (s)') ylabel(data_meg.label{chansel})如果放大并仔細(xì)查看SCLK01通道,您會發(fā)現(xiàn)每3秒會有一次小跳躍。這是由于數(shù)據(jù)在磁盤上是不連續(xù)的,即只有3秒的片段包含每個刺激存儲在磁盤上,而在試驗(yàn)之間的數(shù)據(jù)不存儲。因此,MEG頻道每3秒也會有一次小跳動,故不應(yīng)將此特定數(shù)據(jù)集解釋為連續(xù)記錄。許多其他CTF記錄存儲在磁盤上,每個數(shù)據(jù)段的時間為10秒。這些可以解釋為連續(xù)的,因?yàn)殚L段之間沒有間隙。
預(yù)處理,過濾和重新參考
在對該腦電圖數(shù)據(jù)進(jìn)行預(yù)處理時,必須考慮參考數(shù)據(jù)的選擇。在采集過程中,EEG放大器的參考通道連接到左乳突。我們想使用相連乳突參考(也稱為平均乳突參考)來分析此數(shù)據(jù)。此外,通過計算在眼睛周圍水平和垂直放置的電極的雙極偏差,可以方便地檢測眼睛的運(yùn)動和眨眼偽像。
BrainAmp Recorder軟件中配置的通道名稱與電極帽中位置的標(biāo)簽相對應(yīng)。這些電極的位置編號為1到60,并且對應(yīng)的通道名稱(如ASCII字符串)為“ 1”,“ 2”,……“ 60”。通道53對應(yīng)于右乳突。由于左乳突在采集中用作參考,因此在數(shù)據(jù)文件中未將其表示出來(因?yàn)楦鶕?jù)定義,該電極處的電壓為零)。
cfg = []; cfg.dataset = 'subj2.vhdr'; cfg.reref = 'yes'; cfg.channel = 'all'; cfg.implicitref = 'M1'; % the implicit (non-recorded) reference channel is added to the data representation cfg.refchannel = {'M1', '53'}; % the average of these two is used as the new reference, channel '53' corresponds to the right mastoid (M2) data_eeg = ft_preprocessing(cfg);為了保持一致性,我們將位于右側(cè)乳突的名稱為“53”的通道重命名為“M2”
chanindx = find(strcmp(data_eeg.label, '53')); data_eeg.label{chanindx} = 'M2';如果要丟棄不再需要的通道,我們可以進(jìn)行如下操作
cfg = []; cfg.channel = [1:61 65]; % keep channels 1 to 61 and the newly inserted M1 channel data_eeg = ft_preprocessing(cfg, data_eeg);如果查看數(shù)據(jù),我們將看到它包含一個試驗(yàn)。一次試驗(yàn)代表了完整的連續(xù)記錄,因此大約需要一個小時。
plot(data_eeg.time{1}, data_eeg.trial{1}(1:3,:)); legend(data_eeg.label(1:3));隨后,我們讀取水平EOG的數(shù)據(jù)
cfg = []; cfg.dataset = 'subj2.vhdr'; cfg.channel = {'51', '60'}; cfg.reref = 'yes'; cfg.refchannel = '51'; data_eogh = ft_preprocessing(cfg);在數(shù)據(jù)的這種表示形式中,結(jié)果通道51參考了自身,這意味著它包含零值。可以通過以下方式檢查
figure plot(data_eogh.time{1}, data_eogh.trial{1}(1,:)); hold on plot(data_eogh.time{1}, data_eogh.trial{1}(2,:),'g'); legend({'51' '60'});為方便起見,我們將通道60重命名為EOGH,并再次使用ft_preprocessing函數(shù)選擇水平EOG通道并丟棄虛擬通道。
data_eogh.label{2} = 'EOGH';cfg = []; cfg.channel = 'EOGH';% nothing will be done, only the selection of the interesting channel data_eogh = ft_preprocessing(cfg, data_eogh);使用通道50和64之間的差異作為雙極EOG,以類似方式完成垂直EOG的處理
cfg = []; cfg.dataset = 'subj2.vhdr'; cfg.channel = {'50', '64'}; cfg.reref = 'yes'; cfg.refchannel = '50' data_eogv = ft_preprocessing(cfg);data_eogv.label{2} = 'EOGV';cfg = []; cfg.channel = 'EOGV'; % nothing will be done, only the selection of the interesting channel data_eogv = ft_preprocessing(cfg, data_eogv);現(xiàn)在,我們已經(jīng)將EEG數(shù)據(jù)重新參考到乳突以及水平和垂直雙極EOG,我們可以使用以下方法將三個原始數(shù)據(jù)結(jié)構(gòu)組合為單個表示形式:
cfg = []; data_all = ft_appenddata(cfg, data_eeg, data_eogh, data_eogv);在上面的示例中,我們并沒有將過濾器應(yīng)用于數(shù)據(jù)。當(dāng)然我們可以在初始預(yù)處理/讀取過程中將過濾器應(yīng)用于數(shù)據(jù)。之后也可以通過調(diào)用ft_preprocessing函數(shù)并將數(shù)據(jù)作為第二個輸入?yún)?shù)來應(yīng)用過濾器。如果要將不同的預(yù)處理選項(xiàng)(例如,EEG通道的過濾器,EMG通道的校正,重新參考)應(yīng)用于不同的通道,則應(yīng)使用每種通道類型的所需選項(xiàng)調(diào)用ft_preprocessing,隨后添加不同的渠道類型的數(shù)據(jù)到一個原始數(shù)據(jù)結(jié)構(gòu)。
將連續(xù)數(shù)據(jù)分割為試驗(yàn)
通過特定于讀取和通道的預(yù)處理,您可以根據(jù)觸發(fā)代碼識別感興趣的數(shù)據(jù)片段,并將連續(xù)數(shù)據(jù)分割為試驗(yàn)。讓我們首先看看數(shù)據(jù)se中出現(xiàn)的不同觸發(fā)代碼
cfg = []; cfg.dataset = 'subj2.vhdr'; cfg.trialdef.eventtype = '?'; dummy = ft_definetrial(cfg);這將在屏幕上顯示事件類型和值。
evaluating trialfunction 'trialfun_general' the following events were found in the datafile event type: 'New Segment' with event values: event type: 'Response' with event values: 'R 8' event type: 'Stimulus' with event values: 'S 1' 'S 12' 'S 13' 'S 21' 'S 27' 'S111''S112' 'S113' 'S121' 'S122' 'S123' 'S131' 'S132' 'S133' 'S141' 'S142' 'S143''S151' 'S152' 'S153' 'S161' 'S162' 'S163' 'S171' 'S172' 'S173' 'S181' 'S182''S183' 'S211' 'S212' 'S213' 'S221' 'S222' 'S223' 'S231' 'S232' 'S233' 'S241''S242' 'S243' no trials have been defined yet, see FT_DEFINETRIAL for further help found 1570 events created 0 trials觸發(fā)代碼S111,S121,S131,S141分別對應(yīng)于所呈現(xiàn)的4種不同動物的圖片。觸發(fā)代碼S151,S161,S171,S181對應(yīng)于4種不同工具的顯示圖片。我們可以選擇以下動物和工具類別的數(shù)據(jù)
cfg = []; cfg.dataset = 'subj2.vhdr'; cfg.trialdef.eventtype = 'Stimulus'; cfg.trialdef.eventvalue = {'S111', 'S121', 'S131', 'S141'}; cfg_vis_animal = ft_definetrial(cfg);cfg.trialdef.eventvalue = {'S151', 'S161', 'S171', 'S181'}; cfg_vis_tool = ft_definetrial(cfg);ft_definetrial產(chǎn)生的輸出配置包含作為Nx3矩陣的試驗(yàn)定義,包含每個試驗(yàn)的開始樣本,結(jié)束樣本和每次試驗(yàn)的偏移量。原則上,我們現(xiàn)在可以使用此配置從磁盤上的原始數(shù)據(jù)文件中讀取這些段,但是由于我們已經(jīng)在內(nèi)存中擁有完整的連續(xù)數(shù)據(jù)所以我們將使用ft_redefinetrial從連續(xù)數(shù)據(jù)段中刪除這些片段。
data_vis_animal = ft_redefinetrial(cfg_vis_animal, data_all); data_vis_tool = ft_redefinetrial(cfg_vis_tool, data_all);隨后,我們可以使用ft_rejectvisual進(jìn)行偽影檢測,以刪除帶有偽影的試驗(yàn),并使用ft_timelockanalysis對試驗(yàn)進(jìn)行平均以獲取ERP,或者使用ft_freqanalysis獲得兩種情況下數(shù)據(jù)的平均時頻表示。如果將ft_timelockanalysis或ft_frequencyanalysis與cfg.keeptrials ='yes'選項(xiàng)一起使用,則可以隨后使用ft_timelockstatistics或ft_freqstatistics對這些刺激中的動物工具對比進(jìn)行統(tǒng)計比較。
將連續(xù)數(shù)據(jù)分割成一秒的片段
對于沒有觸發(fā)器的連續(xù)數(shù)據(jù)處理,可以方便地將數(shù)據(jù)切割成等長度的片段。這可以在從磁盤讀取數(shù)據(jù)的同時完成,也可以在完整的連續(xù)數(shù)據(jù)在內(nèi)存中完成。
以下示例顯示了如何一次性讀取和分段數(shù)據(jù)。
cfg = []; cfg.dataset = 'subj2.vhdr'; cfg.trialfun = 'ft_trialfun_general'; cfg.trialdef.triallength = 1; % duration in seconds cfg.trialdef.ntrials = inf; % number of trials, inf results in as many as possible cfg = ft_definetrial(cfg);% read the data from disk and segment it into 1-second pieces data_segmented = ft_preprocessing(cfg);以下示例顯示了如何首先將數(shù)據(jù)作為單個連續(xù)段讀取,然后將其切成第二個片段。
% read it from disk as a single continuous segment cfg = []; cfg.dataset = 'subj2.vhdr'; data_cont = ft_preprocessing(cfg);% segment it into 1-second pieces cfg = []; cfg.length = 1; data_segmented = ft_redefinetrial(cfg, data_cont);參考:
http://www.fieldtriptoolbox.org/tutorial/continuous/
文章來源于網(wǎng)絡(luò),僅用于學(xué)術(shù)分享,不用于商業(yè)行為,若有侵權(quán)及疑問,請后臺留言!
如需轉(zhuǎn)載請掃下面微信二維碼碼,備注"轉(zhuǎn)載"
更多閱讀
大腦分區(qū)與功能簡介匯總
第2期 | 國內(nèi)腦機(jī)接口領(lǐng)域?qū)<医淌趨R總
精彩長文 | 腦機(jī)接口技術(shù)的現(xiàn)狀與未來!
TensorFlow處理運(yùn)動想象分類任務(wù)
ICA處理腦電資料匯總
收藏 | 腦電EEG基礎(chǔ)與處理匯總
腦機(jī)接口BCI學(xué)習(xí)交流QQ群:903290195
總結(jié)
以上是生活随笔為你收集整理的FieldTrip toolbox教程系列(1)-预处理-读取连续的EEG和MEG数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能与算法学习总结报告!(珍藏版)
- 下一篇: 亚马逊返利广告试验