In [85]:
from scipy import signal, stats
import numpy as np
import pandas as pd
from matplotlib.pyplot import *
%matplotlib inline
In [86]:
## sampling rate of ganglion is 200Hz
fs = 200.0
In [87]:
def extract_data(fname):
d = pd.read_csv(fname)
eeg = np.array(d.ix[:, 1:5])
tag = np.array(d.Marker)
start = np.where(tag == 1)[0][0]
end = np.where(tag == 2)[0][0]
eeg = eeg[start:end]
return eeg
In [88]:
## get data
eeg1 = extract_data('../data/data_bunny_pierre_1.csv')
eeg2 = extract_data('../data/data_bunny_pierre_2.csv')
eeg3 = extract_data('../data/data_bunny_pierre_3.csv')
In [89]:
## data may be off by a few samples, so need to align
N_samp = min(len(eeg1), len(eeg2), len(eeg3))
eeg1 = eeg1[:N_samp]
eeg2 = eeg2[:N_samp]
eeg3 = eeg3[:N_samp]
In [90]:
## filter signal to remove noise
b, a = signal.butter(2, (2/fs, 30/fs), btype='bandpass')
eeg1 = signal.filtfilt(b, a, eeg1, axis=0)
eeg2 = signal.filtfilt(b, a, eeg2, axis=0)
eeg3 = signal.filtfilt(b, a, eeg3, axis=0)
In [91]:
## advance window of 200 samples
## take correlation between signals across each sample
window = 200
step = 25
corr = []
corr2 = []
times = []
for start in np.arange(0, N_samp, step):
end = start + window
w1 = eeg1[start:end]
w2 = eeg2[start:end]
w3 = eeg3[start:end]
## average the correlation across each channel
r = 0
r2 = 0
for c in range(w1.shape[1]):
r += stats.pearsonr(w1[:, c], w2[:, c])[0]
r2 += stats.pearsonr(w1[:, c], w3[:, c])[0]
r /= w1.shape[1]
r2 /= w2.shape[1]
mid = (start+end)/2 # middle sample
t = mid / fs # convert middle sample to time
times.append(t)
corr.append(r)
corr2.append(r2)
times = np.array(times)
corr = np.array(corr)
corr2 = np.array(corr2)
In [92]:
figure(figsize=(14,4))
plot(times, corr)
xlabel('Time (s)')
ylabel('Correlation')
_ = title('Correlation across brains')
In [ ]:
In [ ]: