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

تشغيل ICA

أساسي15 دقيقةقبل هذا الدرس: فكرة ICA ببساطة، فلترة high-pass و low-passاطبع البطاقة
تبدأ من: eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئة، الاستيفاء (interpolation)، إعادة المرجع (re-referencing)تنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
[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);
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 main', 'gui', 'off');
eeglab redraw;

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

كل قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. تسجّل خليطاً من مصادر: نشاط الدماغ، رمش العينblinkإغلاق العين وفتحها، ويظهر كقمم كبيرة في القنوات الأمامية.، والعضلات، القلبheart (ECG)نبض القلب الكهربائي الذي قد يظهر في EEG كقمم منتظمة.. ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت. (ICA) يفكّ هذا الخليط إلى مصادر منفصلة، اسم كل واحد منها “مكوّن ICA”.

بعد ذلك تحذف مكوّنات آرتفاكتartifactإشارة غير دماغية تختلط بالتسجيل، مثل الرمش أو نشاط العضلات.، أي الإشارات غير الدماغية، وتُبقي الباقي. لا تحذف قناة ولا مقطعاً من التسجيل.

في هذا الدرس تشغّل ICA فقط. التصنيف والحذف في درس ICLabelأداة تصنّف كل مكوّن ICA إلى سبع فئات مع احتمال لكل فئة..

قبل وبعد

تشغيل ICA وحده لا يغيّر إشارتك. الأثر قبل الحذف وبعده تراه في درس ICLabel.

نسختان من نفس البيانات: النسخة الرئيسية بفلتر high-pass 0.1 هرتز، ونسخة ICA بفلتر 1 هرتز. نشغّل ICA على نسخة ICA، ثم ننسخ الأوزان إلى النسخة الرئيسية.
ماذا يعني ما رأيته؟
خرائط فروة الرأس لأول 20 مكوناً من ICA على D1، مرقمة IC 1 إلى IC 20، بألوان EEGLAB الافتراضية.
البيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)

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

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

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

السبب أن الانجراف البطيء يربك ICA، والتوثيق الرسمي يقول إن جودة تفكيكdecompositionتحويل البيانات إلى مجموعة مكوّنات ICA. أعلى بوضوح مع high-passفلتر يمرّر الترددات العالية ويُضعف البطيئة مثل الانجراف. فوق 1 هرتز. لكن فلترfilterأداة تُضعف ترددات معيّنة في الإشارة وتُبقي غيرها. 1 هرتز يشوّه مكوّنات ERP البطيئة مثل P3.

الحل نسختان من نفس البيانات:

  1. نسخة ICA مفلترة عند 1 هرتز، نحسب عليها ICA فقط.
  2. النسخة الرئيسية مفلترة عند 0.1 هرتز، ننسخ لها نتيجة ICA ونكمل عليها التحليل.

نتيجة ICA مجموعة أوزان، أي طريقة ثابتة لخلط القنوات. لذلك يصح تطبيقها على النسخة الرئيسية، كما يوضّح التوثيق الرسمي.

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

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

ابدأ والنسخة الرئيسية مفتوحة كما في “نقطة البداية”. سنسمّيها داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. 1.

أولاً: اصنع نسخة ICA

  1. تأكد أن الداتاست 1 هي الحالية من قائمةmenuمجموعة أوامر تظهر عند الضغط على اسمها في أعلى النافذة. Datasets.
  2. افتح Tools ثم Filter the data ثم Basic FIR filter (new, default).
  3. في Lower edge of the frequency pass band (Hz) اكتب 1، واترك باقي الخانات كما هي، ثم اضغط OK.
  4. سمِّ الداتاست الجديدة D1 ica1hz، واترك Overwrite it in memory (set=yes; unset=create a new dataset) غير مفعّل. صارت عندك الداتاست 2، والداتاست 1 لم تتغيّر.
لماذا 1 هرتز فوق 0.1؟

النسخة الرئيسية مفلترة عند 0.1 هرتز. فلتر 1 هرتز فوقها يعطي تقريباً نفس نتيجة فلترة البيانات الخام عند 1 هرتز، لأن الفلتر الأعلى هو الذي يحدد ما يبقى.

