본문 바로가기
Brain Engineering/MNE Python

[MNE-Python] MEG / EEG analysis (1)

by goatlab 2022. 3. 18.
728x90
반응형
SMALL

Loading data

 

MNE-Python 데이터 구조는 Neuromag의 FIF 파일 형식을 기반으로 하지만 다양한 다른 데이터 형식에 대한 판독기 기능이 있다 . MNE-Python에는 MNE-Python이 다운로드하고 관리할 수 있는 다양한 공개 데이터 세트 에 대한 인터페이스도 있다.

 

시청각 실험을 수행하는 한 피험자의 EEG 및 MEG 데이터와 해당 피험자에 대한 구조적 MRI 스캔이 포함된 예제 데이터세트 (" Sample " 이라고 함) 중 하나를 로드한다 . 함수는 mne.datasets.sample.data_path 데이터 세트가 예상 위치 중 하나에 없으면 자동으로 다운로드한 다음 데이터 세트의 디렉터리 경로를 반환한다 ( data_path다운로드하기 전에 확인하는 위치 목록은 설명서 참조). 서버에서 원활하게 실행되도록 데이터의 필터링 및 다운샘플링된 버전 (sample_audvis_filt-0-40_raw.fif)을 사용하고 있지만 필터링되지 않은 버전(sample_audvis_raw.fif)도 샘플 데이터세트에 포함되어 있으며 튜토리얼을 실행할 때 여기에서 대체할 수 있다.

 

import os
import numpy as np
import mne

sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                                    'sample_audvis_filt-0-40_raw.fif')
raw = mne.io.read_raw_fif(sample_data_raw_file)

---
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_filt-0-40_raw.fif...
    Read a total of 4 projection items:
        PCA-v1 (1 x 102)  idle
        PCA-v2 (1 x 102)  idle
        PCA-v3 (1 x 102)  idle
        Average EEG reference (1 x 60)  idle
    Range : 6450 ... 48149 =     42.956 ...   320.665 secs
Ready.

 

기본적으로 read_raw_fif 로드 중인 파일에 대한 일부 정보를 표시한다. 예를 들어, 녹음된 데이터와 함께 파일에 4개의 "프로젝션 항목"이 있음을 알려준다. MEG 신호에서 환경 잡음을 제거하도록 계산된 SSP 프로젝터와 EEG 채널을 평균 참조하는 프로젝터이다. Raw를 로드하는 동안 표시되는 정보 외에도 개체를 인쇄 하여 개체의 기본 세부 정보를 볼 수 있다. dictionary-like objectRawEpochsEvoked info 데이터 구조는 채널 위치, 적용된 필터, 프로젝터 등을 추적한다.

 

print(raw)
print(raw.info)
---
<Raw | sample_audvis_filt-0-40_raw.fif, 376 x 41700 (277.7 s), ~3.3 MB, data not loaded>
<Info | 15 non-empty values
 bads: 2 items (MEG 2443, EEG 053)
 ch_names: MEG 0113, MEG 0112, MEG 0111, MEG 0122, MEG 0123, MEG 0121, MEG ...
 chs: 204 Gradiometers, 102 Magnetometers, 9 Stimulus, 60 EEG, 1 EOG
 custom_ref_applied: False
 dev_head_t: MEG device -> head transform
 dig: 146 items (3 Cardinal, 4 HPI, 61 EEG, 78 Extra)
 file_id: 4 items (dict)
 highpass: 0.1 Hz
 hpi_meas: 1 item (list)
 hpi_results: 1 item (list)
 lowpass: 40.0 Hz
 meas_date: 2002-12-03 19:01:10 UTC
 meas_id: 4 items (dict)
 nchan: 376
 projs: PCA-v1: off, PCA-v2: off, PCA-v3: off, Average EEG reference: off
 sfreq: 150.2 Hz
>

 

Raw 객체에는 몇 가지 내장된 플로팅 방법이 있다. 여기에서는 raw의 각 센서 유형에 대한 전력 스펙트럼 밀도 (PSD)와 plot_psd로 원시 센서 트레이스의 플롯을 보여준다. PSD 플롯에서는 50Hz 미만의 주파수만 표시한다 (데이터가 40Hz에서 저역 통과 필터링되기 때문에). 대화형 Python 세션에서 plot 대화형이며 스크롤, 크기 조정, 잘못된 채널 표시, 주석, 프로젝터 토글 등을 허용한다.

 

raw.plot_psd(fmax=50)
raw.plot(duration=5, n_channels=30)

 

Preprocessing

 

MNE-Python은 다양한 전처리 접근 방식 및 기술 (maxwell 필터링, 신호 공간 투영, 독립 구성 요소 분석, 필터링, 다운샘플링 등)을 지원한다. mne.preprocessing mne.filter하위 모듈 의 전체 기능 목록을 참조하면 된다. ICA 여기서는 독립적인 구성 요소 분석( )을 수행하여 데이터를 정리한다.

 

