المحطة 5 · الدرس 1

استخراج epochs

أساسي12 دقيقةقبل هذا الدرس: الأحداث (events)، ICLabel وحذف المكوّناتاطبع البطاقة
تبدأ من: eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئة، الاستيفاء (interpolation)، إعادة المرجع (re-referencing)، تشغيل ICA، فلتر 1 هرتز قبل ICA ونسخ الأوزان، ICLabel وحذف المكوّناتتنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
% 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مقطع زمني قصير مقتطع حول حدث.)، يبدأ قبل الحدث بقليل وينتهي بعده بقليل. كل مقطع يبدأ عند نفس الزمن بالنسبة لحدثه، فتستطيع مقارنة المقاطع ببعضها وحساب متوسطها لاحقاً.

قبل وبعد

قناة Cz من D1 لمدة 15 ثانية، وعليها خمسة أحداث square كل 3 ثوانٍ، وحول كل حدث نافذة من ثانية قبله إلى ثانيتين بعده. بعد التقطيع تصير النوافذ صفوفاً فوق بعض تبدأ كلها عند -1 ثانية، والصفر عند الحدث. الحجم الكلي 32 قناة × 384 نقطة زمنية × 80 epoch.
البيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)

أسئلتك بعد هذا، كل جواب في قسمه:

لماذا أحتاج هذه الخطوة؟

السبب بالتفصيل، والمصطلحات التي تحتاجها

في D1 ظهر المربع (square) على الشاشة 80 مرة، وضغط مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. زراً بعد بعضها (حدث rt). سنقطع حول المربع فقط.

كيف أطبّقها في EEGLAB؟

7 خطوة من القوائم

ابدأ داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. D1 main clean lp30 مفتوحة، كما في “نقطة البداية”.

  1. افتح Tools ثم Extract epochs.
  2. تظهر نافذة Extract data epochs - pop_epoch(). اضغط الزر … بجانب Time-locking event type(s) ([]=all).
  3. تظهر قائمةmenuمجموعة أوامر تظهر عند الضغط على اسمها في أعلى النافذة. أنواع الأحداث: rt و square. اختر square واضغط Ok. يمكنك أيضاً كتابة square في خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. مباشرة.
  4. في Epoch limits [start, end] in seconds اترك القيمة الافتراضية -1 2، أي من ثانية قبل الحدث إلى ثانيتين بعده.
  5. في Name for the new dataset اكتب D1 epochs.
  6. اترك Out-of-bounds EEG limits if any [min max] فارغة. رفضrejectionاستبعاد epochs أو بيانات لا تصلح للتحليل. المقاطع السيئة له درس خاص بعد درسين.
  7. اضغط 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. هذا تذكير فقط، وليس خطأ.

كيف أكتبها بالكود؟

نفس الخطوات في 6 أسطر MATLAB
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);

أي قيمة أختار؟

القيم المناسبة حسب هدف تحليلك
الهدفالنافذةلماذا
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 موقعا المربع هما الشرطان، ونقارن بينهما في ذلك الدرس.

كيف أتأكد أنها نجحت؟

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 عند الصفر.

ما الأخطاء التي يقع فيها كثيرون؟

5 أخطاء، وكيف تتجنّبها
  • التقطيع قبل الفلترة. الفلتر على مقاطع قصيرة يصنع تشوّهاً عند أطرافها. افلتر البيانات المستمرة أولاً، ثم قطّع، كما فعلنا في المحطة 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.

أين أقرأ أكثر؟

3 مراجع: التوثيق الرسمي أولاً

مكتوب لـ EEGLAB 2026.1 · 2026-10-28

تحتاج مساعدة؟

اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