Visualize EEG Data
EEG 데이터는 공간 (ex. 두피에 분포된 전극)과 시간에서 다차원에 대한 풍부한 정보를 포함한다. EEG 데이터에 포함된 반응 및 활동 유형을 먼저 이해하려면 이 정보를 효율적으로 시각화하는 것이 중요하다.
주요 초점은 eeg 데이터에 대한 시각화 도구의 개요를 알아간다.
import mne
# For elimiating warnings
from warnings import simplefilter
# ignore all future warnings
simplefilter(action='ignore', category=FutureWarning)
#Load epoched data
data_file = '../study1/study1_eeg/epochdata/P-02'
# Read the EEG epochs:
epochs = mne.read_epochs(data_file + '.fif', verbose='error')
MNE 패키지로 데이터를 시각화하기 전에 mne.viz 모듈을 가져와야 한다.
import mne.viz
%matplotlib inline
Plotting single-trial epoched data
EEG 데이터 세트를 시각화할 때 첫 번째 단계는 일반적으로 단일 시도 데이터의 시각적 검사와 관련된다. 이 검사를 통해 데이터 세트의 품질을 평가하기 위해 기록된 모든 에포크를 살펴볼 수 있다. 우리의 목표는 다음을 이해하는 것이다.
(a) 보간되어야 하는 과도한 노이즈가 있는 전극이 있는지? (b) 제거해야 할 과도한 눈 깜박임이 있는지? (c) 어떤 에포크가 시끄럽고 추가 분석에서 제외해야 하는지? |
EEG 데이터 세트의 시각적 검사를 수행하는 가장 간단한 방법은 이름에서 알 수 있듯이 에포크를 표시하는 plot() MNE 함수를 사용하는 것이다. y축은 채널 이름을 표시하고 x축은 에포크 번호를 표시한다. 또한 플롯 위에서 각 이벤트 유형의 비율을 볼 수 있다.
예를 들어, 사용하는 데이터 세트에서 Pleasant 친숙한 Epoch의 비율은 0.34, Neutral 친숙한 0.33 및 Unpleasant 익숙한 0.33이다.
import numpy as np
epochs = epochs['FP', 'FN', 'FU']
print('Percentage of Pleasant familiar events : ', np.around(len(epochs['FP'])/len(epochs), decimals=2))
print('Percentage of Neutral familiar events : ',np.around(len(epochs['FN'])/len(epochs), decimals=2))
print('Percentage of Unpleasant familiar : ', np.around(len(epochs['FU'])/len(epochs), decimals=2))
epochs.plot(scalings='auto')
Percentage of Pleasant familiar events : 0.34
Percentage of Neutral familiar events : 0.33
Percentage of Unpleasant familiar : 0.33
.plot() 함수는 마법을 통해 대화식 모드에서도 사용할 수 있다.
%matplotlib tk
그런 다음 에포크와 전극을 스크롤하고 제외해야 하는 것을 클릭할 수 있다.
Plotting average epochs
단일 시도 에포크 데이터는 일반적으로 매우 시끄럽다. 이 단점을 극복하는 한 가지 방법은 많은 에포크 반복에 대해 데이터를 평균화하고 평균 에포크 응답, 소위 평균 이벤트 관련 잠재력(ERP)에 초점을 맞추는 것이다.
이 기술은 주어진 작업과 관련이 없는 응답을 제거할 수 있기 때문에 EEG 연구 분야에서 널리 사용되었다. 실제로 평균 ERP에는 반복에 걸쳐 일관된 대기 시간과 전극 위치에 나타나는 활동만 포함된다.
평균 ERP 응답의 일반적인 이미지는 기준선 동안, 즉 자극이 발생하기 전에 '낮은' 활동을 보여준다. 이것은 종종 외부 자극에 대한 평균 반응을 반영하는 자극 후 기간 동안 EEG 신호의 큰 양의 또는 음의 편향이 뒤따른다.
다음 예에서는 시간에 따라 모든 전극을 오버레이하여 플롯팅된 친숙한 유쾌한 이벤트에 대한 평균 ERP를 볼 수 있다.
epochs['FP'].average().plot()
평균 ERP 데이터도 matplotlib 라이브러리를 통해 플롯할 수 있다. 다음 예에서는 채널 18에서 세 가지 실험 조건의 평균 ERP가 제공된다.
from matplotlib import pyplot as plt
%matplotlib inline
fp = epochs['FP']
fn = epochs['FN']
fu = epochs['FU']
ch = 18
conditions = ['FP', 'FN', 'FU']
fig, ax = plt.subplots(figsize=(10, 5))
ax.set_xlabel('Time Instances')
ax.set_ylabel('Volt')
ax.plot(fp.average().data[ch, :], color='blue', label='Familiar Pleasant')
ax.plot(fn.average().data[ch, :], color='red', label='Familiar Neutral')
ax.plot(fu.average().data[ch, :], color='green', label='Familiar Unpleasant')
legend = ax.legend(loc='upper right', shadow=True, fontsize='medium')
plt.title('ERP of different conditions')
plt.show()
Plotting topographic information
활동의 시간 경과와는 별도로 EEG 데이터를 시각화하는 또 다른 방법은 전압 지형이다. 지형도는 두피의 각 채널에서 EEG 전압 값을 표시한다. 다른 전압 범위가 다른 색상으로 표시되는 히트 맵과 유사하다.
지형을 통해 두피의 전압 값 분포를 한 번에 검사할 수 있다. 이는 단일 ERP 구성 요소가 아니라 모든 전극에 대한 정보를 한 번에 제공할 수 있기 때문에 특히 유리하다.
지형도를 그리는 가장 쉬운 방법은 MNE를 사용하는 것이다. MNE에는 plot_topomap()이라는 호출 클래스 함수가 있다. 이 함수는 시간 범위와 채널 유형을 매개변수로 사용하고 주어진 데이터로 지형도를 표시한다. 플롯의 오른쪽에는 각 색상이 나타내는 전압 범위를 이해할 수 있도록 색상 맵이 제공된다. 두피 수치의 점은 전극의 위치를 나타낸다.
%matplotlib inline
times = np.arange(0, 1, 0.1)
epochs.average().plot_topomap(times, ch_type='eeg')
%matplotlib inline
times = np.arange(0, 1, 0.1)
epochs.average().plot_topomap(times, ch_type='eeg')
Plotting Channels
주어진 채널의 평균 이벤트 관련 가능성은 다음 기능을 통해 표시된다.
import pylab, seaborn as sns
from scipy.stats import ttest_rel, sem
def plot_conditions(data, times, plot_title):
sns.set(style="white")
ColorsL = np.array(([228,26,28], [55,126,184], [77,175,74], [152,78,163], [255,127,0]))/256
col_axes = np.array((82, 82, 82))/256
al = 0.2
fig = plt.figure(num=None, figsize=(4, 2), dpi=150)
epochs_mean = np.mean(data, axis = 0)
epochs_std = sem(data, axis = 0)/2
plt.plot(times, epochs_mean, color = ColorsL[0], linewidth = 2)
plt.fill_between(times, epochs_mean, epochs_mean + epochs_std, color = ColorsL[0], interpolate=True, alpha = al)
plt.fill_between(times, epochs_mean, epochs_mean - epochs_std, color = ColorsL[0], interpolate=True, alpha = al)
plt.ylabel('Mean ERP')
plt.xlabel('Times')
plt.title(plot_title)
plot_conditions(epochs.get_data()[:,54,:], epochs.times, 'Channel 54')
https://neuro.inf.unibe.ch/AlgorithmsNeuroscience/Tutorial_files/DataVisualization.html
'Brain Engineering > MNE' 카테고리의 다른 글
Preprocessing : Choosing a Reference (0) | 2022.04.05 |
---|---|
Preprocessing : Baseline Correction (0) | 2022.04.05 |
Preprocessing : Data Loading (2) (0) | 2022.04.05 |
Preprocessing : Data Loading (1) (0) | 2022.04.05 |
Signal Processing : Acquiring Data (0) | 2022.04.05 |