المحطة 1 · الدرس 6

دمج الداتاست وتقسيمها

مهم12 دقيقةقبل هذا الدرس: ALLEEG وإدارة الداتاستاطبع البطاقة
تبدأ من: eeglab_data.set (D1) · لا شيء: البيانات كما نزّلتها.تنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
sampleFolder = fullfile(fileparts(which('eeglab')), 'sample_data');
EEG = pop_loadset('filename', 'eeglab_data.set', 'filepath', sampleFolder);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'Continuous EEG Data', 'gui', 'off');
eeglab redraw;

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

كثير من التجارب تُسجَّل على عدة أجزاء (runs) لنفس مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة.، مع استراحة بينها. لتحلّلها معاً، تدمجها في داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. (dataset) واحدة. وأحياناً تحتاج العكس: جزءاً واحداً فقط من التسجيل. لكن كيف يعرف EEGLAB أن إشارةsignalقيم تتغيّر مع الزمن، مثل الجهد المسجّل في قناة. انقطعت عند نقطة الوصل؟

قبل وبعد

شريط زمني باهت لـ D1 كله، ومنه مقص وسهم مكتوب عليه Select data إلى شريطين: D1 part 1 من 0 إلى 120 ثانية (15361 عيّنة) و D1 part 2 من 120 إلى 238.3 ثانية (15143 عيّنة)، وبينهما فراغ صغير. ثم سهم Append datasets إلى شريط واحد D1 merged (30504 عيّنات)، وعند نقطة الوصل خط عمودي أحمر سميك مكتوب عليه boundary.

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

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

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

الجواب حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير. (event) خاص اسمه boundary. يضعه EEGLAB تلقائياً عند كل نقطة وصل أو قصّ، فلترةfilteringتطبيق فلتر على البيانات. والتقطيع لاحقاً تحترمه. حتى لا تحتاج بيانات جديدة، نتدرّب على eeglab_data.set: نقسمها إلى جزأين، ثم ندمجهما من جديد، ونرى أين يظهر الحدث boundary.

في التجارب الحقيقية، كثيراً ما يُسجَّل كل مشارك على عدة runs. مثلاً، النسخة الخام من بيانات المحطة 8 على OpenNeuro (ds002680) فيها لكل مشارك جلستان، في كل منهما 12 أو 13 run. أما النسخة الجاهزة التي نستعملها في المحطة 8 فمحضّرة مسبقاً، بملف لكل حالة.

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

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

1. قُصّ الجزء الأول

  1. و eeglab_data.set مفتوحة كداتاست 1، افتح Edit ثم Select data.
  2. في صف Time range [min max] (s) اكتب 0 120. اترك خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. تحت on->remove these في نفس الصف غير مفعّلة.
  3. اضغط OK. في نافذة What do you want to do with the new dataset?، اكتب في Name it: الاسم D1 part 1، ثم OK.
  4. السطر الأول في النافذة الرئيسية الآن #2: D1 part 1، و Frames per epoch يعرض 15361.

2. قُصّ الجزء الثاني

  1. من قائمةmenuمجموعة أوامر تظهر عند الضغط على اسمها في أعلى النافذة. Datasets اختر Dataset 1:Continuous EEG Data. نقصّ دائماً من الأصل، لا من الجزء الأول.
  2. افتح Edit ثم Select data من جديد.
  3. اكتب نفس المدى 0 120 في Time range [min max] (s)، وفعّل هذه المرة الخانة تحت on->remove these. الآن يحذف EEGLAB أول 120 ثانية ويُبقي الباقي.
  4. اضغط OK، وسمِّ الداتاست الجديدة D1 part 2.
  5. النافذة الرئيسية تعرض #3: D1 part 2، و 15143 عيّنةsampleقيمة واحدة للإشارة في لحظة زمنية واحدة..

استخدام نفس المدى مع الخانة وبدونها يضمن أن الجزأين لا يتداخلان ولا تضيع بينهما أي عيّنة.

