Introducción

Partimos del fichero de datos de D. Javier Villalva, en la hoja de datos :

files = list.files(path='~/git/JVD_HEALTH/JVD_BRAIN/', pattern = '^[0-9].*.csv$')
nfiles= length(files)
lf    = list()  # almacen de chunk de datos
lf2   = list()  # estadisticos de varaición de los chunks de datos en cada fichero
lf4   = list()  # marcas de tiempo en el chunk
for ( i in files) {
  cat(paste("Procesando ",i,".\n",sep=""))
  lf[[i]]  = list()
  lf2[[i]] = list()
  lf4[[i]] = list()
  d  = read.csv2(file=i,skip=1,sep=",",header=FALSE,stringsAsFactors = FALSE)
  d  = apply(d,2,as.numeric)
  j  = (which(d[,1]==0)[1] - 1)
  dd = d[-c(1:j),]  # Se elimina el chunck inicial si no es completo
  jdx= (which(dd[,1]==0))
  edx= c((jdx-1)[-1],nrow(dd))
  rng= data.frame(desde=jdx,hasta=edx) # Rangos de chunks de datos en 'd'
  lsg= apply(rng,1,function(x){return(x[2]-x[1]+1)})
  idx= which(lsg==median(lsg))
  lsd= apply(rng[idx,],1,function(x,y){return(as.data.frame(y[x[1]:x[2],3:16]))},dd)
  lf[[i]] = lsd  # i-esimo chunck de datos
  apl= lapply(lsd,function(x){
                  return(apply(x,2,summary))}) # resumen de estadísticos de cada chunk
  ap2= ldply(apl,function(x){
              mx = x[4,];         
              vx = t(apply(x,1,function(x,y){return(x-y)},mx))
              vr = diff(apply(vx,2,range))
              return(vr)
            })  
  lf2[[i]]= ap2 # rangos de varaiación de cada variable en cada chunk
#
  # Se procesa el fichero de índice
  j  = paste("index-",i,sep="")
  d  = read.csv2(file=j,sep=";")
  org= paste("0:",as.character(d[,3]),sep="")
  end= paste("0:",as.character(d[,4]),sep="")
  vt = apply(data.frame(org=org,end=end),1,function(x){
              return(as.difftime(c(x[1],x[2]),units="secs"))}) # duración de las pruebas
  mp = apply(vt,2,function(x){return(x[2]-x[1])})-1
  mp[is.na(mp)]=0  # reemplazar marcas como '---'
  d[,5]=mp
  d[,6]=cumsum(mp)  # Compleatnndo los índices con marcas de tiempo
  lf4[[i]]=d        # almacenamos las marcas de tiempo
                    # cada chunk registra 1s así el chunk 153 corresponde al ejercicio P-2 
                    # del usuario 1
}
## Procesando 001-001-12.12.16-13.01.25.csv.
## Procesando 002-002-15.12.16-11.28.27.csv.
rm(j,jdx,d,edx,rng,lsg,idx,apl,lsd,i,ap2)
#

Una vez procesados estos datos se observa que hay algunas variables que no están ajustadas, al menos según lo que se acostumbra a utilizar en el paquete eegAnalysis. En los datos de JVD (ver lf4[[i]]) existen participantes (4 en el primer fichero) y existen actividades (7 .- Check, P-1, P-2, P-3, Do, Act, Test) El dispositivo registra 14 canales y la frecuencia de muestreo 128Hz (128 muestras/s).

El formato de almancemaniento de este tipo de información se estructura en * Canales (n.channels) = 14 (sensores en la cabeza) * Señales (n.signals) = 128 (frecuencia) * Clases (n.classes) = 7 (actividades) o individuos (4) * N Reg (n.rec) = ? Un número de muestras común. El problema es que en los datos lf4[[i]] no hay un dato homogeneno de nuestras

Como hay que adoptar una solución vamos a tratar de comparar algunas actividades en algunos individuos Es decir eliminamos el P1 que no aporta datos de test

Para el experimento 1 Participante 1 2 3 4 Check 59:1-59 30:350-379 29:682-710 48:1029-1076 => 29 P1 93:60-152 80:380-459 88:711-798 79:1077-1155 => 79 (*) P2 58:152-210 58:460-517 58:799-856 59:1156-1214 => 58 () P3 53:211-263 67:518-584 88:857-944 77:1215-1291 => 67 () Do 73:264-336 38:585-622 37:945-981 28:1292-1319 => 28 () Act 13:337-349 36:623-658 19:982-1000 36:1320-1355 => 19 Test 0:350-349 23:659-710 28:1001-1028 27:1356-1382 => 23 ()

Se propone segmentar los valores del P1

