المحطة 7 · الدرس 3

ERP image

مهم12 دقيقةقبل هذا الدرس: ERP والمتوسطاتاطبع البطاقة
تبدأ من: eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئة، الاستيفاء (interpolation)، إعادة المرجع (re-referencing)، تشغيل ICA، فلتر 1 هرتز قبل ICA ونسخ الأوزان، ICLabel وحذف المكوّنات، استخراج epochs، تصحيح baseline، رفض epochs السيئةتنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
% Shortcut: if you saved D1_epochs_clean.set in the epoch rejection lesson, keep
% the first line and the last two lines (pop_newset, eeglab redraw), and replace
% every line between them with:
% EEG = pop_loadset('D1_epochs_clean.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 eye and muscle components, then low-pass at 30 Hz
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
EEG = pop_eegfiltnew(EEG, 'hicutoff', 30);

% Epochs around 'square', baseline, and +/-100 uV rejection
EEG = pop_epoch(EEG, {'square'}, [-1 2], 'newname', 'D1 epochs', 'epochinfo', 'yes');
EEG = pop_rmbase(EEG, [-200 0]);
EEG = pop_eegthresh(EEG, 1, 1:EEG.nbchan, -100, 100, EEG.xmin, EEG.xmax, 0, 0);
badEpochs = find(EEG.reject.rejthresh);
if ~isempty(badEpochs)
    EEG = pop_rejepoch(EEG, EEG.reject.rejthresh, 0);
end
EEG.setname = 'D1 epochs clean';
EEG = eeg_checkset(EEG);
EEG = pop_saveset(EEG, 'filename', 'D1_epochs_clean.set', 'filepath', pwd);
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 epochs clean', 'gui', 'off');
eeglab redraw;

الفكرة باختصار

الـ ERPمتوسط استجابة الدماغ لحدث معيّن عبر محاولات كثيرة. متوسط. يجمع عشرات محاولةtrialتكرار واحد للمهمة في التجربة، غالباً حول مثير واحد. في موجة واحدة، فيبقى ما يتكرر في نفس الزمن كل مرة ويضعف ما يتغيّر زمنه من محاولة لأخرى.

لكن الدماغ لا يستجيب بنفس التوقيتlatency (event)موضع الحدث في التسجيل، ويُخزَّن في EEGLAB بالعيّنات. في كل محاولة. لو كان مكوّن ما يأتي مع ضغطة الزر، وزمن الضغطة يتغيّر بين 330 و 730 ms، فهذا المكوّن ينتشر في المتوسط ويبدو أصغر وأعرض مما هو فعلاً.

قبل وبعد

قبل / بعد

الصورة تُضاف قريباً.

قبل: ERP image من EEGLAB 2026.1 للقناة Pz في داتاست D1 epochs clean، من -200 إلى 800 ms، بالمحاولات بترتيب تسجيلها وبلا تنعيم (Smoothing = 1). كل سطر محاولة. الصورة مزدحمة بخطوط أفقية متقطعة، ولا نمط واضح. تحتها موجة الـ ERP المتوسط، وعلى يمينها شريط ألوان بالميكروفولت، وخريطة رأس صغيرة أعلى اليسار عليها نقطة عند Pz. يجب أن تكون الصورتان بنفس الإطار والمقاس والمحاور تماماً.

الصورة تُضاف قريباً.

بعد: نفس القناة ونفس الإطار والمحاور، لكن المحاولات مرتّبة حسب زمن حدث rt (من الأسرع في الأسفل إلى الأبطأ في الأعلى)، ومنعّمة بمتوسط متحرك عرضه 10 محاولات. يظهر منحنى أسود مائل يمثّل زمن الاستجابة في كل محاولة، وتظهر الأنماط بوضوح أكبر. ألوان EEGLAB الافتراضية (turbo)، ومقياس ألوان متماثل حول الصفر.

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

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

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

الـ ERP imageرسم يعرض كل المحاولات كخطوط ملوّنة مرتّبة فوق بعضها. يعرض كل محاولة سطراً ملوّناً، ويرصّ السطور فوق بعض. وإذا رتّبتها حسب زمن الاستجابة، ترى بعينك ما يتبع الاستجابة وما يتبع المثير، قبل أن يختفي الفرق في المتوسط.

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

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

ابدأ داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. D1 epochs clean مفتوحة، كما في “نقطة البداية”. فيها حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير. square عند الزمن 0 في كل إيبوك، وحدث rt عند ضغطة الزر في أغلبها.

أولاً: الصورة الخام

  1. افتح Plot ثم Channel ERP image.
  2. في Channel اضغط زر ... واختر Pz.
  3. في Smoothing اكتب 1. الافتراضي 10، لكننا نريد أن نرى كل محاولة وحدها أولاً.
  4. في Time limits (ms) اكتب -200 800.
  5. تأكد أن Plot scalp map و Plot ERP و Plot colorbar مفعّلة. اضغط Ok.
  6. تظهر صورة: المحور الأفقي هو الزمن، وكل سطر من الأسفل للأعلى محاولة بترتيب تسجيلها. تحتها الـ ERP المتوسط.

ثانياً: رتّب المحاولات حسب زمن الاستجابة

  1. افتح Plot ثم Channel ERP image مرة ثانية. خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. تتذكر قيمك السابقة.
  2. في Smoothing اكتب 10.
  3. اضغط زر Epoch-sorting field واختر latency.
  4. اضغط زر Event type(s) واختر rt.
  5. في Event time range اكتب 0 1000. بهذا يأخذ EEGLAB الاستجابة التي جاءت بعد مثير الإيبوك نفسه فقط.
  6. اترك Rescale على no و Align فارغة. اضغط Ok.
  7. تظهر المحاولات مرتّبة: الأسرع في الأسفل والأبطأ في الأعلى، ومنحنى أسود يمر بزمن الاستجابة في كل سطر. انظر في نافذة الأوامر لسطر Removing ... trials with NaN sortvar values: هذه محاولات بلا استجابة استُبعدت من الصورة.

ثالثاً: انظر من جهة الاستجابة

  1. افتح النافذة مرة ثالثة، واكتب Inf في Align، وامسح Time limits (ms). اضغط Ok.
  2. الآن كل المحاولات مزاحة حتى تقع الاستجابة على خط مستقيم عند وسيط زمن الاستجابة، والمنحنى المائل صار يمثّل زمن المثير.
  3. قارن: ما يبقى مستقيماً في الصورة الثانية مرتبط بالمثير، وما يصير مستقيماً هنا مرتبط بالاستجابة.

رابعاً: اقرأ الصورة

ما تراهمعناه
شريط ملوّن عمودي مستقيم بعد 0 msنشاط يأتي بنفس الزمن بعد المثير في كل محاولة. هذا يبقى قوياً في الـ ERP المتوسط.
شريط مائل يتبع المنحنى الأسودنشاط مرتبط بالاستجابة. في المتوسط حول المثير يتوزّع على مدى أزمنة الاستجابة، فيظهر أضعف وأعرض.
خطوط مائلة متكررة بألوان متناوبة لا تتبع شيئاًتذبذب مستمر (مثل ألفا قرب 10 Hz) بطور مختلف في كل محاولة. يلغي بعضه بعضاً في المتوسط تقريباً.
سطر واحد بلون شديد يختلف عن جيرانهمحاولة فيها ضوضاءnoiseأي جزء من التسجيل لا يحمل المعلومة التي نقيسها.. مع التنعيم تنتشر على السطور المجاورة.
زوايا خالية أسفل اليسار وأعلى اليمين بعد Alignلا بيانات هناك بعد الإزاحة. EEGLAB يلوّنها بلون الصفر.
المحاولات بلا rt

في D1 ست محاولات بلا حدث rt بين 0 و 1000 ms. لو تركت Event time range فارغة، يبحث EEGLAB في كل الإيبوك من -1000 إلى 2000 ms، فقد يجد في إحداها استجابة المثير التالي عند نحو 1080 ms ويرتّبها بها خطأً.

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

نفس الخطوات في 18 أسطر MATLAB
MATLAB
EEG = pop_loadset('D1_epochs_clean.set', pwd);
chan = find(strcmp({EEG.chanlocs.labels}, 'Pz'));

% Response latency per epoch, NaN when no response follows the stimulus
rt = eeg_getepochevent(EEG, 'type', {'rt'}, 'timewin', [0 1000]);
fprintf('%d of %d epochs have a response, median RT %.0f ms\n', ...
    sum(~isnan(rt)), EEG.trials, median(rt, 'omitnan'));

% Trials in recording order, no smoothing
figure; pop_erpimage(EEG, 1, chan, [], 'Pz', 1, 1, {}, [], '', ...
    'erp', 'on', 'cbar', 'on', 'limits', [-200 800], ...
    'topo', {chan EEG.chanlocs EEG.chaninfo});

% Trials sorted by response latency, 10-trial moving average
figure; pop_erpimage(EEG, 1, chan, [], 'Pz sorted by RT', 10, 1, {'rt'}, [0 1000], 'latency', ...
    'erp', 'on', 'cbar', 'on', 'limits', [-200 800], ...
    'topo', {chan EEG.chanlocs EEG.chaninfo});

% Same trials aligned to the median response latency
figure; pop_erpimage(EEG, 1, chan, [], 'Pz aligned to response', 10, 1, {'rt'}, [0 1000], 'latency', ...
    'align', Inf, 'erp', 'on', 'cbar', 'on', ...
    'topo', {chan EEG.chanlocs EEG.chaninfo});

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

القيم المناسبة حسب هدف تحليلك
الإعدادالقيمةلماذا
Smoothing1 للنظرة الأولى، ثم 5 إلى 10التنعيم متوسط متحرك على المحاولات المتجاورة بعد الترتيب. يوضّح النمط، لكن كبره يمسح الفروق بين المحاولات، وهي سبب رسم الصورة. مع نحو 80 محاولة، 10 حدthresholdقيمة إذا تجاوزتها الإشارة اعتُبرت مشكلة. معقول.
Event time range0 1000 في D1يحصر البحث في استجابة المثير نفسه. الإيبوك من -1000 إلى 2000 ms فيه أحياناً أحداث المثير السابق أو التالي، و EEGLAB يأخذ أول حدث يجده فقط.
قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB.Pz لمكوّن موجب متأخر، و POz أو Oz لألفااختر القناة التي يكون فيها الأثر أوضح في رسم ERP للقنوات، ثم افتحها هنا.
Color limits (see Help)فارغة (الافتراضي) أو كسر مثل 0.9الافتراضي متماثل حول الصفر من أكبر قيمة مطلقة. إذا جعلت محاولة واحدة شاذة الصورة باهتة، كسر مثل 0.9 يضيّق المقياس. اذكر ذلك في وصف الرسمة.
Downsampling1تحتاجه فقط مع مئات المحاولات. هنا يضيّع معلومات بلا فائدة.
Alignفارغة، أو Inf للنظر من جهة الاستجابةInf تعني وسيط قيم الترتيب. يمكنك كتابة رقم بالميلي ثانية بدلاً منه.

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

4 فحوص سريعة
  • المنحنى الأسود يرتفع من اليسار لليمين بين نحو 330 و 730 ms، وأضيق قليلاً مع التنعيم، ولا يتجاوز 800 ms.
  • رسالة الاستبعاد في نافذة الأوامر تذكر 6 محاولات أو أقل، وتساوي عدد الإيبوكات ناقص عدد التي لها استجابة في سطر fprintf من سكربتscriptملف أوامر MATLAB ينفّذ خطوات المعالجة بالترتيب..
  • مع Align على Inf يصير المنحنى الأسود مستقيماً عند نحو 400 ms، ويظهر منحنى زمن المثير مائلاً.
  • مع Smoothing على 1 ترى سطوراً أكثر تفصيلاً وأقل انتظاماً مما تراه مع 10.

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

5 أخطاء، وكيف تتجنّبها
  • ترك Event time range فارغة. EEGLAB يأخذ أول rt في الإيبوك كله، وقد يكون لمثير آخر. الترتيب يصير خاطئاً بلا أي رسالة خطأ.
  • تنعيم كبير جداً. مع تنعيم 40 محاولة من نحو 75، كل سطر متوسط لأكثر من نصف البيانات، فتصير الصورة ERP مكرّراً لا يضيف شيئاً.
  • نسيان المحاولات المستبعدة. المحاولات بلا قيمة ترتيب تُحذف من الصورة ومن الموجة التي تحتها. فالموجة تحت الصورة قد تختلف قليلاً عن الـ ERP في درس المتوسط. اقرأ رسالة Removing ... trials واذكر العدد.
  • قراءة شريط مائل كأنه مكوّن جديد. الصورة تريك العلاقة بالاستجابة، لا مصدرها. التأكد يحتاج تحليلاً بمستوى المجموعة.
  • رسم ERP image لكل القنوات. الأداة لقناة واحدة (أو متوسط عدة قنوات) في كل مرة. اختر القناة من رسم ERP للقنوات أولاً.

كيف أكتبها في ورقتي؟

قالب Methods: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته

قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.

Single-trial ERP images at Pz were sorted by reaction time and smoothed with a 10-trial moving average (pop_erpimage, EEGLAB 2026.1); [N] epochs without a response between 0 and 1000 ms were excluded from the image.

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

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

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

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

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