المحطة 3 · الدرس 6
الاستيفاء (interpolation)
eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئةتنزيل البيانات (يفتح في نافذة جديدة)سكربت الوصول لهذه الحالة
[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);
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 hp0.1 notch60', 'gui', 'off');
% Bad channels you removed earlier, e.g. {'T7'}; leave empty if none
badChans = {};
if ~isempty(badChans)
EEG = pop_select(EEG, 'rmchannel', badChans);
end
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, 'setname', 'D1 badch', 'gui', 'off');
eeglab redraw;زر الرجوع في متصفحك يعيدك لنفس المكان الذي كنت فيه، فافتح ما تشاء بلا قلق.
الفكرة باختصار
في الدرس السابق حذفت قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. السيئة. الآن تعيد بناءها الاستيفاءinterpolationتقدير إشارة قناة محذوفة من القنوات المحيطة بها. (interpolation): يحسب EEGLAB قيمة كل قناة محذوفة من القنوات المحيطة بها، حسب مواقع قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة. على الرأس. وفي D1 لا قناة سيئةbad channelقناة إشارتها مسطّحة أو مليئة بالضوضاء طوال التسجيل تقريباً.، فتتدرّب على نسخة مؤقتة لا تحفظها.
لماذا لا تكمل بدونها؟ لثلاثة أسباب:
قبل وبعد