#
# Preparacion para P-2
orgdata = function(lf,lf4,kdx) {
  mdx = lf4[kdx,5:6]
  mdx[,3]=mdx[,2]-mdx[,1]+1
  nrc = min(mdx[,1])
  mdx[,4]=mdx[,3]+nrc-1
  new = randEEG(n.class=nrow(mdx),n.rec=nrc,n.signals=128,
                n.channels = 14,vars=1:nrow(mdx))  
  for (j in 1:nrow(mdx)) {
    ss = mdx[j,3]:mdx[j,4]
    tmp= ldply(lf[ss],function(x){return(x)})[,-1]
    kdx= ((j-1)*nrow(tmp)+1):(j*nrow(tmp))
    new$data[kdx,]=as.matrix(tmp)
  }
  return(new)
}
#
eeg = list()
for ( i in files) {
  eeg[[i]]=list()
  for ( l in c("P-1","P-2","P-3","Do","Test")) {
    kdx = which(lf4[[i]][,2]==l)[c(2,3)]
    eeg[[i]][[l]] = orgdata(lf[[i]],lf4[[i]],kdx)
  }
}
# Targeted es el participante 1
teeg = list()
for ( i in files) {
  teeg[[i]]=list()
  for ( l in c("P-1","P-2","P-3","Do")) {
    kdx = which(lf4[[i]][,2]==l)[1]  
    teeg[[i]][[l]] = orgdata(lf[[i]],lf4[[i]],kdx)
  }
}  
#

Se procesa el eeg obtenido para crear features y un clasificador SVM

#
Feeg = list()
for ( i in files) {
  Feeg[[i]]=list()
  for ( l in c("P-1","P-2","P-3","Do","Test")) {  
    Feeg[[i]][[l]]=FeatureEEG(eeg[[i]][[l]]$data,eeg[[i]][[l]]$classes.Id,
                              eeg[[i]][[l]]$rec.Id,features="default",Alpha=0.05,
                                AlphaCorr=0.9,minacc=0.8,fast=FALSE)
  }
}
#
FeegM = list()
for ( i in files) {
  FeegM[[i]]=list()
  for ( l in c("P-1","P-2","P-3","Do","Test")) {  
    FeegM[[i]][[l]]=svmEEG(Feeg[[i]][[l]])
  }
}
#

Ahora vemos de clasificar las muestras del Participante 1

