المحطة 9 · الدرس 4

البايبلاينات الجاهزة: متى تستخدمها

اختياري15 دقيقةقبل هذا الدرس: معالجة دفعات (batch)اطبع البطاقة
تبدأ من: eeglab_data.set (D1) · لا شيء: البيانات كما نزّلتها.تنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
eeglabRoot = fileparts(which('eeglab'));
EEG = pop_loadset('eeglab_data.set', fullfile(eeglabRoot, 'sample_data'));

% Show the dataset in the main EEGLAB window
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 raw', 'gui', 'off');
eeglab redraw;

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

في المحطات 3 إلى 5 بنيت بيدك بايبلاينpipelineسلسلة خطوات المعالجة بترتيب ثابت من البيانات الخام إلى النتيجة. المعالجة المسبقةpreprocessingتنظيف البيانات وتجهيزها قبل التحليل.: فلترةfilteringتطبيق فلتر على البيانات.، ضوضاء الكهرباءline noiseتداخل من شبكة الكهرباء عند 60 هرتز في السعودية أو 50 هرتز في بلدان أخرى.، قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. السيئة، المرجعreferenceالنقطة التي يُقاس جهد كل قناة بالنسبة لها.، و ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت.، ثم التقطيع. كل مختبر يكرّر هذه الخطوات، لذلك جمعتها عدة مجموعات بحثية في بايبلاينات جاهزة تعمل على كل مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. بلا تدخّل منك.

قبل وبعد

طيفان متجاوران من 1 إلى 64 هرتز. اليسار البيانات الخام: قمة ألفا عند 10 هرتز وقمة حادة عند 60 هرتز. اليمين بعد PREP: قمة 60 هرتز ما زالت موجودة لكنها أصغر، وقمة ألفا بقي شكلها.
يسار: الخام. يمين: بعد PREP (PrepPipeline 0.57.0)البيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)

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

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

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

هذه البايبلاينات توفّر وقتاً كبيراً، خصوصاً مع البيانات الكبيرة. لكن كل واحد منها يتّخذ عشرات القرارات بدلاً منك: أي قناة سيئةbad channelقناة إشارتها مسطّحة أو مليئة بالضوضاء طوال التسجيل تقريباً.، وأي مكوّن عين، وأي مقطع يُحذف. إذا لم تعرف هذه القرارات، فلن تستطيع الدفاع عنها في ورقتك، ولن تنتبه إذا أخطأت.

البايبلاين الجاهز يختصر الوقت، لكنه لا يعفيك من فهم كل خطوة فيه.

لهذا يأتي هذا الدرس بعد أن بنيت البايبلاين بنفسك. فيه تقارن البايبلاينات الستة الشائعة، ثم تشغّل واحداً منها (PREP) على D1 وتتحقق من مخرجاته كما تتحقق من أي بايبلاين.

ستة بايبلاينات في جدول واحد

كلها أدوات منفصلة، غير مرفقة مع EEGLAB. الإصدارات كما كانت عند كتابة الدرس.

البايبلاينصُمّم لـماذا يفعل باختصاركيف تشغّله
PREP (PrepPipeline 0.57.0)أي EEGتسجيل النشاط الكهربائي للدماغ من أقطاب على فروة الرأس.، خصوصاً البيانات الكبيرةالمرحلة الأولى فقط: تخفيف ضوضاءnoiseأي جزء من التسجيل لا يحمل المعلومة التي نقيسها. الكهرباء، ومرجع متوسط متين (robust)، وكشف القنوات السيئة واستيفاؤها. لا يشغّل ICA.pluginحزمة تضيف وظائف أو قوائم جديدة إلى EEGLAB. EEGLAB: Tools ثم Run PREP pipeline
HAPPE (v4)بيانات الرضّع والأطفال، والتسجيلات بقنوات قليلةبايبلاين كامل حتى epochs نظيفة، مع جدول جودة لكل ملفسكربتات MATLAB تستخدم EEGLAB، تشغّلها من مجلد HAPPE
MADE (v1.0)بيانات الرضّع والأطفالبايبلاين كامل مع كشف آلي للقنوات السيئة ومكوّنات التشويشسكربت MATLAB واحد تعدّله وتشغّله
RELAX (2.0.1)بيانات البالغين، للـ ERP والذبذباتينظّف تشويش العين والعضلات بعدة طرق معاً (MWF و wICA و ICLabel)إضافة EEGLAB، تحتاج إضافات أخرى يذكرها دليلها
BeMoBIL (2.0.0)EEG أثناء الحركة (mobile EEG) مع بيانات الحركةالاستيراد والتنظيف و AMICA والتحليل، وكل الإعدادات في ملف واحدإضافة EEGLAB وسكربتات
Automagicالبيانات الكبيرة لمن لا يريد البرمجةيشغّل عدة خطوات (منها PREP)، ثم يقيّم جودة كل ملفواجهته الخاصة من قائمة Automagic في EEGLAB

