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

تصحيح baseline

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

% Epochs around 'square'
EEG = pop_epoch(EEG, {'square'}, [-1 2], 'newname', 'D1 epochs', 'epochinfo', 'yes');
EEG = eeg_checkset(EEG);
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 epochs', 'gui', 'off');
eeglab redraw;

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

كل epochمقطع زمني قصير مقتطع حول حدث. يبدأ من مستوى مختلف قليلاً. السبب انجرافات بطيئة بقيت بعد فلترةfilteringتطبيق فلتر على البيانات.، أو اختلاف بسيط في حالة قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة. بين لحظة وأخرى. هذا الفرق ليس استجابة للمثير، لكنه يضاف لكل نقطة في الـ epoch.

قبل وبعد

اعرض
20 حقبة من القناة Pz فوق بعضها من -1000 إلى 1992 ملي ثانية، وفترة الأساس من -200 إلى 0 مظللة. الخطوط تبدأ من مستويات مختلفة.
قبل تصحيح خط الأساسالبيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)
الحقب نفسها بعد pop_rmbase على -200 إلى 0 وبنفس المحاور: داخل الفترة المظللة تلتقي الخطوط حول الصفر.
بعد تصحيح خط الأساسالبيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)

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

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

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

الحل: خذ baselineالفترة قبل المثير التي تُستخدم كمستوى صفر للمقارنة. (baseline)، وهي فترة لم يرَ فيها مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. المثير بعد. احسب متوسطها في كل قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. وكل epoch، ثم اطرحه من الـ epoch كله.

بعد التصحيح، كل epoch يبدأ من الصفر تقريباً، وأي تغيّر بعد المثير يُقاس بالنسبة لما قبله.

الـ high-passفلتر يمرّر الترددات العالية ويُضعف البطيئة مثل الانجراف. في المحطة 3 أزال أغلب الانجراف، والتوتوريال الرسمي يعدّه نوعاً من تصحيح baseline. لكن الفرق الباقي بين الـ epochs ما زال يكفي ليؤثر في المتوسط، ولذلك تصحيح baseline خطوة قياسية في تحليل ERPمتوسط استجابة الدماغ لحدث معيّن عبر محاولات كثيرة..

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

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

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

  1. افتح Tools ثم Remove epoch baseline.
  2. تظهر نافذة Baseline removal - pop_rmbase(). في Baseline latency range ([min max] in ms) ([ ] = whole epoch): القيمة الافتراضية -1000 0، أي كل الفترة قبل حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير.. غيّرها إلى -200 0.
  3. اترك Or remove baseline points vector (ex:1:56): فارغة. هي طريقة بديلة بأرقام النقاط بدل الزمن.
  4. اترك Channel type(s) وOR channel(s) (default all) فارغتين، فيُطبّق التصحيح على كل القنوات.
  5. اضغط Ok. في نافذة الداتاست الجديدة اكتب في Name it: الاسم D1 epochs bl، واترك Overwrite it in memory (set=yes; unset=create a new dataset) غير مفعّل، ثم Ok.
ميلي ثانية لا ثوانٍ

الزمن في هذه النافذة بالميلي ثانية، أما حدود الـ epoch في درس التقطيع فبالثواني. اكتب -200 0 هنا، لا -0.2 0.

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

نفس الخطوات في 8 أسطر MATLAB
MATLAB
% Subtract the mean of -200 to 0 ms from every channel and epoch
EEG = pop_rmbase(EEG, [-200 0]);
EEG.setname = 'D1 epochs bl';
EEG = eeg_checkset(EEG);

% Check: the baseline mean should now be close to zero everywhere
blIdx = EEG.times >= -200 & EEG.times <= 0;
blMeans = mean(EEG.data(:, blIdx, :), 2);
fprintf('Baseline points: %d, largest baseline mean: %.2g uV\n', sum(blIdx), max(abs(blMeans(:))));

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

القيم المناسبة حسب هدف تحليلك
الإعدادالقيمةلماذا
فترة baseline لتحليل ERPمن -200 إلى 0 ميلي ثانيةقيمة شائعة في دراسات ERP، وهي المستخدمة مثلاً في تجربة N400 في بيانات ERP CORE. قصيرة بما يكفي لتكون قريبة من المثير، وطويلة بما يكفي ليكون متوسطها مستقراً.
كل الفترة قبل الحدثمن -1000 إلى 0الافتراضي في نافذة EEGLAB. متوسط أكثر استقراراً لأنه من نقاط أكثر، لكنه قد يضم نشاطاً من محاولةtrialتكرار واحد للمهمة في التجربة، غالباً حول مثير واحد. السابقة إذا كانت المحاولات متقاربة.
فترة قصيرة جداً100 ميلي ثانية أو أقلالتوتوريال الرسمي ينصح بتجنّبها قدر الإمكان، لأن متوسط عدد قليل من النقاط يتأثر ضوضاءnoiseأي جزء من التسجيل لا يحمل المعلومة التي نقيسها.. عند 128 هرتز، 100 ميلي ثانية حوالي 13 نقطة فقط.
مسارنا في هذا الموقعمن -200 إلى 026 نقطة عند 128 هرتز. نفس القيمة لكل المشاركين ولكل الشروط.

القاعدة: اختر فترة baseline قبل أن ترى النتائج، وطبّقها كما هي على كل المشاركين. تغييرها بعد رؤية الموجة يغيّر نتيجتك.

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

3 فحوص سريعة
  • شغّل أسطر الفحص في آخر السكربت: عدد نقاط baseline يساوي 26، وأكبر متوسط قريب جداً من الصفر (أصغر من 0.001 ميكروفولت).
  • افتح Plot ثم Channel data (scroll): كل epoch يبدأ قرب خط الصفر في كل قناة.
  • عدد الـ epochs لم يتغيّر: Epochs في النافذة الرئيسية ما زالت 80.

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

5 أخطاء، وكيف تتجنّبها
  • كتابة الزمن بالثواني. النافذة تطلب ميلي ثانية. -0.2 0 يعني فترة طولها 0.2 ميلي ثانية، فلا يدخلها إلا نقطة الصفر وحدها، ويصير “التصحيح” طرح قيمة نقطة واحدة.
  • ترك القيمة الافتراضية دون تفكير. الافتراضي هنا كل الثانية قبل المثير. هذا ليس خطأ، لكنه قرار يجب أن تختاره وتذكره في ورقتك.
  • baseline تضم استجابة. إذا كان في فترة baseline حدث آخر (ضغطة زر أو مثير سابق)، فأنت تطرح استجابة حقيقية من كل الـ epoch. في D1 المحاولات بينها 3 ثوانٍ، فالفترة من -200 إلى 0 نظيفة. الاستثناء المحاولة الثانية: فترة -1000 إلى 0 فيها تضم المربع الأول، وهذا سبب آخر لاختيار -200.
  • فرق قبل المثير. إذا كان في فترة baseline فرق بين شرطين (مثلاً موجة بطيئة تبدأ قبل المثير)، فالتصحيح يحوّله إلى فرق معكوس بعد المثير. انظر للموجة كاملة من -200، لا بعد الصفر فقط.
  • التصحيح قبل ICA. التوتوريال الرسمي ينبّه أن تصحيح baseline يضيف إزاحات عشوائية لكل قناة، و ICA لا يتعامل معها جيداً. في مسارنا ICA قبل التقطيع، فلا مشكلة.

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

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

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

Epochs were baseline-corrected by subtracting the mean voltage from -200 to 0 ms before stimulus onset (pop_rmbase, EEGLAB 2026.1).

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

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

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

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

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