Идея заключалась в том, чтобы передавать непрерывные данные ЭЭГ длиной 386,936 с в не перекрывающееся окно эпох, размером 20 с. При частоте дискретизации 250 Гц теоретически каждая эпоха должна содержать 5000 точек данных за эпоху.
Для достижения цели использовался следующий код:
epochs = mne.Epochs (raw, events = events, event_id = event_id, baseline = None, verbose = True) MneApproach = epochs.to_data_frame ()
Чтобы подтвердить, было ли значение, возвращаемое из mne.Epoch, правильным или нет,Я создал скрипт, который может выполнять эпоху вручную. Вывод из скрипта был проверен визуально и работал как задумано. Тем не менее, я заметил, что между выводом скрипта и значением из dataframe MneApproach было другое. Помимо различных значений, MneApproach содержал только 176 наборов данных за эпоху.
Могу ли я знать, что я сделал неправильно при вводе функции mne.Epoch.
Приведенную выше проблему можно воспроизвести изследующий ipynb через Google Colab или из кода ниже
Очень благодарен за любые отзывы и помощь.
import urllib.request
print('Beginning file download with urllib2...')
url = 'http://bnci-horizon-2020.eu/database/data-sets/001-2014/A01T.mat'
urllib.request.urlretrieve(url, '/content/A01T.mat')
mat = loadmat("/content/A01T.mat")
# eeg = mat["data"][0, 3]["X"][0, 0] * 10e-6
eeg = mat["data"][0, 3]["X"][0, 0]
ch_names = ["Fz", "FC3", "FC1", "FCz", "FC2", "FC4", "C5", "C3", "C1", "Cz",
"C2", "C4", "C6", "CP3", "CP1", "CPz", "CP2", "CP4", "P1", "Pz",
"P2", "POz", "EOG1", "EOG2", "EOG3"]
info = mne.create_info(ch_names, 250, ch_types=["eeg"] * 22 + ["eog"] * 3)
raw = mne.io.RawArray(eeg.T, info)
raw.set_montage("standard_1020")
Ручной подход
raw_b = raw.copy()
values = raw_b.get_data()
# values = numpy.zeros(20, dtype=dtype)
index = ['Row'+str(i) for i in range(1, len(values)+1)]
df = pd.DataFrame(values, index=index).transpose()
df.columns = raw_b.ch_names[:]
# df.head()
event_id = 1 # This is used to identify the events.
duration = 20. # Unit in second
# create a fixed size events array
# start=0 and stop=None by default
events = mne.make_fixed_length_events(raw_b, event_id,duration=duration)
print(events)
NoEpochs=len(events)-1
Epoch = range(0, len(events)-1, 1)
NameEpochs = pd.DataFrame(NoEpochs*(np.ones((df.shape[0], 1))), columns=['Epochs'])
for f in Epoch:
NameEpochs.Epochs.iloc[events[f][0]:events[f+1][0]] = Epoch[f]
df = pd.concat([df, NameEpochs], axis = 1)
df.reset_index(drop=True, inplace=True)
df.set_index([df.Epochs, df.index], inplace=True)
del df['Epochs'] ## Delete extra column
df.loc[0.0] # Extrach only epoch 0
MNE подход
epochs = mne.Epochs(raw, events=events, event_id=event_id, baseline=None, verbose=True)
MneApproach=epochs.to_data_frame()
MneApproach
MneApproach.xs(0, level='epoch') # Extrach epoch 0