본문 바로가기
Brain Engineering/MNE

Preprocessing : Data Loading (1)

by goatlab 2022. 4. 5.
728x90
반응형
SMALL

Data Loading

 

EEG 데이터는 원시 데이터, 신기원 데이터 및 유발 (평균) 데이터의 3가지 유형으로 간주할 수 있다.

 

  1. 원시 데이터 : 연속 데이터는 MNE에서 원시 개체로 저장된다. 원시 객체의 데이터는 채널×시간 차원의 2D 배열로 간주된다.
  2. Epoch 데이터 : 시간 제한이 있는 시도로 구성된다. 데이터는 이벤트×채널×시간의 3차원 배열이다.
  3. 평균 이벤트 관련 가능성 : 이것은 시도에 대해 에포크된 데이터를 평균화한 결과이다. 출력은 외부 이벤트에 대해 시간 고정되며 채널×시간의 2D 배열로 저장된다.

 

Loading datasets available in MNE : EEGBCI motor imagery Dataset

 

MNE 패키지 (EEGBI 모터 이미지 데이터 세트)에서 사용 가능한 데이터 세트로 시작할 수 있다. 데이터 세트에는 109명의 참가자의 64채널 EEG 기록과 EDF+ 형식의 각 참가자에 대한 14개의 실행이 포함되어 있다. 자세한 내용은 https://www.nmr.mgh.harvard.edu/mne/stable/manual/datasets_index.html#eegbci-motor-imagery를 확인하면 된다.

 

MNE에서 데이터 세트를 로드하려면 참가자 ID 또는 참가자 ID 목록을 제공해야 하며, 실행 목록 (작업) 및 데이터를 찾기 위한 경로는 load_data() 함수에 대한 인수로 제공되어야 한다.

 

load_data() 함수는 요청된 데이터 파일이 있는 경로 목록을 반환한다.

 

데이터를 로드하는 또 다른 방법은 read_raw_edf() 함수를 사용하는 것이다. 이렇게 하면 다운로드한 edf 파일을 로드하고 각 edf 파일의 원시 데이터를 연결하여 선택한 모든 실행이 포함된 최종 데이터 세트를 갖게 된다.

 

import mne
from mne.datasets import eegbci
from mne.io import concatenate_raws, read_raw_edf

#Define the parameters 
subject = 1  # use data from subject 1
runs = [6, 10, 14]  # use only hand and feet motor imagery runs

#Get data and locate in to given path
files = eegbci.load_data(subject, runs, '../datasets/')
#Read raw data files where each file contains a run
raws = [read_raw_edf(f, preload=True) for f in files]
#Combine all loaded runs
raw_obj = concatenate_raws(raws)

 

mne의 raw 및 epoch와 같은 모든 데이터 구조에는 주어진 데이터 세트에 대한 측정 관련 정보를 제공하는 'info'라는 속성이 있다.

원시 데이터는 채널×샘플을 포함하는 2D 배열에 저장된다. 데이터는 다음과 같이 액세스할 수 있다.

 

raw_data = raw_obj.get_data()

# OR

raw_data = raw_obj._data

print("Number of channels: ", str(len(raw_data)))
print("Number of samples: ", str(len(raw_data[0])))
Number of channels:  64
Number of samples:  60000

 

가져온 원시 EEG 신호에는 전극당 하나씩 EEG 활동의 시간 경과가 포함된다.

 

예를 들어, 5000개 샘플 동안 첫 번째 전극에 대한 시간 경과 EEG 활동을 시각화할 수 있다.

 

import matplotlib.pyplot as plt

plt.plot(raw_data[0,:4999])
plt.title("Raw EEG, electrode 0, samples 0-4999")
plt.show()

 

Converting Raw data to Epoched data

 

원시 EEG 파일에는 일정 기간 동안 기록된 EEG 신호의 지속적인 활동이 포함된다. 종종 우리는 환경의 외부 사건에 대한 신경 반응을 분석하기 위해 EEG를 사용한다. 예를 들어, 뇌가 일련의 이미지 또는 소리에 어떻게 반응하는지 연구하고 싶을 수 있다. 이러한 이유로 활동의 지속적인 시간 과정을 분석하는 대신 외부 이벤트가 발생한 시간에 해당하는 EEG 신호의 일부에 초점을 맞추고자 한다.

 