أياً كان البايبلاين الذي تختاره، تحقق من ثلاثة أشياء في مخرجاته قبل أن تكمل:

  1. القنوات: كم قناة حُذفت أو استُوفيت، وأيها؟ قارنها بما تراه في Plot ثم Channel data (scroll).
  2. الطيف: قارن الطيف قبل وبعد. يجب أن تصغر قمة الكهرباء بوضوح، وألّا ينهار باقي الطيف.
  3. التقرير: اقرأ تقرير البايبلاين لكل مشارك. المشارك الذي حُذف منه عدد كبير من القنوات أو المكوّنات يحتاج نظرة، أو استبعاداً.

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

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

أولاً: ثبّت PREP

  1. افتح File ثم Manage EEGLAB extensions، وابحث عن PrepPipeline، وثبّته (آخر إصدار عند كتابة الدرس 0.57.0). أعد تشغيل eeglab، فيظهر البند Run PREP pipeline في قائمة Tools.

ثانياً: انظر إلى البيانات قبل

  1. ابدأ من D1 raw كما في “نقطة البداية”. هذه البيانات كما نزّلتها، بلا فلترة.
  2. افتح Plot ثم Channel spectra and maps واترك القيم الافتراضية. لاحظ القمة الحادة عند 60 هرتز، كما في درس ضوضاء الكهرباء.

ثالثاً: شغّل PREP

  1. افتح Tools ثم Run PREP pipeline. تفتح نافذة PREP pipeline control panel وفيها ستة أزرار، زر لكل مرحلة.
  2. اضغط Reference. في Reference channels و Evaluation channels و Re-referenced channels اكتب [1 3:5 7:32]، أي كل القنوات ما عدا EOG1 (القناة 2) و EOG2 (القناة 6). اضغط Ok.
  3. اضغط Line noise وتأكد أن Line frequencies removed فيها 60. يحسبها PREP من معدل العيّنات: مضاعفات 60 تحت Nyquist، وهو 64 هرتز في D1. اضغط Ok.
  4. اضغط Ok في لوحة التحكم. يطبع PREP كل مرحلة في نافذة الأوامر، ويأخذ حوالي دقيقة على D1. عندما ينتهي يكتب ملف ملخّص (.html) وتقريراً مفصّلاً (.pdf) في مجلد العمل، ويطلب منك اسماً للداتاست الجديدة. سمِّها D1 prep.

رابعاً: تحقق من المخرجات

  1. افتح ملف الملخّص .html في المتصفح. ابحث عن قائمة القنوات المستوفاة، وقائمة القنوات التي بقيت مشوّشة بعد المرجع.
  2. افتح Plot ثم Channel spectra and maps مرة أخرى على D1 prep. قمة 60 هرتز أصغر لكنها ما زالت موجودة، وتظهر بوضوح في قنوات قليلة. خطوة ضوضاء الكهرباء في PREP تخفّف القمة ولا تزيلها تماماً. إذا كانت القمة الباقية تؤثّر في تحليلك، أضف فلتر band-stop من درس ضوضاء الكهرباء بعد PREP.
  3. قارن بنتيجتك في درس القنوات السيئة: هناك لم يحذف clean_rawdata أي قناة من D1. إذا استوفى PREP قناة، فافتح Plot ثم Channel data (scroll) وانظر إليها بنفسك قبل أن تقبل القرار.

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

نفس الخطوات في 35 أسطر MATLAB

يكمل من “نقطة البداية”. دالة PREP نفسها prepPipeline هي أوضح طريقة لاستدعائه من سكربت، كما في المثال المرفق مع الإضافة. السكربت لا يكتب التقرير، بل يطبع النتائج مباشرة.

MATLAB
% PREP is not bundled with EEGLAB: install it from the extension manager
plugin_askinstall('PrepPipeline', 'prepPipeline', true);

% Keep a copy of the raw data to compare spectra
EEG_raw = EEG;

% Scalp channels only; EOG is cleaned of line noise but not referenced
eegChans = find(~ismember({EEG.chanlocs.labels}, {'EOG1', 'EOG2'}));

params = struct();
params.name = 'D1';
params.lineFrequencies = 60;
params.detrendChannels = 1:EEG.nbchan;
params.lineNoiseChannels = 1:EEG.nbchan;
params.referenceChannels = eegChans;
params.evaluationChannels = eegChans;
params.rereferencedChannels = eegChans;

% Line noise reduction, robust reference, bad channel interpolation
[EEG, params] = prepPipeline(EEG, params);
EEG.setname = 'D1 prep';