3. ادمج الجزأين

  1. افتح Edit ثم Append datasets.
  2. في Dataset indices to merge اكتب 2 3. الترتيب مهم: الداتاست الأولى تأتي أولاً في الزمن.
  3. اترك Preserve ICA weights of the first dataset ? غير مفعّلة، واضغط OK.
  4. يقترح EEGLAB الاسم Merged datasets. غيّره إلى D1 merged، ثم OK.
  5. النافذة الرئيسية تعرض #4: D1 merged: 30504 عيّنة كالأصل، و Events يعرض 155 بدل 154.

قد يطبع الـ Command Window السطر Warning: duplicate boundary event removed. هذا طبيعي: كل جزء كان يحمل حدث boundary عند طرف القصّ، و EEGLAB يُبقي واحداً فقط عند نقطة الوصل.

4. اعثر على نقطة الوصل

  1. و D1 merged هي الحالية، افتح Plot ثم Channel data (scroll).
  2. في الخانة بين السهمين في أسفل النافذة اكتب 118، واضغط Enter.
  3. عند 120 ثانية ترى خطاً أحمر سميكاً مكتوباً عليه boundary. هذا هو الحدث الإضافي: رقم 155.

5. اختر البيانات حول حدث واحد

  1. ارجع إلى Dataset 1:Continuous EEG Data من قائمة Datasets.
  2. افتح Edit ثم Select data using events. تفتح نافذة Remove data portions around events - pop_rmdat().
  3. في Event type(s) ([]=all) اكتب square.
  4. في Time limits [start, end] in sec. اكتب -0.5 1، أي من نصف ثانية قبل كل حدث square إلى ثانية بعده.
  5. اترك القائمة على Keep selected، واضغط OK. سمِّ الداتاست D1 around square.
  6. بقي 15336 عيّنة (حوالي 120 ثانية)، و Events يعرض 234: الأحداث الأصلية الـ154 كلها، و 80 حدث boundary، واحد عند كل جزء محذوف.

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

نفس الخطوات في 29 أسطر MATLAB
MATLAB
% Start EEGLAB and load the sample dataset as dataset 1
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
sampleFolder = fullfile(fileparts(which('eeglab')), 'sample_data');
EEG = pop_loadset('filename', 'eeglab_data.set', 'filepath', sampleFolder);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, ...
    'setname', 'Continuous EEG Data', 'gui', 'off');

% Part 1: keep the first 120 seconds (dataset 2)
EEG = pop_select(ALLEEG(1), 'time', [0 120]);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, ...
    'setname', 'D1 part 1', 'gui', 'off');

% Part 2: remove the same 120 seconds and keep the rest (dataset 3)
EEG = pop_select(ALLEEG(1), 'rmtime', [0 120]);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, ...
    'setname', 'D1 part 2', 'gui', 'off');

% Append datasets 2 and 3 (dataset 4)
EEG = pop_mergeset(ALLEEG, [2 3], 0);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, ...
    'setname', 'D1 merged', 'gui', 'off');

[ALLEEG.pnts]                                  % 30504 15361 15143 30504
isequal(ALLEEG(4).data, ALLEEG(1).data)        % 1: same signal as the original
eeg_eventtypes(EEG)                            % square 80, rt 74, boundary 1
EEG.event(eeg_findboundaries(EEG)).latency     % 15361.5: between samples 15361 and 15362

% Keep only the data from -0.5 to 1 s around each square event (dataset 5)
EEG = pop_rmdat(ALLEEG(1), {'square'}, [-0.5 1], 0);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, ...
    'setname', 'D1 around square', 'gui', 'off');
EEG.pnts                                       % 15336
numel(eeg_findboundaries(EEG))                 % 80
eeglab redraw;
  • 'time' يُبقي المدى، و 'rmtime' يحذفه. هذان هما الخانة تحت on->remove these وهي غير مفعّلة ومفعّلة.
  • pop_mergeset(ALLEEG, [2 3], 0) يدمج الداتاست 2 ثم 3. والصفر الأخير يعني: لا تحتفظ بأوزان ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت..
  • آخر رقم في pop_rmdat هو القائمة في النافذة: 0 يعني Keep selected، و 1 يعني Remove selected.

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

