المحطة 5 · الدرس 1
استخراج epochs
eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئة، الاستيفاء (interpolation)، إعادة المرجع (re-referencing)، تشغيل ICA، فلتر 1 هرتز قبل ICA ونسخ الأوزان، ICLabel وحذف المكوّناتتنزيل البيانات (يفتح في نافذة جديدة)سكربت الوصول لهذه الحالة
% Shortcut: if you saved D1_main_clean_lp30.set in the ICLabel lesson, keep
% the first line and the last three lines, and replace every line between them with:
% EEG = pop_loadset('D1_main_clean_lp30.set', pwd);
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
eeglabRoot = fileparts(which('eeglab'));
EEG = pop_loadset('eeglab_data.set', fullfile(eeglabRoot, 'sample_data'));
fullLocs = EEG.chanlocs;
% Main dataset: high-pass at 0.1 Hz, then 60 Hz line-noise removal
EEG = pop_eegfiltnew(EEG, 'locutoff', 0.1);
EEG = pop_eegfiltnew(EEG, 'locutoff', 58, 'hicutoff', 62, 'revfilt', 1);
% Bad channels you removed earlier, e.g. {'T7'}; leave empty if none
badChans = {};
if ~isempty(badChans)
EEG = pop_select(EEG, 'rmchannel', badChans);
EEG = pop_interp(EEG, fullLocs, 'spherical');
end
% Average reference, EOG channels excluded
eogIdx = find(ismember({EEG.chanlocs.labels}, {'EOG1', 'EOG2'}));
EEG = pop_reref(EEG, [], 'exclude', eogIdx);
% ICA on a 1-Hz copy, then copy the weights back
EEG_ica = pop_eegfiltnew(EEG, 'locutoff', 1);
EEG_ica = pop_runica(EEG_ica, 'icatype', 'runica', 'extended', 1);
EEG.icaweights = EEG_ica.icaweights;
EEG.icasphere = EEG_ica.icasphere;
EEG.icachansind = EEG_ica.icachansind;
EEG.icawinv = [];
EEG.icaact = [];
EEG = eeg_checkset(EEG);
% Remove components ICLabel rates above 90% Eye or Muscle
EEG = pop_iclabel(EEG, 'default');
EEG = pop_icflag(EEG, [NaN NaN; 0.9 1; 0.9 1; NaN NaN; NaN NaN; NaN NaN; NaN NaN]);
artifactComps = find(EEG.reject.gcompreject);
if ~isempty(artifactComps)
EEG = pop_subcomp(EEG, artifactComps, 0);
end
% Low-pass at 30 Hz
EEG = pop_eegfiltnew(EEG, 'hicutoff', 30);
EEG.setname = 'D1 main clean lp30';
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 main clean lp30', 'gui', 'off');
eeglab redraw;زر الرجوع في متصفحك يعيدك لنفس المكان الذي كنت فيه، فافتح ما تشاء بلا قلق.
الفكرة باختصار
بياناتك الآن تسجيل واحد مستمر طوله حوالي 4 دقائق. لكن سؤالك في تجربة ERPمتوسط استجابة الدماغ لحدث معيّن عبر محاولات كثيرة. عن لحظات محددة: ماذا يفعل الدماغ بعد ظهور المثير مباشرة؟
لذلك تقطع حول كل حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير. مقطعاً قصيراً، يسمّى مقطعاً زمنياً حول حدث (epochمقطع زمني قصير مقتطع حول حدث.)، يبدأ قبل الحدث بقليل وينتهي بعده بقليل. كل مقطع يبدأ عند نفس الزمن بالنسبة لحدثه، فتستطيع مقارنة المقاطع ببعضها وحساب متوسطها لاحقاً.
قبل وبعد
أسئلتك بعد هذا، كل جواب في قسمه:
لماذا أحتاج هذه الخطوة؟
السبب بالتفصيل، والمصطلحات التي تحتاجها
في D1 ظهر المربع (square) على الشاشة 80 مرة، وضغط مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. زراً بعد بعضها (حدث rt). سنقطع حول المربع فقط.
لماذا أحتاج هذه الخطوة؟
في D1 ظهر المربع (square) على الشاشة 80 مرة، وضغط المشارك زراً بعد بعضها (حدث rt). سنقطع حول المربع فقط.
كيف أطبّقها في EEGLAB؟
7 خطوة من القوائم
ابدأ داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. D1 main clean lp30 مفتوحة، كما في “نقطة البداية”.
- افتح Tools ثم Extract epochs.
- تظهر نافذة Extract data epochs - pop_epoch(). اضغط الزر … بجانب Time-locking event type(s) ([]=all).
- تظهر أنواع الأحداث:
rtوsquare. اخترsquareواضغط Ok. يمكنك أيضاً كتابةsquareفي خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. مباشرة. - في Epoch limits [start, end] in seconds اترك القيمة الافتراضية
-1 2، أي من ثانية قبل الحدث إلى ثانيتين بعده. - في Name for the new dataset اكتب
D1 epochs. - اترك Out-of-bounds EEG limits if any [min max] فارغة. رفضrejectionاستبعاد epochs أو بيانات لا تصلح للتحليل. المقاطع السيئة له درس خاص بعد درسين.
- اضغط Ok. تظهر نافذة الداتاست الجديدة وفيها Name it: بالاسم الذي كتبته. اترك Overwrite it in memory (set=yes; unset=create a new dataset) غير مفعّل، واضغط Ok.
نافذة baseline لا تظهر
التوتوريال الرسمي يذكر أن نافذة تصحيح baselineالفترة قبل المثير التي تُستخدم كمستوى صفر للمقارنة. تظهر تلقائياً بعد التقطيع. في كود EEGLAB 2026.1 لا تظهر، والتصحيح خطوة مستقلة من قائمة Tools ثم Remove epoch baseline، وهي موضوع الدرس التالي.
بدل النافذة، ستظهر في نافذة الأوامر رسالة تبدأ بـ Warning: Do you also want to remove the single-trial ERP baseline. هذا تذكير فقط، وليس خطأ.
نافذة baseline لا تظهر
التوتوريال الرسمي يذكر أن نافذة تصحيح baselineالفترة قبل المثير التي تُستخدم كمستوى صفر للمقارنة. تظهر تلقائياً بعد التقطيع. في كود EEGLAB 2026.1 لا تظهر، والتصحيح خطوة مستقلة من قائمة Tools ثم Remove epoch baseline، وهي موضوع الدرس التالي.
بدل النافذة، ستظهر في نافذة الأوامر رسالة تبدأ بـ Warning: Do you also want to remove the single-trial ERP baseline. هذا تذكير فقط، وليس خطأ.
كيف أطبّقها في EEGLAB؟
ابدأ والداتاست D1 main clean lp30 مفتوحة، كما في “نقطة البداية”.
- افتح Tools ثم Extract epochs.
- تظهر نافذة Extract data epochs - pop_epoch(). اضغط الزر … بجانب Time-locking event type(s) ([]=all).
- تظهر قائمة أنواع الأحداث:
rtوsquare. اخترsquareواضغط Ok. يمكنك أيضاً كتابةsquareفي الخانة مباشرة. - في Epoch limits [start, end] in seconds اترك القيمة الافتراضية
-1 2، أي من ثانية قبل الحدث إلى ثانيتين بعده. - في Name for the new dataset اكتب
D1 epochs. - اترك Out-of-bounds EEG limits if any [min max] فارغة. رفض المقاطع السيئة له درس خاص بعد درسين.
- اضغط Ok. تظهر نافذة الداتاست الجديدة وفيها Name it: بالاسم الذي كتبته. اترك Overwrite it in memory (set=yes; unset=create a new dataset) غير مفعّل، واضغط Ok.
نافذة baseline لا تظهر
التوتوريال الرسمي يذكر أن نافذة تصحيح baseline تظهر تلقائياً بعد التقطيع. في كود EEGLAB 2026.1 لا تظهر، والتصحيح خطوة مستقلة من قائمة Tools ثم Remove epoch baseline، وهي موضوع الدرس التالي.
بدل النافذة، ستظهر في نافذة الأوامر رسالة تبدأ بـ Warning: Do you also want to remove the single-trial ERP baseline. هذا تذكير فقط، وليس خطأ.
نافذة baseline لا تظهر
التوتوريال الرسمي يذكر أن نافذة تصحيح baseline تظهر تلقائياً بعد التقطيع. في كود EEGLAB 2026.1 لا تظهر، والتصحيح خطوة مستقلة من قائمة Tools ثم Remove epoch baseline، وهي موضوع الدرس التالي.
بدل النافذة، ستظهر في نافذة الأوامر رسالة تبدأ بـ Warning: Do you also want to remove the single-trial ERP baseline. هذا تذكير فقط، وليس خطأ.
كيف أكتبها بالكود؟
نفس الخطوات في 6 أسطر MATLAB
% Cut 3-s epochs around every 'square' event: 1 s before to 2 s after
EEG = pop_epoch(EEG, {'square'}, [-1 2], 'newname', 'D1 epochs', 'epochinfo', 'yes');
EEG = eeg_checkset(EEG);
% Channels x time points x epochs
disp(size(EEG.data));
fprintf('Epochs: %d, from %.3f s to %.3f s\n', EEG.trials, EEG.xmin, EEG.xmax);كيف أكتبها بالكود؟
% Cut 3-s epochs around every 'square' event: 1 s before to 2 s after
EEG = pop_epoch(EEG, {'square'}, [-1 2], 'newname', 'D1 epochs', 'epochinfo', 'yes');
EEG = eeg_checkset(EEG);
% Channels x time points x epochs
disp(size(EEG.data));
fprintf('Epochs: %d, from %.3f s to %.3f s\n', EEG.trials, EEG.xmin, EEG.xmax);أي قيمة أختار؟
القيم المناسبة حسب هدف تحليلك
| الهدف | النافذة | لماذا |
|---|---|---|
| ERP فقط | تبدأ 200 ميلي ثانية على الأقل قبل الحدث، وتنتهي بعد آخر مكوّن ERP يهمّك | الجزء قبل الحدث يُستخدم baseline في الدرس التالي. مثال: تجربة N400 في بيانات ERP CORE تُقطع من -200 إلى 800 ميلي ثانية. |
| ERP مع تحليل زمني-تردديtime-frequencyتحليل يبيّن كيف تتغيّر قدرة كل تردد مع الزمن. | أطول، مثل -1 2 هنا | التوتوريال الرسمي يوصي بمقاطع طويلة ليمكن تحليل الترددات المنخفضة (تحت 10 هرتز). |
| مسارنا في هذا الموقع | -1 2 | القيمة الافتراضية في EEGLAB والتوتوريال الرسمي، وتكفي لدرسي ERP و ERSPتغيّر القدرة عند كل تردد وزمن مقارنة بفترة baseline.. |
قاعدة البداية: النافذة أقصر من المسافة بين حدثين متتاليين قدر الإمكان. في D1 بين كل مربع والذي يليه 3 ثوانٍ تقريباً، ونافذتنا 3 ثوانٍ، فلا يتكرر نفس الجزء من البيانات في مقطعين إلا في حالة واحدة (مربعان بينهما 0.7 ثانية في بداية التسجيل).
تجربة فيها أكثر من شرطconditionحالة تجريبية نقارن بينها وبين غيرها، مثل "مألوف" و"غير مألوف".: اقطع حول كل الشروط معاً، ثم اختر شرطاً واحداً قبل المتوسط. في EEGLAB قائمة لهذا، Edit ثم Select epochs or events، لكنها في 2026.1 تتوقف برسالة خطأ على البيانات المقطّعة. درس channel-erp-plot يعرض سكربتاً قصيراً يقوم بالشيء نفسه. في D1 موقعا المربع هما الشرطان، ونقارن بينهما في ذلك الدرس.
أي قيمة أختار؟
| الهدف | النافذة | لماذا |
|---|---|---|
| ERP فقط | تبدأ 200 ميلي ثانية على الأقل قبل الحدث، وتنتهي بعد آخر مكوّن ERP يهمّك | الجزء قبل الحدث يُستخدم baseline في الدرس التالي. مثال: تجربة N400 في بيانات ERP CORE تُقطع من -200 إلى 800 ميلي ثانية. |
| ERP مع تحليل زمني-ترددي | أطول، مثل -1 2 هنا | التوتوريال الرسمي يوصي بمقاطع طويلة ليمكن تحليل الترددات المنخفضة (تحت 10 هرتز). |
| مسارنا في هذا الموقع | -1 2 | القيمة الافتراضية في EEGLAB والتوتوريال الرسمي، وتكفي لدرسي ERP و ERSP. |
قاعدة البداية: النافذة أقصر من المسافة بين حدثين متتاليين قدر الإمكان. في D1 بين كل مربع والذي يليه 3 ثوانٍ تقريباً، ونافذتنا 3 ثوانٍ، فلا يتكرر نفس الجزء من البيانات في مقطعين إلا في حالة واحدة (مربعان بينهما 0.7 ثانية في بداية التسجيل).
تجربة فيها أكثر من شرط: اقطع حول كل الشروط معاً، ثم اختر شرطاً واحداً قبل المتوسط. في EEGLAB قائمة لهذا، Edit ثم Select epochs or events، لكنها في 2026.1 تتوقف برسالة خطأ على البيانات المقطّعة. درس channel-erp-plot يعرض سكربتاً قصيراً يقوم بالشيء نفسه. في D1 موقعا المربع هما الشرطان، ونقارن بينهما في ذلك الدرس.
كيف أتأكد أنها نجحت؟
3 فحوص سريعة
- في نافذة EEGLAB الرئيسية: Epochs تساوي 80، وFrames per epoch تساوي 384، وEpoch start (sec) تساوي -1، وEpoch end (sec) تساوي 1.992 تقريباً.
- في نافذة الأوامر:
size(EEG.data)يعطي32 384 80، وتظهر رسالة التذكير بـ baseline التي تبدأ بـWarning:، وهذا متوقع. - افتح Plot ثم Channel data (scroll): البيانات تظهر الآن مقاطع منفصلة بخطوط فاصلة، وكل مقطع فيه حدث
squareعند الصفر.
كيف أتأكد أنها نجحت؟
- في نافذة EEGLAB الرئيسية: Epochs تساوي 80، وFrames per epoch تساوي 384، وEpoch start (sec) تساوي -1، وEpoch end (sec) تساوي 1.992 تقريباً.
- في نافذة الأوامر:
size(EEG.data)يعطي32 384 80، وتظهر رسالة التذكير بـ baseline التي تبدأ بـWarning:، وهذا متوقع. - افتح Plot ثم Channel data (scroll): البيانات تظهر الآن مقاطع منفصلة بخطوط فاصلة، وكل مقطع فيه حدث
squareعند الصفر.
ما الأخطاء التي يقع فيها كثيرون؟
5 أخطاء، وكيف تتجنّبها
- التقطيع قبل الفلترة. الفلتر على مقاطع قصيرة يصنع تشوّهاً عند أطرافها. افلتر البيانات المستمرة أولاً، ثم قطّع، كما فعلنا في المحطة 3.
- ترك نوع الحدث فارغاً. الخانة الفارغة تعني “كل الأحداث”، فتحصل على 153 مقطعاً تخلط بين ظهور المربع وضغطة الزر (من 154 حدثاً، لأن آخر ضغطة زر قريبة جداً من نهاية التسجيل فيضيع مقطعها). اكتب النوع دائماً.
- نافذة قصيرة جداً. إذا بدأت النافذة عند الحدث نفسه، فلا توجد فترة قبله لتصحيح baseline. وإذا كانت قصيرة بعده، تقطع مكوّنات ERP المتأخرة.
- توقّع أن عدد الأحداث يساوي عدد المقاطع. كل مقطع يحمل كل الأحداث التي تقع داخله، ومنها ضغطة الزر بعد المربع. لذلك
length(EEG.event)أكبر منEEG.trials. - مقاطع تضيع عند أطراف التسجيل. إذا كان الحدث قريباً جداً من بداية التسجيل أو نهايته، يحذف EEGLAB مقطعه ويكتب تحذيراً في نافذة الأوامر. في D1 أول مربع بعد ثانية واحدة من البداية، فلا يضيع أي مقطع، لكن بلا هامش: لو بدأت النافذة من -1.1 ثانية لضاع المقطع الأول.
ما الأخطاء التي يقع فيها كثيرون؟
- التقطيع قبل الفلترة. الفلتر على مقاطع قصيرة يصنع تشوّهاً عند أطرافها. افلتر البيانات المستمرة أولاً، ثم قطّع، كما فعلنا في المحطة 3.
- ترك نوع الحدث فارغاً. الخانة الفارغة تعني “كل الأحداث”، فتحصل على 153 مقطعاً تخلط بين ظهور المربع وضغطة الزر (من 154 حدثاً، لأن آخر ضغطة زر قريبة جداً من نهاية التسجيل فيضيع مقطعها). اكتب النوع دائماً.
- نافذة قصيرة جداً. إذا بدأت النافذة عند الحدث نفسه، فلا توجد فترة قبله لتصحيح baseline. وإذا كانت قصيرة بعده، تقطع مكوّنات ERP المتأخرة.
- توقّع أن عدد الأحداث يساوي عدد المقاطع. كل مقطع يحمل كل الأحداث التي تقع داخله، ومنها ضغطة الزر بعد المربع. لذلك
length(EEG.event)أكبر منEEG.trials. - مقاطع تضيع عند أطراف التسجيل. إذا كان الحدث قريباً جداً من بداية التسجيل أو نهايته، يحذف EEGLAB مقطعه ويكتب تحذيراً في نافذة الأوامر. في D1 أول مربع بعد ثانية واحدة من البداية، فلا يضيع أي مقطع، لكن بلا هامش: لو بدأت النافذة من -1.1 ثانية لضاع المقطع الأول.
متصفحك لا يسمح بحفظ التقدّم. كل الدروس متاحة، لكن علامات الإكمال لن تُحفظ.
تم. حُفظ تقدّمك في هذا المتصفح.تراجعكيف أكتبها في ورقتي؟
قالب Methods: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته
قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.
Continuous data were segmented into epochs from -1 to 2 s relative to the onset of each square stimulus (pop_epoch, EEGLAB 2026.1), yielding [80] epochs.كيف أكتبها في ورقتي؟
قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.
Continuous data were segmented into epochs from -1 to 2 s relative to the onset of each square stimulus (pop_epoch, EEGLAB 2026.1), yielding [80] epochs.أين أقرأ أكثر؟
3 مراجع: التوثيق الرسمي أولاً
- EEGLAB Tutorialتوثيق7. Extract Data Epochs: Extracting data epochs
- Makoto's preprocessing pipeline§10 Epoch data
- Applied Event-Related Potential Data Analysis (Luck)2.07 Exercise: Epoching and Baseline Correction
مكتوب لـ EEGLAB 2026.1 · 2026-10-28
للتوسّع
- EEGLAB Tutorial: https://eeglab.org/tutorials/07_Extract_epochs/Extracting_Data_Epochs.html (7. Extract Data Epochs: Extracting data epochs)
- Makoto's preprocessing pipeline: https://eeglab.ucsd.edu/wiki/Makoto%27s_preprocessing_pipeline (§10 Epoch data)
- Applied Event-Related Potential Data Analysis (Luck): https://socialsci.libretexts.org/Bookshelves/Psychology/Biological_Psychology/Applied_Event-Related_Potential_Data_Analysis_(Luck) (2.07 Exercise: Epoching and Baseline Correction)
تحتاج مساعدة؟
اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ
- بلّغ عن خطأ علمي · يحتاج حساباً على GitHub. لا تملك حساباً؟ استخدم "شاركنا رأيك".