اسحب الخط لتقارن.
أسئلتك بعد هذا، كل جواب في قسمه:
لماذا أحتاج هذه الخطوة؟
السبب بالتفصيل، والمصطلحات التي تحتاجها
- المرجع المتوسطaverage referenceمرجع يساوي متوسط كل قنوات الرأس. يحتاج قنوات موزّعة على الرأس كله. قناة ناقصة في جهة تجعل المتوسط مائلاً نحو الجهة الأخرى.
- المقارنة بين مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. تحتاج نفس القنوات عند الجميع.
- خرائط الرأس ترسم فراغاً مكان القناة الناقصة.
لكن للاستيفاء ثمن. القناة المستوفاة خليط من القنوات الأخرى، فلا تضيف معلومة جديدة. لذلك تنقص كل قناة مستوفاة رتبة البياناتrankعدد القنوات المستقلة فعلاً في البيانات، ويقل بعد الاستيفاء أو المرجع المتوسط. (rank) بواحد. ستحتاج هذه المعلومة في درس ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت..
لماذا أحتاج هذه الخطوة؟
- المرجع المتوسط يحتاج قنوات موزّعة على الرأس كله. قناة ناقصة في جهة تجعل المتوسط مائلاً نحو الجهة الأخرى.
- المقارنة بين المشاركين تحتاج نفس القنوات عند الجميع.
- خرائط الرأس ترسم فراغاً مكان القناة الناقصة.
لكن للاستيفاء ثمن. القناة المستوفاة خليط من القنوات الأخرى، فلا تضيف معلومة جديدة. لذلك تنقص كل قناة مستوفاة رتبة البيانات (rank) بواحد. ستحتاج هذه المعلومة في درس ICA.
كيف أطبّقها في EEGLAB؟
12 خطوة من القوائم
ابدأ من “نقطة البداية”. سكربتها يضع داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. التي قبل حذف القنوات، أي D1 hp0.1 notch60، في الداتاست 1، والنسخة الرئيسية D1 badch في الداتاست 2. ستحتاج رقم الداتاست 1 مع بياناتك، لأن مواقع كل القنوات محفوظة فيها.
أولاً: تمرين على قناة سليمة
- والداتاست
D1 badchهي الحالية، افتح Edit ثم Select data. اكتبC3في خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. Channel(s)، وفعّل المربع تحت on->remove these، ثم اضغط OK. - سمِّ الداتاست الجديدة
D1 noC3. في النافذة الرئيسية صار Channels per frame يساوي 31. - افتح Tools ثم Interpolate electrodes. تظهر نافذة بعنوان Interpolate channel(s) — pop_interp().
- اضغط Use all channels from other dataset، واكتب
2، أي رقم الداتاستD1 badch، في خانة Dataset index، ثم OK. يظهر اسمC3تحت What channel(s) do you want to interpolate. - في Interpolation method اترك Spherical، واترك Time range [min max] (s) فارغة، ثم اضغط OK.
- تطبع نافذة الأوامر
Interpolating 1 channels.... سمِّ الداتاستD1 C3 back. صار عدد القنوات 32 من جديد. - قارن
C3فيD1 badchوفيD1 C3 backمن Plot ثم Channel data (scroll). الإشارتان متشابهتان جداً. - هذه نسخ تمرين، فلا تحفظها. ارجع إلى
D1 badch.
ثانياً: الاستيفاء على بياناتك
- والداتاست التي حذفت منها القنوات السيئة هي الحالية، افتح Tools ثم Interpolate electrodes.
- اضغط Use all channels from other dataset، واكتب رقم الداتاست التي قبل الحذف. تظهر أسماء القنوات المحذوفة.
- اترك Spherical، واضغط OK. سمِّ الناتج
D1 interpواحفظه. - في D1 لم تُحذف قناة، فإذا جرّبت يقول EEGLAB
No new channels selected. النسخة الرئيسية تبقىD1 badch، ودرس إعادة المرجعre-referencingتغيير المرجع بعد التسجيل بحساب الجهد بالنسبة لمرجع جديد. يبدأ منها.
كيف أطبّقها في EEGLAB؟
ابدأ من “نقطة البداية”. سكربتها يضع الداتاست التي قبل حذف القنوات، أي D1 hp0.1 notch60، في الداتاست 1، والنسخة الرئيسية D1 badch في الداتاست 2. ستحتاج رقم الداتاست 1 مع بياناتك، لأن مواقع كل القنوات محفوظة فيها.
أولاً: تمرين على قناة سليمة
- والداتاست
D1 badchهي الحالية، افتح Edit ثم Select data. اكتبC3في خانة Channel(s)، وفعّل المربع تحت on->remove these، ثم اضغط OK. - سمِّ الداتاست الجديدة
D1 noC3. في النافذة الرئيسية صار Channels per frame يساوي 31. - افتح Tools ثم Interpolate electrodes. تظهر نافذة بعنوان Interpolate channel(s) — pop_interp().
- اضغط Use all channels from other dataset، واكتب
2، أي رقم الداتاستD1 badch، في خانة Dataset index، ثم OK. يظهر اسمC3تحت What channel(s) do you want to interpolate. - في Interpolation method اترك Spherical، واترك Time range [min max] (s) فارغة، ثم اضغط OK.
- تطبع نافذة الأوامر
Interpolating 1 channels.... سمِّ الداتاستD1 C3 back. صار عدد القنوات 32 من جديد. - قارن
C3فيD1 badchوفيD1 C3 backمن Plot ثم Channel data (scroll). الإشارتان متشابهتان جداً. - هذه نسخ تمرين، فلا تحفظها. ارجع إلى
D1 badch.
ثانياً: الاستيفاء على بياناتك
- والداتاست التي حذفت منها القنوات السيئة هي الحالية، افتح Tools ثم Interpolate electrodes.
- اضغط Use all channels from other dataset، واكتب رقم الداتاست التي قبل الحذف. تظهر أسماء القنوات المحذوفة.
- اترك Spherical، واضغط OK. سمِّ الناتج
D1 interpواحفظه. - في D1 لم تُحذف قناة، فإذا جرّبت يقول EEGLAB
No new channels selected. النسخة الرئيسية تبقىD1 badch، ودرس إعادة المرجع يبدأ منها.
كيف أكتبها بالكود؟
نفس الخطوات في 15 أسطر MATLAB
% Rebuild the removed channels from the full channel list (fullLocs)
if ~isempty(badChans)
EEG = pop_interp(EEG, fullLocs, 'spherical');
end
EEG.setname = 'D1 interp';
fprintf('Channels after interpolation: %d\n', EEG.nbchan);
EEG = pop_saveset(EEG, 'filename', 'D1_interp.set', 'filepath', pwd);
% Exercise: remove a good channel, rebuild it, compare with the original
testChan = 'C3';
EEG_drop = pop_select(EEG, 'rmchannel', {testChan});
EEG_back = pop_interp(EEG_drop, fullLocs, 'spherical');
iOrig = find(strcmp({EEG.chanlocs.labels}, testChan));
iBack = find(strcmp({EEG_back.chanlocs.labels}, testChan));
r = corrcoef(double(EEG.data(iOrig, :)), double(EEG_back.data(iBack, :)));
fprintf('Correlation between original and interpolated %s: %.2f\n', testChan, r(1, 2));المتغيّر fullLocs من سكربت نقطة البداية: نسخة من مواقع كل القنوات قبل أي حذف. احفظها دائماً في بداية المعالجة.
كيف أكتبها بالكود؟
% Rebuild the removed channels from the full channel list (fullLocs)
if ~isempty(badChans)
EEG = pop_interp(EEG, fullLocs, 'spherical');
end
EEG.setname = 'D1 interp';
fprintf('Channels after interpolation: %d\n', EEG.nbchan);
EEG = pop_saveset(EEG, 'filename', 'D1_interp.set', 'filepath', pwd);
% Exercise: remove a good channel, rebuild it, compare with the original
testChan = 'C3';
EEG_drop = pop_select(EEG, 'rmchannel', {testChan});
EEG_back = pop_interp(EEG_drop, fullLocs, 'spherical');
iOrig = find(strcmp({EEG.chanlocs.labels}, testChan));
iBack = find(strcmp({EEG_back.chanlocs.labels}, testChan));
r = corrcoef(double(EEG.data(iOrig, :)), double(EEG_back.data(iBack, :)));
fprintf('Correlation between original and interpolated %s: %.2f\n', testChan, r(1, 2));المتغيّر fullLocs من سكربت نقطة البداية: نسخة من مواقع كل القنوات قبل أي حذف. احفظها دائماً في بداية المعالجة.
أي قيمة أختار؟
القيم المناسبة حسب هدف تحليلك
| الإعداد | القيمة | لماذا |
|---|---|---|
| طريقة الاستيفاء | Spherical | الخيار الأول في النافذة، وهو الافتراضي في pop_interp. يستخدم مواقع الأقطاب على سطح الرأس. |
| مصدر المواقع | كل القنوات من الداتاست التي قبل الحذف، أو fullLocs في السكربت | هكذا يعرف EEGLAB أسماء القنوات الناقصة ومواقعها، ويعيدها بترتيبها الأصلي. |
| مكان الخطوة | بعد حذف القنوات السيئة، وقبل إعادة المرجع | المرجع المتوسط يحتاج كل القنوات. |
| عدد القنوات المستوفاة | قليل | كل قناة مستوفاة تنقص رتبة البيانات بواحد، ولا تضيف معلومة جديدة. |
| Interpolate removed channel(s) في نافذة إعادة المرجع | ليس في مسارنا | يستوفي ويعيد المرجع في خطوة واحدة. نحن نفصل الخطوتين حتى تتحقق من كل واحدة. |
أي قيمة أختار؟
| الإعداد | القيمة | لماذا |
|---|---|---|
| طريقة الاستيفاء | Spherical | الخيار الأول في النافذة، وهو الافتراضي في pop_interp. يستخدم مواقع الأقطاب على سطح الرأس. |
| مصدر المواقع | كل القنوات من الداتاست التي قبل الحذف، أو fullLocs في السكربت | هكذا يعرف EEGLAB أسماء القنوات الناقصة ومواقعها، ويعيدها بترتيبها الأصلي. |
| مكان الخطوة | بعد حذف القنوات السيئة، وقبل إعادة المرجع | المرجع المتوسط يحتاج كل القنوات. |
| عدد القنوات المستوفاة | قليل | كل قناة مستوفاة تنقص رتبة البيانات بواحد، ولا تضيف معلومة جديدة. |
| Interpolate removed channel(s) في نافذة إعادة المرجع | ليس في مسارنا | يستوفي ويعيد المرجع في خطوة واحدة. نحن نفصل الخطوتين حتى تتحقق من كل واحدة. |
كيف أتأكد أنها نجحت؟
4 فحوص سريعة
- عدد القنوات رجع كاملاً: Channels per frame في النافذة الرئيسية يساوي العدد الأصلي. في D1 يساوي 32.
- نفس الترتيب: في Plot ثم Channel locations ثم By name تظهر القنوات المستوفاة في أماكنها.
- التمرين: السكربت يطبع ارتباطاً قريباً من 0.98 بين
C3الأصلية والمستوفاة. - الإشارة منطقية: في Plot ثم Channel data (scroll) تشبه القناة المستوفاة جاراتها، بلا خط مسطّح ولا قفزات.
كيف أتأكد أنها نجحت؟
- عدد القنوات رجع كاملاً: Channels per frame في النافذة الرئيسية يساوي العدد الأصلي. في D1 يساوي 32.
- نفس الترتيب: في Plot ثم Channel locations ثم By name تظهر القنوات المستوفاة في أماكنها.
- التمرين: السكربت يطبع ارتباطاً قريباً من 0.98 بين
C3الأصلية والمستوفاة. - الإشارة منطقية: في Plot ثم Channel data (scroll) تشبه القناة المستوفاة جاراتها، بلا خط مسطّح ولا قفزات.
ما الأخطاء التي يقع فيها كثيرون؟
4 أخطاء، وكيف تتجنّبها
- إعادة المرجع قبل الاستيفاء. المرجع المتوسط على قنوات ناقصة يميل نحو الجهة التي فيها قنوات أكثر. استوفِ أولاً، ثم أعد المرجع.
- فقدان المواقع الأصلية. بعد حذف القناة لا يعرف EEGLAB أين كانت إلا من داتاست سابقة أو من
fullLocs. احفظ المواقع قبل أي حذف. - نسيان أن الرتبة نقصت. إذا استوفيت قناتين، فرتبة البيانات أقل من عدد القنوات باثنين، وبعد المرجع المتوسط بثلاثة: 32 قناة تعطي رتبة 29. اكتب هذا الرقم وقارنه بما يطبعه
pop_runicaعند تشغيل ICA. - الثقة الزائدة بالقنوات الطرفية. القناة على حافة الشبكة، مثل
T7، لها جيران من جهة واحدة فقط، فاستيفاؤها أقل دقة من قناة في الوسط مثلC3.
ما الأخطاء التي يقع فيها كثيرون؟
- إعادة المرجع قبل الاستيفاء. المرجع المتوسط على قنوات ناقصة يميل نحو الجهة التي فيها قنوات أكثر. استوفِ أولاً، ثم أعد المرجع.
- فقدان المواقع الأصلية. بعد حذف القناة لا يعرف EEGLAB أين كانت إلا من داتاست سابقة أو من
fullLocs. احفظ المواقع قبل أي حذف. - نسيان أن الرتبة نقصت. إذا استوفيت قناتين، فرتبة البيانات أقل من عدد القنوات باثنين، وبعد المرجع المتوسط بثلاثة: 32 قناة تعطي رتبة 29. اكتب هذا الرقم وقارنه بما يطبعه
pop_runicaعند تشغيل ICA. - الثقة الزائدة بالقنوات الطرفية. القناة على حافة الشبكة، مثل
T7، لها جيران من جهة واحدة فقط، فاستيفاؤها أقل دقة من قناة في الوسط مثلC3.
متصفحك لا يسمح بحفظ التقدّم. كل الدروس متاحة، لكن علامات الإكمال لن تُحفظ.
تم. حُفظ تقدّمك في هذا المتصفح.تراجعكيف أكتبها في ورقتي؟
قالب Methods: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته
قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.
Removed channels were interpolated using spherical spline interpolation (pop_interp, EEGLAB 2026.1).كيف أكتبها في ورقتي؟
قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.
Removed channels were interpolated using spherical spline interpolation (pop_interp, EEGLAB 2026.1).أين أقرأ أكثر؟
3 مراجع: التوثيق الرسمي أولاً
- EEGLAB TutorialتوثيقIssues with data rank deficiencies
- Makoto's preprocessing pipeline§7 Interpolate all the removed channels؛ §7.2
- Luck, Applied Event-Related Potential Data Analysis (الطبعة الأولى)الفصل 7: Inspecting the EEG and Interpolating Bad Channels
مكتوب لـ EEGLAB 2026.1 · 2026-10-29
للتوسّع
- EEGLAB Tutorial: https://eeglab.org/tutorials/06_RejectArtifacts/RunICA.html (Issues with data rank deficiencies)
- Makoto's preprocessing pipeline: https://eeglab.ucsd.edu/wiki/Makoto%27s_preprocessing_pipeline (§7 Interpolate all the removed channels؛ §7.2)
- Luck, Applied Event-Related Potential Data Analysis (الطبعة الأولى): https://socialsci.libretexts.org/Bookshelves/Psychology/Biological_Psychology/Applied_Event-Related_Potential_Data_Analysis_(Luck) (الفصل 7: Inspecting the EEG and Interpolating Bad Channels)
تحتاج مساعدة؟
اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ
- بلّغ عن خطأ علمي · يحتاج حساباً على GitHub. لا تملك حساباً؟ استخدم "شاركنا رأيك".