# set up and fit the ICA
ica = mne.preprocessing.ICA(n_components=20, random_state=97, max_iter=800)
ica.fit(raw)
ica.exclude = [1, 2]  # details on how we picked these are omitted here
ica.plot_properties(raw, picks=ica.exclude)

 

제거하려는 구성 요소가 확실하면 exclude매개 변수로 전달한 다음 ICA를 원시 신호에 적용한다.  apply방법을 사용하려면 원시 데이터를 메모리에 로드해야 하므로 (기본적으로 필요할 때만 디스크에서 읽음) load_data먼저 사용할 것이다. Raw 또한 아티팩트 제거 전후의 신호를 나란히 비교할 수 있도록 개체의 복사본을 만들 것이다.

 

orig_raw = raw.copy()
raw.load_data()
ica.apply(raw)

# show some frontal channels to clearly illustrate the artifact removal
chs = ['MEG 0111', 'MEG 0121', 'MEG 0131', 'MEG 0211', 'MEG 0221', 'MEG 0231',
       'MEG 0311', 'MEG 0321', 'MEG 0331', 'MEG 1511', 'MEG 1521', 'MEG 1531',
       'EEG 001', 'EEG 002', 'EEG 003', 'EEG 004', 'EEG 005', 'EEG 006',
       'EEG 007', 'EEG 008']
chan_idxs = [raw.ch_names.index(ch) for ch in chs]
orig_raw.plot(order=chan_idxs, start=12, duration=4)
raw.plot(order=chan_idxs, start=12, duration=4)

 

Detecting experimental events

 

샘플 데이터 세트에는 자극 전달 컴퓨터에서 보낸 전기 신호를 기록하는 여러 "STIM" 채널 이 포함되어 있다 (간단한 DC 이동 / 방형파 펄스). 이러한 펄스 (종종 "트리거"라고 함)는 실험 이벤트를 표시하기 위해 이 데이터세트에서 사용된다. 개별 STIM 채널은 단일 채널로 결합되어 해당 채널의 전압 레벨이 특정 이벤트 유형으로 명확하게 디코딩될 수 있다. 이전 Neuromag 시스템 (ex. 샘플 데이터를 기록하는 데 사용)에서는 이 합산 채널이 호출 되었으므로 해당 채널 이름을 함수에 전달하여 자극 이벤트의 타이밍과 ID를 복구할 수 있다.

 

events = mne.find_events(raw, stim_channel='STI 014')
print(events[:5])  # show the first 5
---
319 events found
Event IDs: [ 1  2  3  4  5 32]
[[6994    0    2]
 [7086    0    3]
 [7192    0    1]
 [7304    0    4]
 [7413    0    2]]

 

결과 이벤트 배열은 첫 번째 열에 샘플 번호가 있고 마지막 열에 정수 이벤트 ID가 있는 일반 3열이다. 중간 열은 일반적으로 무시된다. 정수 이벤트 ID를 추적하는 대신 정수 ID를 실험 조건 또는 이벤트에 매핑 하는 이벤트 사전 을 제공할 수 있다. 이 데이터세트에서 매핑은 다음과 같다.

 

 

event_dict = {'auditory/left': 1, 'auditory/right': 2, 'visual/left': 3,
              'visual/right': 4, 'smiley': 5, 'buttonpress': 32}

 

이와 같은 이벤트 사전은 연속 데이터에서 에포크를 추출할 때 사용된다. 사전 키의 / 문자는 부분 조건 설명자를 요청하여 조건 전체에 풀링을 허용한다 (즉, 요청 'auditory'하면 이벤트 ID 1 및 2 'left'가 있는 모든 에포크가 선택되고, 요청하면 이벤트 ID 1 및 3이 있는 모든 에포크가 선택됨). plot_events 녹화 기간 동안 이벤트 분포를 시각화 하는 편리한 기능도 있다 (이벤트 감지가 예상대로 작동하는지 확인하기 위해). 여기서 Info 속성을 사용하여 녹음의 샘플링 빈도를 얻을 수 있다 (따라서 x축은 샘플 대신 초 단위가 된다).

 

fig = mne.viz.plot_events(events, event_id=event_dict, sfreq=raw.info['sfreq'],
                          first_samp=raw.first_samp)

 

이벤트와 관련되지 않은 패러다임 (ex. 휴지 상태 데이터 분석)의 mne.make_fixed_length_events 경우 다음 섹션에 설명된 대로 에포칭을 사용하여 이벤트를 생성하고 계속 진행하여 데이터의 일정한 간격 (겹칠 가능성이 있음) 범위를 추출할 수 있다.

 

https://mne.tools/stable/auto_tutorials/intro/10_overview.html#sphx-glr-auto-tutorials-intro-10-overview-py

 

Overview of MEG/EEG analysis with MNE-Python — MNE 1.0.0 documentation

Overview of MEG/EEG analysis with MNE-Python This tutorial covers the basic EEG/MEG pipeline for event-related analysis: loading data, epoching, averaging, plotting, and estimating cortical activity from sensor data. It introduces the core MNE-Python data

mne.tools

 

728x90
반응형
LIST