ثانياً: شغّل ICA على نسخة ICA

  1. والداتاست 2 هي الحالية، افتح Tools ثم Decompose data by ICA.
  2. في ICA algorithm to use (click to select) اترك الخيار الأول Extended Infomax (runica.m; default). خانة الخيارات تحته تكون 'extended', 1.
  3. أبقِ Reorder components by variance (if that’s not already the case) مفعّلاً، واترك خانة Use only channel type(s) or indices فارغة، ثم اضغط OK.
  4. قد تظهر نافذة تقول إن رتبة البيانات (rank) أقل من عدد القنوات، وفيها خانة Proposed rank:. قارن رقمها بالرتبة المتوقّعة: عدد القنوات، ناقص القنوات المستوفاة، ناقص 1 للمرجع المتوسط. في D1 هي 31 من 32. إذا اختلف الرقم فاكتب الرقم المتوقّع، ثم اضغط OK.
  5. انتظر. ستطبع نافذة الأوامر خطوات التدريب، وقد يستغرق ذلك من أقل من دقيقة إلى بضع دقائق حسب جهازك.

ثالثاً: اعرض خرائط المكوّنات

  1. افتح Plot ثم Component maps ثم In 2-D واترك الإعدادات الافتراضية.
  2. ابحث عن مكوّن الرمش: خريطة قوية في مقدمة الرأس، متماثلة بين اليمين واليسار. غالباً يكون بين المكوّنات الأولى.

رابعاً: انسخ الأوزان إلى النسخة الرئيسية

  1. ارجع للداتاست 1 من قائمة Datasets.
  2. افتح Edit ثم Dataset info.
  3. بجانب ICA weights array or text/binary file (if any): اضغط from other dataset، واكتب 2 ثم OK. تمتلئ ثلاث خانات تلقائياً: ALLEEG(2).icaweights و ALLEEG(2).icasphere و ALLEEG(2).icachansind.
  4. اضغط OK لإغلاق النافذة.
  5. احفظ النسخة الرئيسية من File ثم Save current dataset as. درس ICLabel يبدأ منها.

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

نفس الخطوات في 22 أسطر MATLAB
MATLAB
% Main dataset (high-pass 0.1 Hz, line noise removed, average reference) is in EEG
EEG_main = EEG;

% ICA copy: same data, high-pass at 1 Hz
EEG_ica = pop_eegfiltnew(EEG_main, 'locutoff', 1);
EEG_ica.setname = 'D1 ica1hz';

% Expected rank: channels - interpolated channels - 1 (average reference)
expectedRank = EEG_ica.nbchan - numel(badChans) - 1;
fprintf('Expected data rank: %d\n', expectedRank);

% Extended Infomax on the ICA copy
EEG_ica = pop_runica(EEG_ica, 'icatype', 'runica', 'extended', 1);
% If "Data rank (N)" is missing or N differs from expectedRank, run instead:
% EEG_ica = pop_runica(EEG_ica, 'icatype', 'runica', 'extended', 1, 'pca', expectedRank);

% Copy the decomposition back to the main dataset
EEG_main.icaweights  = EEG_ica.icaweights;
EEG_main.icasphere   = EEG_ica.icasphere;
EEG_main.icachansind = EEG_ica.icachansind;
EEG_main.icawinv     = [];   % recomputed by eeg_checkset
EEG_main.icaact      = [];
EEG = eeg_checkset(EEG_main);

% Scalp maps of the first 20 components
pop_topoplot(EEG, 0, 1:20);

EEG = pop_saveset(EEG, 'filename', 'D1_main_ica.set', 'filepath', pwd);

في السكربت لا تظهر نافذة الرتبة. pop_runica يحاول اكتشاف الرتبة الناقصة، لكن تقديره قد يفشل. وإذا اكتشفها يطبع سطراً مثل Data rank (31) is smaller than the number of channels (32). قارن هذا الرقم بسطر Expected data rank الذي طبعه السكربت. إذا لم يظهر السطر أو اختلف الرقمان، استخدم السطر المعلَّق الذي يمرّر 'pca' بالقيمة المتوقّعة. وإذا كان في بياناتك قنوات سيئة، مثلاً 32 قناة استوفيت منها 2، فالرتبة المتوقّعة 29.

طريقة النسختين

الشرح المفصّل لطريقة النسختين، ومتى تحتاج 2 هرتز بدل 1، في الدرس التالي: فلتر 1 هرتز قبل ICA ونسخ الأوزان.

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