القيم المناسبة حسب هدف تحليلك
ما تريدهالقائمةماذا تكتب
جزء واحد متصل من التسجيلEdit ثم Select dataالمدى بالثواني في Time range [min max] (s)، والخانة غير مفعّلة.
حذف جزء متصل (بداية أو نهاية أو استراحة)Edit ثم Select dataنفس المدى، مع تفعيل الخانة تحت on->remove these.
البيانات حول نوع حدث واحدEdit ثم Select data using eventsنوع الحدثevent typeاسم أو رقم يميّز نوع الحدث، مثل "square".، والحدود بالثواني حوله، و Keep selected.
حذف البيانات حول حدث، مثل نبضة TMS تشبّع المضخّمEdit ثم Select data using eventsنوع الحدث، وحدود قصيرة حوله، و Remove selected. التوتوريال الرسمي يذكر هذا المثال.
عدة runs لنفس المشارك في داتاست واحدةEdit ثم Append datasetsأرقام الداتاست بترتيب تسجيلها.

متى تدمج؟ عادة بعد الاستيراد ومواقع قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. مباشرة، وقبل الفلترة وICA. ICA يحتاج بيانات كثيرة، و runs نفس الجلسة تشترك في نفس قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة..

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

5 فحوص سريعة
  1. قائمة Datasets فيها خمس داتاست: Continuous EEG Data و D1 part 1 و D1 part 2 و D1 merged و D1 around square.
  2. Frames per epoch للداتاست الأربع الأولى: 30504 و 15361 و 15143 و 30504.
  3. D1 merged فيها 155 حدثاً، و eeg_eventtypes يعرض boundary 1، وتراه خطاً أحمر عند 120 ثانية في نافذة التمرير.
  4. isequal(ALLEEG(4).data, ALLEEG(1).data) يعطي 1: الدمج أعاد الإشارة كما كانت تماماً.
  5. D1 around square فيها 15336 عيّنة و 80 حدث boundary.

لا شيء في هذا الدرس يُحفظ على القرص. احذف الداتاست 2 إلى 5 من الذاكرة بـ Edit ثم Delete dataset(s) from memory قبل الدرس التالي، أو أغلق EEGLAB.

جملة Methods التالية للاستعمال الحقيقي، حين تدمج عدة runs لمشارك واحد، لا لتمرين النصفين في هذا الدرس.

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

5 أخطاء، وكيف تتجنّبها
  • دمج داتاست بعدد قنوات أو معدل عيّنات مختلف. يتوقف Edit ثم Append datasets بخطأ The two datasets must have the same number of channels أو The two datasets must have the same sampling rate. وحّد القنوات والمعدل قبل الدمج.
  • دمج داتاست قنواتها بنفس العدد لكن بترتيب مختلف. EEGLAB يتحقق من العدد فقط، لا من الأسماء. فقد تُلصق إشارة Cz من run تحت اسم Pz من run آخر بلا أي تحذير. قارن {EEG.chanlocs.labels} في الداتاستين قبل الدمج.
  • حذف أحداث boundary أو تجاهلها في سكربت قديم. فلاتر EEGLAB تفلتر كل جزء بين حدثي boundary وحده، والتقطيع لا يأخذ epoch يعبر نقطة وصل. إذا حذفتها، أو فلترت EEG.data مباشرة بدالة من MATLAB، تُعامَل نقطة الوصل كإشارة متصلة، فتظهر قفزة كاذبة.
  • نسيان أن كل قصّ وكل دمج داتاست جديدة. Edit ثم Select data و Edit ثم Append datasets يضيفان داتاست جديدة إلى ALLEEG، والأصل يبقى كما هو. سمِّ كل نسخة باسم واضح، وانظر إلى السطر الأول في النافذة الرئيسية قبل كل خطوة.
  • القصّ من الجزء الأول بدل الأصل. في الخطوة 2، إذا بقيت D1 part 1 هي الحالية، تحذف أول 120 ثانية منها هي، فلا يبقى شيء تقريباً. ارجع إلى الداتاست 1 أولاً.

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

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

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

Data from the [N] recording runs were concatenated into a single continuous dataset (pop_mergeset, EEGLAB 2026.1), with boundary events marking the joins.

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

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

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

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

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