#
Reeg = list()
for ( i in files) {
  cat(paste("Procesando ",i,".\n",sep=""))  
  print(xtable(lf4[[i]]),type="html")
  Reeg[[i]]=data.frame(matrix(NA,nrow=4,ncol=5))
  cls = c("P-1","P-2","P-3","Do","Test")
  rws = c("P-1","P-2","P-3","Do")
  colnames(Reeg[[i]]) = cls
  rownames(Reeg[[i]]) = rws
  for ( l in cls) {  
    for ( s in rws) {  
      Reeg[[i]][l,s] =paste(classifyEEG(FeegM[[i]][[l]],teeg[[i]][[s]]$data),collapse=":")
    }
  }
  print(xtable(Reeg[[i]]),type="html")
  plotEEG(eeg[[i]][["P-1"]]$data,eeg[[i]][["P-1"]]$classes.Id,eeg[[i]][["P-1"]]$rec.Id)
  plotEEG(eeg[[i]][["P-2"]]$data,eeg[[i]][["P-2"]]$classes.Id,eeg[[i]][["P-2"]]$rec.Id)
  plotEEG(eeg[[i]][["P-3"]]$data,eeg[[i]][["P-3"]]$classes.Id,eeg[[i]][["P-3"]]$rec.Id)
  plotEEG(eeg[[i]][["Do"]]$data,eeg[[i]][["Do"]]$classes.Id,eeg[[i]][["Do"]]$rec.Id) 
  for (n in 1:14) {
    cat(paste(" Característica P-1. Canal: ",n,"\n",sep=""))
    plotEEG(eeg[[i]][["P-1"]]$data,eeg[[i]][["P-1"]]$classes.Id,eeg[[i]][["P-1"]]$rec.Id,
          which.channels=c(n), type = 'T.pvalue',wavelet="gaussian2", abs=TRUE,variance=1)
  }
}
Procesando 001-001-12.12.16-13.01.25.csv.
X.CPD.nA X Empieza Acaba V5 V6
1 1 Check 0:00 1:00 59.00 59.00
2 P-1 1:01 2:35 93.00 152.00
3 P-2 2:36 3:35 58.00 210.00
4 P-3 3:36 4:30 53.00 263.00
5 Do 4:31 5:45 73.00 336.00
6 Act 5:46 6:00 13.00 349.00
7 Test 0.00 349.00
8 2 Check 6:00 6:31 30.00 379.00
9 P-1 6:31 7:52 80.00 459.00
10 P-2 7:52 8:51 58.00 517.00
11 P-3 8:51 9:59 67.00 584.00
12 Do 10:00 10:39 38.00 622.00
13 Act 10:40 11:17 36.00 658.00
14 Test 11:18 11:42 23.00 681.00
15 3 Check 12:00 12:30 29.00 710.00
16 P-1 12:31 14:00 88.00 798.00
17 P-2 14:01 15:00 58.00 856.00
18 P-3 15:01 16:30 88.00 944.00
19 Do 16:31 17:09 37.00 981.00
20 Act 17:10 17:30 19.00 1000.00
21 Test 17:31 18:00 28.00 1028.00
22 4 Check 18:10 18:59 48.00 1076.00
23 P-1 19:00 20:20 79.00 1155.00
24 P-2 20:21 21:21 59.00 1214.00
25 P-3 21:22 22:40 77.00 1291.00
26 Do 22:41 23:10 28.00 1319.00
27 Act 23:11 23:48 36.00 1355.00
28 Test 23:49 24:17 27.00 1382.00
P-1 P-2 P-3 Do Test
P-1 0.894159856633021:1 0.848306863759449:1 0.85980328930074:1 0.958762619987947:1
P-2 0.950691341904561:2 0.862393979723103:2 0.960370246882032:2 0.677311784387778:2
P-3 0.933567186752712:2 0.92402512631433:2 0.970673750100804:2 0.600012711179664:2
Do 0.974406205078638:2 0.963617780054996:2 0.983820119687204:2 0.700471500806841:2
Test 0.842146226827889:2 0.841325251086598:2 0.820235242928722:2 0.628780161683451:1
Característica P-1. Canal: 1 Característica P-1. Canal: 2 Característica P-1. Canal: 3 Característica P-1. Canal: 4 Característica P-1. Canal: 5 Característica P-1. Canal: 6 Característica P-1. Canal: 7 Característica P-1. Canal: 8 Característica P-1. Canal: 9 Característica P-1. Canal: 10 Característica P-1. Canal: 11 Característica P-1. Canal: 12 Característica P-1. Canal: 13 Característica P-1. Canal: 14 Procesando 002-002-15.12.16-11.28.27.csv.
X.CPD.nA X Empieza Acaba V5 V6
1 1 Check 00:00 00:27 26.00 26.00
2 P-1 00:28 01:45 76.00 102.00
3 P-2 01:46 02:36 49.00 151.00
4 P-3 02:37 03:43 65.00 216.00
5 Do 03:44 05:12 87.00 303.00
6 Act 05:13 05:45 31.00 334.00
7 Test 05:46 05:59 12.00 346.00
8 2 Check 06:00 06:10 9.00 355.00
9 P-1 06:11 07:21 69.00 424.00
10 P-2 07:22 08:20 57.00 481.00
11 P-3 08:21 09:29 67.00 548.00
12 Do 09:30 10:33 62.00 610.00
13 Act 10:34 10:49 14.00 624.00
14 Test 10:50 11:18 27.00 651.00
15 3 Check 11:19 11:42 22.00 673.00
16 P-1 11:43 12:54 70.00 743.00
17 P-2 12:55 13:45 49.00 792.00
18 P-3 13:46 15:04 77.00 869.00
19 Do 15:05 15:45 39.00 908.00
20 Act 15:46 16:00 13.00 921.00
21 Test 16:01 16:27 25.00 946.00
22 4 Check 16:28 16:49 20.00 966.00
23 P-1 16:50 18:16 85.00 1051.00
24 P-2 18:17 19:00 42.00 1093.00
25 P-3 19:01 20:22 80.00 1173.00
26 Do 20:23 22:07 103.00 1276.00
27 Act 22:08 22:29 20.00 1296.00
28 Test 22:30 22:51 20.00 1316.00
P-1 P-2 P-3 Do Test
P-1 0.5:2 0.516895305477588:1 0.782761361003511:1 0.914368090230324:1
P-2 0.540706163767625:1 0.540981586801316:1 0.557733667222876:1 0.557266516699966:1
P-3 0.601772055909943:1 0.601772060906151:1 0.60182121825382:1 0.613469211880502:1
Do 0.489673842249495:1 0.489680281572916:1 0.490689990405763:1 0.5:1
Test 0.753851548300367:1 0.753851551702763:1 0.753857294485198:1 0.754634116234493:1

Característica P-1. Canal: 1 Característica P-1. Canal: 2 Característica P-1. Canal: 3 Característica P-1. Canal: 4 Característica P-1. Canal: 5 Característica P-1. Canal: 6 Característica P-1. Canal: 7 Característica P-1. Canal: 8 Característica P-1. Canal: 9 Característica P-1. Canal: 10 Característica P-1. Canal: 11 Característica P-1. Canal: 12 Característica P-1. Canal: 13 Característica P-1. Canal: 14

#