일반적으로 실험 중에 '이벤트'로 가져올 수 있는 EEG 기록에 트리거를 통합하여 중요한 이벤트가 발생하는 시간을 표시한다. '사건'은 본질적으로 외부 자극이 제공된 시기와 이 자극이 무엇인지에 대한 정보를 제공한다.

 

이 정보가 있으면 원시 EEG 신호를 Epoch로 변환할 수 있다. 이것은 각 외부 이벤트가 발생한 시간으로 표시된 지정된 창 주변의 EEG 데이터 청크를 추출하는 것으로 구성된다.

 

Python에서 이 변환을 수행하려면 먼저 외부 이벤트 파일을 읽어야 한다. 데이터에 주석을 달면 MNE의 event_from_annotations() 함수로 이벤트를 쉽게 추출할 수 있다. 이 함수는 이벤트와 이벤트 ID를 모두 반환한다.

 

#Extract events from raw data
events, event_ids = mne.events_from_annotations(raw_obj, event_id='auto')
event_ids
Used Annotations descriptions: ['T0', 'T1', 'T2']
{'T0': 1, 'T1': 2, 'T2': 3}

 

How do we select the time interval that we want to analyze?

 

EEG 데이터에서 에포크를 정의할 수 있으려면 관심 있는 시간 간격을 선택해야 한다.

 

tmin 및 tmax는 선택한 시간 간격 (초)의 시작과 끝을 나타낸다. 이 선택은 실험에 따라 다를 수 있다. 주어진 자극에 대한 반응이 빠르게 일어날 것으로 예상된다면 좁은 시간 간격이 필요할 수 있으며 그 반대의 경우도 마찬가지이다.

 

예를 들어, 목표가 기본적인 감각 처리 (ex. 단순한 시각 또는 청각 자극에 대한 반응)를 연구하는 것이라면 EEG 반응이 자극이 시작된 후 몇 백 밀리초 이내에 비교적 일찍 나타날 것으로 예상한다. 대조적으로 정신 이미지 또는 의사 결정과 같은 더 높은 인지 기능을 연구하는 것이라면 관련 EEG 반응을 포착하기 위해 더 긴 간격을 추출해야 할 가능성이 매우 높다.

 

다음 예에서는 이벤트 발생 후 4초 동안 지속되는 에포크를 정의한다.

 

EEG 분석에서 일반적이므로 기준선, 즉 상대적인 '비활성' 간격도 정의한다. 자극 후 반응은 일반적으로 이 기준선과 관련하여 대조된다.

 

tmin, tmax = -1, 4  # define epochs around events (in s)
#event_ids = dict(hands=2, feet=3)  # map event IDs to tasks

epochs = mne.Epochs(raw_obj, events, event_ids, tmin - 0.5, tmax + 0.5, baseline=None, preload=True)
90 matching events found
No baseline correction applied
Not setting metadata
0 projection items activated
Loading data for 90 events and 961 original time points ...
3 bad epochs dropped

 

관찰한 바와 같이 위의 예에서 'baseline = None'이라는 주석을 달았다. 이는 단순히 데이터에 기준선 수정이 적용되지 않았음을 나타낸다. 'tmin'이 -1 (음수)이므로 추출된 에포크에는 기준 기간이 포함된다. 그런 다음 이 기간을 기준선 수정에 사용할지 여부를 결정하는 것이다.

 

epochs 개체의 데이터 액세스는 원시 개체와 동일한 방식으로 수행된다.

 

#Access to the data
data = epochs._data

n_events = len(data) # or len(epochs.events)
print("Number of events: " + str(n_events)) 

n_channels = len(data[0,:]) # or len(epochs.ch_names)
print("Number of channels: " + str(n_channels))

n_times = len(data[0,0,:]) # or len(epochs.times)
print("Number of time instances: " + str(n_times))
Number of events: 87
Number of channels: 64
Number of time instances: 961

 

에포크 데이터는 여전히 전극에 대한 EEG 활동의 시간 경과이지만, 에포크의 추가 차원도 갖게 되었다. 다음은 여기에 표시된 몇 가지 시대의 예이다.

 

plt.plot(data[14:20,0,:].T)
plt.title("Exemplar single-trial epoched data, for electrode 0")
plt.show()

 

https://neuro.inf.unibe.ch/AlgorithmsNeuroscience/Tutorial_files/DataLoading.html

 

Data Loading

Data Loading Tutorial #1: Loading EEG Data This tutorial focuses on loading different representations of EEG data. To import data into python, we ...

neuro.inf.unibe.ch

 

728x90
반응형
LIST