% What did PREP decide?
nd = EEG.etc.noiseDetection;
if ~strcmp(nd.errors.status, 'good')
    error('PREP stopped with status: %s', nd.errors.status);
end
fprintf('PREP version: %s\n', nd.version);
fprintf('Interpolated channels: %s\n', ...
    strjoin({EEG.chanlocs(nd.interpolatedChannelNumbers).labels}, ', '));
fprintf('Still noisy after reference: %s\n', ...
    strjoin({EEG.chanlocs(nd.stillNoisyChannelNumbers).labels}, ', '));

% Spectrum before and after
figure; pop_spectopo(EEG_raw, 1, [], 'EEG', 'freqrange', [1 64], 'freq', [10 60]);
figure; pop_spectopo(EEG, 1, [], 'EEG', 'freqrange', [1 64], 'freq', [10 60]);

% PREP leaves the data unfiltered: high-pass before ICA or epochs
EEG = pop_eegfiltnew(EEG, 'locutoff', 0.1);

EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 prep', 'gui', 'off');
eeglab redraw;

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

القيم المناسبة حسب هدف تحليلك
الإعدادالقيمة في الدرسلماذا
قنوات المرجع والتقييمقنوات الرأس فقطقنوات EOG فيها رمش كبير. إذا دخلت في المرجع أو في اختبارات القنوات السيئة، أفسدتهما.
ترددات الكهرباء60سُجّلت D1 بكهرباء 60 هرتز. للبيانات المسجّلة بكهرباء 50 هرتز، القيمة الافتراضية في PREP خاطئة: اكتب [50 100 150 200] حتى ما تحت Nyquist.
نوع المرجعrobust (الافتراضي)يجد PREP القنوات السيئة، ويحسب المرجع المتوسط بدونها، ويكرّر حتى تستقر النتيجة.
الاستيفاءpost-reference (الافتراضي)القنوات السيئة تُستوفى بعد حساب المرجع وتبقى في البيانات، فلا يتغيّر عدد القنوات.
إبقاء الفلترة (Keep filtered)لا (الافتراضي)يفلتر PREP نسخة بـ high-pass عند 1 هرتز لاختباراته فقط. المخرجات تبقى بلا فلترة، فيبقى اختيار الفلتر لك.

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

4 فحوص سريعة
  • نافذة الأوامر تطبع PREP version: PrepPipeline0.57.0.
  • قائمة القنوات المستوفاة تُطبع، حتى لو كانت فارغة. قارنها بما وجدته في درس القنوات السيئة.
  • قمة 60 هرتز في D1 prep أصغر بوضوح منها في الطيف الخام (أعلى من جيرانها بحوالي 11 dB بدل حوالي 23 dB)، وقمة ألفا عند 10 هرتز بقي شكلها.
  • عدد قنوات D1 prep ما زال 32.

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

6 أخطاء، وكيف تتجنّبها
  • الثقة بالبايبلاين بلا فتح تقريره. كل بايبلاين يخطئ مع بعض المشاركين. اقرأ التقرير لكل مشارك، وانظر إلى بيانات أي مشارك حُذفت منه قنوات كثيرة.
  • ترك تردد الكهرباء على الافتراضي في بيانات 50 هرتز. يحسب PREP مضاعفات 60 افتراضياً. في بيانات مسجّلة بكهرباء 50 هرتز، يعمل على التردد الخطأ ويترك القمة الحقيقية.
  • توقّع أن يزيل PREP قمة الكهرباء تماماً. في D1 تنخفض قمة 60 هرتز إلى نصفها تقريباً بالـ dB وتبقى ظاهرة. انظر إلى الطيف بعد PREP، وأضف فلتر band-stop إذا احتجت أن تختفي القمة.
  • افتراض أن PREP فلتر البيانات. مخرجات PREP بلا high-pass. إذا ذهبت مباشرة إلى ICA أو التقطيع، فالانجراف البطيء ما زال موجوداً.
  • تغيير البايبلاين بين المشاركين. كل مشارك في الدراسة الواحدة يمرّ بنفس البايبلاين وبنفس الإعدادات. إذا غيّرت إعداداً، أعد تشغيل الجميع.
  • تطبيق بايبلاين خارج الفئة التي صُمّم لها. HAPPE و MADE صُمّما للأطفال، و BeMoBIL للحركة. قد لا تناسب إعداداتها بيانات بالغين مسجّلة في الراحة، والعكس.

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

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

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

Line noise at 60 Hz was attenuated, and robust average referencing with bad channel detection and interpolation was performed, with the PREP pipeline (prepPipeline, PrepPipeline plugin [0.57.0], EEGLAB 2026.1), using the scalp channels as reference and evaluation channels; [n] channels were interpolated.

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

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

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

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

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