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 |
| 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
#