PyEEG & Análisis de Series Temporales

En este caso haremos una breve presentación de las funcionalidades que nos otorga PyEEG para el trabajo con electroencefalogramas, fusionando con matplotlib para mostrar los resultados.

PyEGG tiene muchas funcionalidades:

  • bin_power(), Power Spectral Density (PSD), spectrum power in a set of frequency bins, and, Relative Intensity Ratio (RIR), PSD normalized by total power in all frequency bins
  • pfd(), Petrosian Fractal Dimension (PFD)
  • hfd(), Higuchi Fractal Dimension (HFD)
  • hjorth(), Hjorth mobility and complexity
  • spectral_entropy(), spectral entropy, the entropy of RIRs
  • svd_entropy(), Singular Value Decomposition (SVD) entropy
  • fisher_info(), Fisher Information, the entropy of SVD values, i.e., SVD spectrum
  • ap_entropy(), Approximate Entropy (ApEn)
  • samp_entropy(), Sample Entropy (SampEn)
  • dfa(), Detrended Fluctuation Analysis (DFA)
  • hurst(), Hurst Exponent (Hurst)

En nuestro caso hicimos uso de DFA , en pocas palabras trata de cuantificar la autosemejanza de series temporales (En el link DFA esta genialmente explicado).

Los datos con los que trabajamos fueron tomados de  Universidad de Bonn.

Ahora vamos al código:

**Aclaración, solo por cuestiones de ploteo se le agrego a la función dfa que devuelva otros valores mas …

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#The data analyzed in our study is available on this page. 
# http://epileptologie-bonn.de/cms/front_content.php?idcat=193&lang=3
#The sampling rate of the data was 173.61 Hz. For a more 
#detailed description of the data please refer to the manuscript
#Please note, however, that the time series have the spectral 
#bandwith of the aquisition system, which is 0.5 Hz to 85 Hz.

from pyeeg import dfa
import pylab 
from scipy import log10
from numpy import arange, loadtxt, random
from random import randrange

def randomize(data):
	randomData = []
	for i in range(len(data)-1):
		randomData.append(data[randrange(0, len(data)-1)])
	
	return randomData

if __name__ == "__main__":
	
	originalData = loadtxt('F/F003.txt').T
	randomData = randomize(originalData)
	#get the dfa for both set of values
	alphaO, forplotO, forplotNO = dfa(originalData)
	alphaR, forplotR, forplotNR = dfa(randomData)

	#plot the results
	fig = pylab.figure()
	ax = fig.add_subplot(3, 1, 1)
	ori = ax.plot(log10(forplotNO), forplotO, 'b-', label = "Original Data")
	ran = ax.plot(log10(forplotNR), forplotR, 'g-', label = "Random Data")

	pylab.title("DFA")
	pylab.legend([ori[0], ran[0]], ['Original Data','Random Data'])
	pylab.text(2,3, r'$\alpha Original = %f $'%(alphaO), multialignment = 'center')
	pylab.text(2,2, r'$\alpha Random  = %f $'%(alphaR), multialignment = 'center')

	#plot the original and randomize data
	bx = fig.add_subplot(3, 1, 2)
	bx.plot(randomData, 'g-')
	pylab.title("Random Data")
	cx = fig.add_subplot(3, 1, 3)
	cx.plot(originalData, 'b-')
	pylab.title("Original Data")

	pylab.show()

Para observar la variación del \alpha lo que se hizo fue tomar la muestra original y transformarla en ruido blanco (el cual debe dar simil a 0.5)

Por si alguien le interesa ACA van a encontrar el pyeeg que retorna las funciones que se encuentran ploteadas, un setup.py para los herejes que lo necesiten corriendo en W$.

🙂