القيم المناسبة حسب هدف تحليلك
الإعدادالقيمةلماذا
high-pass لنسخة ICA1 هرتز، و2 إذا بقيت المكوّنات غامضةالتوثيق الرسمي: جودة ICA أعلى بوضوح فوق 1 هرتز، وأحياناً 2 (صفحة RunICA).
الخوارزميةExtended Infomax (runica)الخيار الافتراضي في EEGLAB 2026.1، ويستخدمه التوتوريال الرسمي. البدائل مثل AMICA و Picard في درس اختياري.
القنواتكل قنوات EEG. في D1 نُبقي EOG1 و EOG2قناتا العين تسجّلان نفس الرمش الذي نريد عزله، والتوتوريال الرسمي يشغّل ICA على قنوات D1 الـ 32 كلها.
عدد المكوّناتمساوٍ لرتبة البيانات، أي 31 في D1 بعد المرجع المتوسطالمرجع المتوسط ينقص الرتبة بواحد، و ICA لا يعمل جيداً إذا طلب مكوّنات أكثر من الرتبة (صفحة RunICA).

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

5 فحوص سريعة
  1. في نافذة EEGLAB الرئيسية، والداتاست 1 هي الحالية، يجب أن تظهر ICA weights بقيمة Yes.
  2. في نافذة الأوامر اكتب size(EEG.icawinv). في D1 بدون قنوات مستوفاة يظهر 32 31: 32 قناة و31 مكوّناً. كل قناة مستوفاة تنقص عدد المكوّنات بواحد.
  3. افتح خرائط المكوّنات من Plot ثم Component maps ثم In 2-D على الداتاست 1. يجب أن ترى نفس الخرائط التي ظهرت على نسخة ICA، ومنها مكوّن الرمش.
  4. افتح الملف المحفوظ من جديد من File ثم Load existing dataset، وتأكد أن ICA weights ما زالت Yes.
  5. الرتبة مطابقة: رقم Data rank الذي طبعه pop_runica يساوي Expected data rank. في D1 كلاهما 31.

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

5 أخطاء، وكيف تتجنّبها
  • حساب ICA على بيانات 0.1 هرتز، أو إكمال الـ ERP على نسخة 1 هرتز. الأول يعطي تفكيكاً أضعف، والثاني يشوّه P3 و N400. النسختان معاً هما الحل.
  • الاعتماد على التقدير التلقائي للرتبة. pop_runica يحاول اكتشاف الرتبة، لكن تقديره قد يفشل. علامات الرتبة الفائتة: عدة مكوّنات متشابهة جداً أو تشبه الضجيج، أو ICA لا يتقارب. قارن دائماً Data rank المطبوع بالرتبة المتوقّعة (القنوات ناقص المستوفاة ناقص 1). إذا اختلفا، اكتب في خانة الخيارات 'pca', 31 برقمك المتوقّع بدل 31.
  • دخول قنوات غير دماغية بالغلط. استبعد قنوات EOG و ECG حسب هدفك، ولا تتركها تدخل بدون قرار. استخدم خانة Use only channel type(s) or indices لتحديد القنوات. في D1 قرّرنا إبقاء قناتي العين لسبب واضح.
  • توقّع نفس النتيجة في كل مرة. ICA يخلط ترتيب البيانات عشوائياً أثناء التدريب، فيختلف ترتيب المكوّنات وشكلها قليلاً بين تشغيل وآخر. لذلك قد لا يطابق ترتيب مكوّناتك الصورة في هذا الدرس: مكوّن الرمش قد يكون رقم 1 عندنا ورقم 3 عندك. ابحث عن المكوّن بشكله، لا برقمه.
  • تغيير المرجع بعد ICA. الأوزان مرتبطة بالمرجع الذي حُسب عليه ICA. أعد المرجع قبل ICA واتركه بعده. EEGLAB نفسه يحذّرك إذا غيّرته.

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

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

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

Independent component analysis (extended Infomax; Lee et al., 1999) was computed with runica ([31] components after PCA reduction to the data rank) on a copy of the data high-pass filtered at 1 Hz, and the resulting weights were applied to the 0.1 Hz high-pass filtered data.

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

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

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

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

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