“cada paso más profundo en el análisis se lleva consigo un alma…”
…atribuido a Teilhard de Chardin
SINOPSIS. “Dasher es un sistema competitivo de entrada de texto en las circunstancias de que un teclado físico no pueda ser usado.” En Dasher, para algunos usuarios con Parálisis Cerebral, los ratones tipo joystick son preferenciales. Dependiendo de los grados de discpacidad, la disfunción neuromuscular y los espasmos pueden dificultar la fluidez de uso. Este reporte intenta caracterizar una base primordial de eventos en los trazos del ratón que puedan ser significativos para facilitar el uso del Dasher. La inclusión de dicha caracterización en el código C++ del Dasher, y la sugerencia de una solución (detener/regresar, avanzar) en la posición del cursor, idealmente ayudaría en el uso de este programa, y aliviaría la tensión nerviosa; un detonante de los espasmos por sí misma. La generación de un “diccionario de trazos”/umbral de magnitudes del usuario capaz de combinarse con los motores de entrenamiento de diccionarios de idiomas del Dasher sería el último paso para esta investigación. Las configuraciones de sistema para este documento de Febrero/2022 fue: macOS Monterey Versión 12.2 en una iMac (iMac (Retina 4K, 21.5-inch, 2017), con procesador 3 GHz Intel Core i5 de 4 núcleos, 8 GB 2400 MHz DDR4 de RAM; Versión 1.3.1073 © 2009-2020 RStudio, PBC, Inc., bajo la versión de R 4.0.2 (2020-06-22) – “Taking Off Again”. Los archivos de texto investigados en este documento fueron generados en dos configuraciones diferentes: I.- miniAudicle versión 1.3.5.2 (gidora) git: a8d59b9 Copyright (c) Spencer Salazar; MacOS Catalina 10.15.7 en iMac (Retina 4k, 2017) con un ratón inalámbrico Apple Magic Mouse 2. II.- miniAudicle versión 1.4.1.0 (gidora) git: 9f6ee78 Copyright (c) Spencer Salazar; Quemu MacOS High Sierra Versión 10.13.6 Virtual System (en una Samsung intel(R) CoreTM i3, bajo Sistema Operativo Ubuntu 20.04) con un ratón joystick OPM-200 de trabajo pesado.
PREÁMBULO. (Nota.- Haga clic derecho en los enlaces a continuación y haga clic en abrir enlace en una nueva ventana/pestaña)
Hacia la facilitación del uso de Dasher.
He aquí un demo de uso de Dasher configurado con opciones de control “normal” que se asemejan a un entorno de videojuego en el que la escena (una pared llena de predicciones de texto) reacciona cuando el usuario acerca el cursor a la pared, proponiendo rutas adecuadas de construcción de textos. El Sujeto en este vídeo anterior no tiene impedimentos de movimiento. Nuestro usuario Sujeto de Investigación con Parálisis Perebral escribe con Dasher bajo las opciones de control “pulsación” que permiten acercarse a la “escena” (la “pared” y los textos que propone) moviendo el cursor del mouse en consecuencia, ubicando el cursor; y finalmente, haciendo clic en el botón izquierdo del ratón. Estas tres acciones amplían el muro de texto y obtienen nuevas proposiciones de predicciones de construcción de texto, hasta que se construye una palabra y comienza un nuevo ciclo después de introducir un espacio u otro elemento ortográfico..
La Captura de los trazos del ratón.
La ejecución del script trails.ck codificado en Chuck/miniAudicle —un lenguaje y ambiente gráfico de música digital con un robusto manejo del transcurso del tiempo—, produce archivos de texto que contienen información sobre los movimientos del ratón. Cada fila escrita contiene magnitudes delta X y delta Y, columnas acumulativas de esas magnitudes, marcas de tiempo de la máquina virtual de miniAudicle en segundos/milésimas de segundo, coordenadas X e Y de botones etiquetados (Yield, FRAY 1, SAN-2, etc.) sobre los que se debe ubicar el cursor y hacer clic para mostrar el botón siguiente (hasta ocho en cada prueba del Sujeto o tomas de control). Las coordenadas de los botones X e Y despliegan al usuario un mapa de objetivos consecutivos en la ventana mostrada. Graficar ambos: los mapas y las trayectorias entre los botones, brinda ideas visuales sobre las cualidades (por ejemplo, líneas rectas versus líneas torcidas) de la toma. Un análisis adicional sobre marcas de tiempo brinda información sobre los “niveles de estrés” de la manipulación de la cabeza del joystick (por ejemplo, movimientos más rápidos versus más lentos). Los archivos de datos y la investigación previa para este artículo se pueden encontrar siguiendo la página mousetrails de GitHub. De manera similar al uso de Dasher bajo las opciones de control de “pulsación”, el script trails.ck requiere de nuestra Usuaria Objetivo varias acciones repetitivas que realiza con la misma mano izquierda: sostener el joystick, mover el cursor hacia el botón propuesto, soltar el joystick, hacer clic con el botón izquierdo del mouse y esperar hasta que aparezca el siguiente botón en el script.
Una rendición de “patrón (sin) identificación”, todavía.
Sostener y soltar la cabeza del ratón OPM_200 de joystick puede cursar con “baches” de trazo en usuarios con Parálisis Cerebral; igual que con los espasmos, dependiendo del nivel de estrés del usuario. El análisis a continuación tipifica los movimientos más rápidos/“más estresados” con mayor probabilidad de ocurrir antes y después de los giros de las trayectorias del mouse; más evidente donde los rastros muestran que el Sujeto se dio cuenta de una trayectoria del mouse que “iba mal” hacia el siguiente clic sobre el botón desplegado. En lugar de tratar de conceptualizar un diccionario de patrones de espasmos per se, un enfoque más simple consistiría en una ronda de calibración por sesión de Dasher, para establecer un umbral por debajo del cual se filtran los movimientos más rápidos (más propensos a producir rutas no deseadas) para alcanzar la semejanza de un uso de Dasher bajo las opciones de control “normales” como en el vídeo de demostración anterior. Incorporar al código del Dasher las magnitudes más rápidas/“más estresadas” de los trazos del mouse, o establecer un umbral, permitiría “enderezar” la progresión de la interfaz Dasher; y, podría ayudar a descartar caminos “que van mal”, retroalimentando un refuerzo del uso “relajado” del joystick si el usuario siente que sus movimientos involuntarios no afectan gravemente la eficiencia de entrada de texto.
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/howtoS/out222.txt"
download.file(fileUrl, destfile="./out222.txt")
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/chuckedData/out2221022_ggc.txt"
download.file(fileUrl, destfile="./out2221022_ggc.txt")
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/chuckedData/out2221041_ggc.txt"
download.file(fileUrl, destfile="./out2221041_ggc.txt")
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/chuckedData/out2221026.txt"
download.file(fileUrl, destfile="./out2221026.txt")
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/chuckedData/out2221019.txt"
download.file(fileUrl, destfile="./out2221019.txt")
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/chuckedData/out2221016.txt"
download.file(fileUrl, destfile="./out2221016.txt")
fileUrl <- "https://raw.githubusercontent.com/iconodo/mousetrails/main/chuckedData/out2221062.txt"
download.file(fileUrl, destfile="./out2221062.txt")
"simuled_spasm, CTRL1022, CTRL1041, TST1026, TST1019, TST1016 y TST1062" los archivos de datos descargados en el espacio de trabajo de R. Las bases de datos con los nombres CTRLnnnn fueron generados por el Observador. Las bases de datos con los nombres TSTnnnn fueron generados por el Sujeto observado.simuled_spasm <-read.csv("out222.txt", header = TRUE, sep = ",")
CTRL1022 <- read.csv("out2221022_ggc.txt")
CTRL1041 <- read.csv("out2221041_ggc.txt")
TST1026 <- read.csv("out2221026.txt")
TST1019 <- read.csv("out2221019.txt")
TST1016 <- read.csv("out2221016.txt")
TST1062 <- read.csv("out2221062.txt")
library(dplyr)
library(lubridate)
library(ggplot2)
library(ggrepel)
set.seed(42)
options(ggrepel.max.overlaps = Inf)
options(scipen = 999)
library(ggpubr)
str(CTRL1022)
## 'data.frame': 1190 obs. of 8 variables:
## $ deltaX : int -1 -1 -2 -2 -2 -3 -2 -3 -3 -3 ...
## $ deltaY : int 1 1 1 1 1 1 1 1 1 1 ...
## $ WHEN : num 0.174 0.174 0.174 0.174 0.174 ...
## $ SYLLABLE : chr "Yield" "Yield" "Yield" "Yield" ...
## $ XofButton: int 0 0 0 0 0 0 0 0 0 0 ...
## $ YofButton: int 0 0 0 0 0 0 0 0 0 0 ...
## $ XofTrace : int -1 -2 -4 -6 -8 -11 -13 -16 -19 -22 ...
## $ YofTrace : int -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ...
head(CTRL1022,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 1 0.173871 Yield 0 0 -1 -1
tail(CTRL1022,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1190 1 1 0.299299 GO 8 142 496 142 -784
head(CTRL1041,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 1 0.0889905 Yield 0 0 -1 -1
tail(CTRL1041,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1207 1 -1 0.213328 GO 8 372 216 688 -294
head(TST1026,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 -1 0.0633382 Yield 0 0 1 1
tail(TST1026,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1264 1 1 0.189806 GO 8 142 496 83 -475
head(TST1016,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 -1 0.372286 Yield 0 0 -1 1
tail(TST1016,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1308 1 1 0.501011 GO 8 396 426 420 -526
head(TST1062,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 -2 0.0147156 Yield 0 0 -1 2
tail(TST1062,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1018 -1 -1 0.0968911 GO 8 100 161 46 -71
str(simuled_spasm)
## 'data.frame': 735 obs. of 8 variables:
## $ dX : int 0 -21 -10 -15 -15 -11 -10 -10 -10 -7 ...
## $ dY : int -5 -3 -4 -5 -4 -4 -3 -4 -4 -5 ...
## $ WHEN : num 0.0104 0.0104 0.0104 0.0104 0.0104 ...
## $ SYLLABLE: chr "Yield" "Yield" "Yield" "Yield" ...
## $ X : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Y : int 0 0 0 0 0 0 0 0 0 0 ...
## $ cX : int 0 -21 -31 -46 -61 -72 -82 -92 -102 -109 ...
## $ cY : int 5 8 12 17 21 25 28 32 36 41 ...
simuled_spasm <- rename(simuled_spasm, deltaX = dX, deltaY = dY,
WHEN = WHEN, XofButton = X, YofButton = Y,
XofTrace = cX,YofTrace = cY)
head(simuled_spasm, 1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 0 -5 0.0104141 Yield 0 0 0 5
tail(simuled_spasm, 1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 735 -1 1 0.0436071 GO 8 178 594 790 -3525
CTRL1022 <- CTRL1022 %>% mutate(fromfile= "22_ctrl")
TST1026 <- TST1026 %>% mutate(fromfile= "26_test")
TST1016 <- TST1016 %>% mutate(fromfile= "f16_test")
TST1062 <- TST1062 %>% mutate(fromfile= "f62_test")
CTRL1041 <- CTRL1041 %>% mutate(fromfile= "41_ctrl")
TST1019 <- TST1019 %>% mutate(fromfile= "test19")
db1 <- rbind(CTRL1022, TST1026)
db2 <- rbind(db1, CTRL1041)
db3 <- rbind(db2, TST1019)
db4 <- rbind(db3, TST1016)
df_all_research <- rbind(db4, TST1062)
head(df_all_research,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 1 0.173871 Yield 0 0 -1 -1
## fromfile
## 1 22_ctrl
tail(df_all_research,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 7490 -1 -1 0.0968911 GO 8 100 161 46 -71
## fromfile
## 7490 f62_test
head(TST1026,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 -1 0.0633382 Yield 0 0 1 1
## fromfile
## 1 26_test
if(TST1026$WHEN[1] < 1) TST1026 <- TST1026 %>% mutate(WHEN = WHEN * 1000)
head(TST1026,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace fromfile
## 1 1 -1 63.3382 Yield 0 0 1 1 26_test
head(TST1062,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 -2 0.0147156 Yield 0 0 -1 2
## fromfile
## 1 f62_test
if(TST1062$WHEN[1] < 1) TST1062 <- TST1062 %>% mutate(WHEN = WHEN * 1000)
head(TST1062,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace fromfile
## 1 -1 -2 14.7156 Yield 0 0 -1 2 f62_test
san2_in_TST1026 <- filter(TST1026, SYLLABLE == "SAN- 2")
san2_in_TST1026_diffs <- san2_in_TST1026 %>% mutate(when_diff = WHEN - lag(WHEN))
id <-rownames(san2_in_TST1026_diffs)
san2_in_TST1026_diffs <- cbind(id=id, san2_in_TST1026_diffs)
quant25_spans_san2_TST1026_diffs <- quantile(san2_in_TST1026_diffs$when_diff, na.rm = TRUE, 0.25)
quantile(san2_in_TST1026_diffs$when_diff, na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0.0000 0.0175 0.0233 0.0348 1.1204
head(san2_in_TST1026_diffs, 2)
## id deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 -1 -1 92.1658 SAN- 2 387 311 -6 -567
## 2 2 -1 -1 92.1890 SAN- 2 387 311 -7 -566
## fromfile when_diff
## 1 26_test NA
## 2 26_test 0.0232
tia3_in_TST1026 <- filter(TST1026, SYLLABLE == "-TIA- 3")
tia3_in_TST1026_diffs <- tia3_in_TST1026 %>% mutate(when_diff = WHEN - lag(WHEN))
id <-rownames(tia3_in_TST1026_diffs)
tia3_in_TST1026_diffs <- cbind(id=id, tia3_in_TST1026_diffs)
quant25_spans_tia3_TST1026_diffs <- quantile(tia3_in_TST1026_diffs$when_diff, na.rm = TRUE, 0.25)
quantile(tia3_in_TST1026_diffs$when_diff, na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0.0000 0.0170 0.0235 0.0315 0.3490
head(tia3_in_TST1026_diffs, 2)
## id deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 1 -1 107.454 -TIA- 3 329 115 374 -365
## 2 2 1 -1 107.485 -TIA- 3 329 115 375 -364
## fromfile when_diff
## 1 26_test NA
## 2 26_test 0.031
head(CTRL1041,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 -1 1 0.0889905 Yield 0 0 -1 -1
## fromfile
## 1 41_ctrl
if(CTRL1041$WHEN[1] < 1) CTRL1041 <- CTRL1041 %>% mutate(WHEN = WHEN * 1000)
head(CTRL1041,1)
## deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace fromfile
## 1 -1 1 88.9905 Yield 0 0 -1 -1 41_ctrl
fray5_in_CTRL1041 <- filter(CTRL1041, SYLLABLE == "FRAY 5")
fray5_in_CTRL1041_diffs <- fray5_in_CTRL1041 %>% mutate(when_diff = WHEN - lag(WHEN))
id <-rownames(fray5_in_CTRL1041_diffs)
fray5_in_CTRL1041_diffs <- cbind(id=id, fray5_in_CTRL1041_diffs)
quant25_spans_fray5_CTRL1041 <- quantile(fray5_in_CTRL1041_diffs$when_diff, na.rm = TRUE, 0.25)
quantile(fray5_in_CTRL1041_diffs$when_diff, na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0.005 0.020 0.026 0.035 0.067
san6_in_CTRL1041 <- filter(CTRL1041, SYLLABLE == "SAN- 6")
san6_in_CTRL1041_diffs <- san6_in_CTRL1041 %>% mutate(when_diff = WHEN - lag(WHEN))
id <-rownames(san6_in_CTRL1041_diffs)
san6_in_CTRL1041_diffs <- cbind(id=id, san6_in_CTRL1041_diffs)
quant25_spans_san6_CTRL1041 <- quantile(san6_in_CTRL1041_diffs$when_diff, na.rm = TRUE, 0.25)
quantile(san6_in_CTRL1041_diffs$when_diff, na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0.006 0.023 0.029 0.035 0.064
head(fray5_in_CTRL1041_diffs, 2)
## id deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 -2 -1 164.182 FRAY 5 74 137 524 -287
## 2 2 -2 -1 164.188 FRAY 5 74 137 522 -286
## fromfile when_diff
## 1 41_ctrl NA
## 2 41_ctrl 0.006
head(san6_in_CTRL1041_diffs, 2)
## id deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 -1 1 178.974 SAN- 6 109 274 156 -167
## 2 2 -1 1 179.020 SAN- 6 109 274 155 -168
## fromfile when_diff
## 1 41_ctrl NA
## 2 41_ctrl 0.046
go4_in_TST1062 <- filter(TST1062, SYLLABLE == "GO 4")
go4_in_TST1062_diffs <- go4_in_TST1062 %>% mutate(when_diff = WHEN - lag(WHEN))
id <-rownames(go4_in_TST1062_diffs)
go4_in_TST1062_diffs <- cbind(id=id, go4_in_TST1062_diffs)
head(go4_in_TST1062_diffs, 2)
## id deltaX deltaY WHEN SYLLABLE XofButton YofButton XofTrace YofTrace
## 1 1 -1 -1 53.4095 GO 4 49 382 25 -559
## 2 2 -1 -1 53.4698 GO 4 49 382 24 -558
## fromfile when_diff
## 1 f62_test NA
## 2 f62_test 0.0603
quant0_spans_go4_in_TST1062 <- quantile(go4_in_TST1062_diffs$when_diff, na.rm = TRUE, 0.0)
quant25_spans_go4_in_TST1062 <- quantile(go4_in_TST1062_diffs$when_diff, na.rm = TRUE, 0.25)
quant50_spans_go4_in_TST1062 <- quantile(go4_in_TST1062_diffs$when_diff, na.rm = TRUE, 0.50)
quant75_spans_go4_in_TST1062 <- quantile(go4_in_TST1062_diffs$when_diff, na.rm = TRUE, 0.75)
#### (relaxed reinforcement approach)
R_shortCut_0_go4_TST1062 <- go4_in_TST1062_diffs
R_shortCut_25_go4_TST1062 <- filter(R_shortCut_0_go4_TST1062, when_diff >= 0.0232000000000028)
R_shortCut_25_go4_TST1062xs <- R_shortCut_25_go4_TST1062 %>% mutate(XofTrace = XofTrace + lag(deltaX))
R_shortCut_25_go4_TST1062xys <- R_shortCut_25_go4_TST1062xs %>% mutate(YofTrace = YofTrace - lag(deltaY))
# workaround rows with NA values
pal25 <- subset(R_shortCut_25_go4_TST1062xys,is.na(XofTrace))
indpal25 <- pal25$id[1]
append25 <- filter(R_shortCut_0_go4_TST1062, id == indpal25)
R_shortCut_25_go4_TST1062xys <- filter(R_shortCut_25_go4_TST1062xys, id != indpal25)
R_shortCut_25_go4_TST1062xys <- rbind(append25, R_shortCut_25_go4_TST1062xys)
##
R_shortCut_50_go4_TST1062 <- filter(R_shortCut_0_go4_TST1062, when_diff >= quant50_spans_go4_in_TST1062)
R_shortCut_50_go4_TST1062xs <- R_shortCut_50_go4_TST1062 %>% mutate(XofTrace = XofTrace + lag(deltaX))
R_shortCut_50_go4_TST1062xys <- R_shortCut_50_go4_TST1062xs %>% mutate(YofTrace = YofTrace - lag(deltaY))
# workaround rows with NA values
pal50 <- subset(R_shortCut_50_go4_TST1062xys,is.na(XofTrace))
indpal50 <- pal50$id[1]
append50 <- filter(R_shortCut_0_go4_TST1062, id == indpal50)
R_shortCut_50_go4_TST1062xys <- filter(R_shortCut_50_go4_TST1062xys, id != indpal50)
R_shortCut_50_go4_TST1062xys <- rbind(append50, R_shortCut_50_go4_TST1062xys)
##
R_shortCut_75_go4_TST1062 <- filter(R_shortCut_0_go4_TST1062, when_diff >= quant75_spans_go4_in_TST1062)
R_shortCut_75_go4_TST1062xs <- R_shortCut_75_go4_TST1062 %>% mutate(XofTrace = XofTrace + lag(deltaX))
R_shortCut_75_go4_TST1062xys <- R_shortCut_75_go4_TST1062xs %>% mutate(YofTrace = YofTrace - lag(deltaY))
# workaround rows with NA values
pal75 <- subset(R_shortCut_75_go4_TST1062xys,is.na(XofTrace))
indpal75 <- pal75$id[1]
append75 <- filter(R_shortCut_0_go4_TST1062, id == indpal75)
R_shortCut_75_go4_TST1062xys <- filter(R_shortCut_75_go4_TST1062xys, id != indpal75)
R_shortCut_75_go4_TST1062xys <- rbind(append75, R_shortCut_75_go4_TST1062xys)
##
R_shortCut_0_go4_TST1062 <- R_shortCut_0_go4_TST1062 %>% mutate(fromfile= "no shortcut")
R_shortCut_25_go4_TST1062xys <- R_shortCut_25_go4_TST1062xys %>% mutate(fromfile=">= quant25% (O.0232)")
R_shortCut_50_go4_TST1062xys <- R_shortCut_50_go4_TST1062xys %>% mutate(fromfile= ">= quant50% (O.0290)")
R_shortCut_75_go4_TST1062xys <- R_shortCut_75_go4_TST1062xys %>% mutate(fromfile= ">= quant75% (O.0348)")
R_df1 <- rbind(R_shortCut_0_go4_TST1062, R_shortCut_25_go4_TST1062xys)
R_df2 <- rbind(R_df1, R_shortCut_50_go4_TST1062xys)
R_df3 <- rbind(R_df2, R_shortCut_75_go4_TST1062xys)
### (stressesful reinforcement approach)
S_shortCut_0_go4_TST1062 <- go4_in_TST1062_diffs
S_shortCut_25_go4_TST1062 <- filter(S_shortCut_0_go4_TST1062, when_diff <= 0.0232000000000028)
S_shortCut_25_go4_TST1062xs <- S_shortCut_25_go4_TST1062 %>% mutate(XofTrace = XofTrace + lag(deltaX))
S_shortCut_25_go4_TST1062xys <- S_shortCut_25_go4_TST1062xs %>% mutate(YofTrace = YofTrace - lag(deltaY))
# workaround rows with NA values
pal25 <- subset(S_shortCut_25_go4_TST1062xys,is.na(XofTrace))
indpal25 <- pal25$id[1]
append25 <- filter(S_shortCut_0_go4_TST1062, id == indpal25)
S_shortCut_25_go4_TST1062xys <- filter(S_shortCut_25_go4_TST1062xys, id != indpal25)
S_shortCut_25_go4_TST1062xys <- rbind(append25, S_shortCut_25_go4_TST1062xys)
##
S_shortCut_50_go4_TST1062 <- filter(S_shortCut_0_go4_TST1062, when_diff <= quant50_spans_go4_in_TST1062)
S_shortCut_50_go4_TST1062xs <- S_shortCut_50_go4_TST1062 %>% mutate(XofTrace = XofTrace + lag(deltaX))
S_shortCut_50_go4_TST1062xys <- S_shortCut_50_go4_TST1062xs %>% mutate(YofTrace = YofTrace - lag(deltaY))
# workaround rows with NA values
pal50 <- subset(S_shortCut_50_go4_TST1062xys,is.na(XofTrace))
indpal50 <- pal50$id[1]
append50 <- filter(S_shortCut_0_go4_TST1062, id == indpal50)
S_shortCut_50_go4_TST1062xys <- filter(S_shortCut_50_go4_TST1062xys, id != indpal50)
S_shortCut_50_go4_TST1062xys <- rbind(append50, S_shortCut_50_go4_TST1062xys)
##
S_shortCut_75_go4_TST1062 <- filter(S_shortCut_0_go4_TST1062, when_diff <= quant75_spans_go4_in_TST1062)
S_shortCut_75_go4_TST1062xs <- S_shortCut_75_go4_TST1062 %>% mutate(XofTrace = XofTrace + lag(deltaX))
S_shortCut_75_go4_TST1062xys <- S_shortCut_75_go4_TST1062xs %>% mutate(YofTrace = YofTrace - lag(deltaY))
# workaround rows with NA values
pal75 <- subset(S_shortCut_75_go4_TST1062xys,is.na(XofTrace))
indpal75 <- pal75$id[1]
append75 <- filter(S_shortCut_0_go4_TST1062, id == indpal75)
S_shortCut_75_go4_TST1062xys <- filter(S_shortCut_75_go4_TST1062xys, id != indpal75)
S_shortCut_75_go4_TST1062xys <- rbind(append75, S_shortCut_75_go4_TST1062xys)
##
S_shortCut_0_go4_TST1062 <- S_shortCut_0_go4_TST1062 %>% mutate(fromfile= "no shortcut")
S_shortCut_25_go4_TST1062xys <- S_shortCut_25_go4_TST1062xys %>% mutate(fromfile="<= quant25% (O.0232)")
S_shortCut_50_go4_TST1062xys <- S_shortCut_50_go4_TST1062xys %>% mutate(fromfile= "<= quant50% (O.0290)")
S_shortCut_75_go4_TST1062xys <- S_shortCut_75_go4_TST1062xys %>% mutate(fromfile= "<= quant75% (O.0348)")
S_df1 <- rbind(S_shortCut_0_go4_TST1062, S_shortCut_25_go4_TST1062xys)
S_df2 <- rbind(S_df1, S_shortCut_50_go4_TST1062xys)
S_df3 <- rbind(S_df2, S_shortCut_75_go4_TST1062xys)
Un mapa muestra los puntos indicadores de la esquina superior izquierda de los botones de 100x100px que se muestran uno tras otro, por lo que el usuario debe hacer clic en cualquier región del botón para generar el siguiente botón en el que hay que hacer clic. Con la excepción de la tabla generada out222.txt, previamente investigada (miniAudicle version 1.3.5.2 (gidora) git: a8d59b9 Copyright (c) Spencer Salazar; bajo MacOS Catalina 10.15.7 en un iMac (Retina 4k, 2017) con un ratón inalámbrico Apple Magic Mouse 2); el resto de los mapas –TEST generados por el Sujeto con Parálisis Cerebral investigado, CONTROL generados por el Observador– fueron generados en un Sistema Virtual Quemu MacOS High Sierra Version 10.13.6 (en una Samsung intel(R) CoreTM i3, Ubuntu 20.04 System y los scripts fueron ejecutados bajo las versión dde miniAudicle 1.4.1.0 (gidora) git: 9f6ee78 Copyright (c) Spencer Salazar;) con un ratón de joystick de trabajo pesado OPM-200.
De bases de datos cuyos nombres de archivo terminan en número parLos mapas generados por el script “trails.ck” con nombres que terminan en un número par son idénticos en los mismos sistemas; similares en ejecuciones con “sembrados” aleatorios iguales (pero con diferentes configuraciones del sistema); y, accidentalmente, faltan algunos puntos del mapa o se muestran de manera desigual (independientemente de la configuración del sistema) debido a que se agotó el tiempo de espera del botón o se hicieron dos clics.
De bases de datos cuyos nombres de archivo terminan en número imparLos archivos generados pueden desplegar cualesquiera coordenadas de botones, excepto las del botón con la etiqueta “Yield”, que siempre se muestran en X, Y (0,0) en la esquina superior izquierda de la ventana de ejecución del script; a pesar de las configuraciones del sistema, el tiempo de espera o los clics redundantes.
ggSimulated_EvenMap <- ggplot(simuled_spasm, aes(XofButton, -YofButton))
ggSimulated_EvenMap + geom_point(aes(color = SYLLABLE), size = 2, alpha = 1) +
scale_y_continuous(limits = c(-600, 50), breaks = seq(-600, 50, by = 100)) +
scale_x_continuous(limits = c(0, 500), breaks = seq(0, 500, by = 100)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Mapa de botones 'en archivo par' previamente investigado") +
scale_colour_discrete("Botón") +
labs(x = "eje X de la ventana de mapa de botones", y = "eje Y de la ventana de mapa de botones",
caption = "Fig. 1 Mapa del archivo descargado out222.txt / simuled_spasm en el proceso")
"f16_test" y "f62_test", con los gráficos etiquetados "22_ctrl" o "26_test" (de los archivos out2221016.txt , out2221062.txt, out2221022_ggc.txt y out2221022.txt, respectivamente). La columna de la derecha (láminas etiquetadas "41_ctrl" y "test19") de los archivos out2221041_ggc.txt y out2221019.txt, respectivamente. La generación del archivo out2221016.txt –un ejercicio mal observado– muestra en el gráfico f16_test un mapa muy similar al de los gráficos etiquetados como 22_ctrl y 26_test, con la excepción de los últimos tres botones (6,7,8). La generación del archivo out2221062.txt “más enrevesado” –y mejor observado– debe sus diferencias de mapa a que se superó el tiempo de espera para hacer clic en los botones “SAN-2” y “FRAY 5”; a partir de ahí sólo aparece en la ventana el botón -TIA- 7 en la misma relación que en los otros dos gráficos (22_ctrl y 26_test): “hacia arriba, al NorOeste”. Dado que el sistema de ventana Chuck-miniAudicle sitúa el origen en la esquina superior izquierda de la ventana, las coordenadas Y de la ventana crecen hacia abajo con magnitudes positivas, por lo tanto, trazamos las coordenadas de YofButton con el signo cambiado para parecerse a la experiencia visual del observador y del Sujeto durante la ejecución del script.ggTest_Ctrl_maps <- ggplot(df_all_research, aes(x=XofButton, y=-YofButton))
ggTest_Ctrl_maps + geom_point(size = 1.5 ) +
facet_wrap(~fromfile, nrow = 2) +
aes(color = SYLLABLE) +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Mapas de botones generados por el Sujeto/Observador") +
scale_colour_discrete("Botón") +
labs(x = "eje X de la ventana de mapa de botones", y = "eje Y de la ventana de mapa de botones",
caption = "Fig. 2 Mapas de las tomas del Sujeto-test y del Observeador-ctrl")
ggSimulated_EvenTrace <- ggplot(simuled_spasm, aes(XofTrace, YofTrace))
ggSimulated_EvenTrace + geom_point(aes(color = SYLLABLE), size = 1) +
scale_y_continuous(limits = c(min(simuled_spasm[,"YofTrace"]), max(simuled_spasm[,"YofTrace"])), breaks = seq(min(simuled_spasm[,"YofTrace"]), max(simuled_spasm[,"YofTrace"]), by = 500)) +
scale_x_continuous(limits = c(min(simuled_spasm[,"XofTrace"]), max(simuled_spasm[,"XofTrace"])), breaks = seq(min(simuled_spasm[,"XofTrace"]), max(simuled_spasm[,"XofTrace"]), by = 500)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Un espasmo simulado en la trayecgtoria FRAY 1") +
scale_colour_discrete("Segmento") +
labs(x = "eje X de trayectorias", y = "eje Y de trayectorias",
caption = "Fig. 3 Trayectorias del archivo out222.txt / simuled_spasm en el proceso")
"22_ctrl", "26_test", "41_ctrl", "f16_test", "f62_test" y "test19" (de los archivos out2221022_ggc.txt, out2221026.txt, out2221041_ggc.txt, out2221016.txt, out2221062.txt y out2221019.txt, respectivamente). Justo al comenzar la ejecución para el archivo out2221026.txt (lámina 26_test), el Sujeto de la investigación se dio cuenta de que no tenía los anteojos puestos, pero el observador le indicó que siguiera adelante con los caminos propuestos por los botones que aparecían. Su inquietud se muestra en el segmento “Yield” especialmente intrincado, en comparación con los rastros relativamente menos intrincados que se muestran en la gráfica test19. En comparación con los experimentos del Observador etiquetados como "22_ctrl" y "41_ctrl" que muestran algunos senderos casi completamente rectos, todos los experimentos del Sujetos de investigación (láminas con encabezados ‘test’) muestran grados de movimientos involuntarios.ggTest_Ctrl_traces <- ggplot(df_all_research, aes(x=XofTrace, y=YofTrace))
ggTest_Ctrl_traces + geom_point(size=.75) +
facet_wrap(~fromfile, nrow = 2) +
aes(color = SYLLABLE) +
theme(plot.caption = element_text(hjust = 0)) +
labs(x = "eje X de trayectorias", y = "eje Y de trayectorias",
caption = "Fig. 4 Trayectorias de ejercicios del Sujeto-test y del Observer-ctrl") +
scale_colour_discrete("Segmento") +
labs(title = "Trayectorias de Sujeto/Observador en las tablas investigadas")
ggTST1026Trace <- ggplot(TST1026, aes(XofTrace, YofTrace))
ggTST1026Trace + geom_point(aes(color = SYLLABLE), size = 1, alpha = 1/3) +
scale_y_continuous(limits = c(min(TST1026[,"YofTrace"]), max(TST1026[,"YofTrace"])), breaks = seq(min(TST1026[,"YofTrace"]), max(TST1026[,"YofTrace"]), by = 250)) +
scale_x_continuous(limits = c(min(TST1026[,"XofTrace"]), max(TST1026[,"XofTrace"])), breaks = seq(min(TST1026[,"XofTrace"]), max(TST1026[,"XofTrace"]), by = 200)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Sujeto en una situación estresante") +
scale_colour_discrete("Segmento") +
labs(x = "eje X de trayectorias", y = "eje Y de trayectorias",
caption = "Fig. 5 Trayectorias en el archivo out2221026.txt ---TST1026/26_test en el proceso")
ggSan2_1026 <- ggplot(san2_in_TST1026_diffs, aes(x=XofTrace, y=YofTrace))
ggSan2_1026 + geom_count(mapping=aes(color=ifelse(when_diff <= 0.01730, substr(when_diff,1,7), NA)),
size = 1.5)+
scale_y_continuous(limits = c(min(san2_in_TST1026_diffs[,"YofTrace"]),
max(san2_in_TST1026_diffs[,"YofTrace"])),
breaks = seq(min(san2_in_TST1026_diffs[,"YofTrace"]),
max(san2_in_TST1026_diffs[,"YofTrace"]), by = 100)) +
scale_x_continuous(limits = c(min(san2_in_TST1026_diffs[,"XofTrace"]),
max(san2_in_TST1026_diffs[,"XofTrace"])),
breaks = seq(min(san2_in_TST1026_diffs[,"XofTrace"]),
max(san2_in_TST1026_diffs[,"XofTrace"]), by = 100)) +
scale_colour_discrete("Intervalos de tiempo") +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Movimientos más rápidos ('estresados') del segmento SAN- 2 (de 222 observaciones)") +
labs(x = "Magnitudes en el eje horizontal de movimientos del ratón",
y = "Magnitudes en el eje vertical de movimientos del ratón",
caption = "Fig. 6 Segmento SAN- 2 en el archivo out2221026.txt (TST1026/26_test) del Sujeto Investigado. Etiquetas: '#observación[intervalo desde la marca anterior'")+
geom_text_repel(min.segment.length = 0,
size = 3,
force = 2,
segment.color = '#cccccc',
segment.size = 0.5,
box.padding = unit(2, 'lines'),
point.padding = unit(.25, 'lines'),
nudge_x = -10,
nudge_y = 9,
aes(label=ifelse(when_diff <= 0.01730,
paste(id,"[", substr(when_diff,1,7)),NA)))
ggTia3_1026 <- ggplot(tia3_in_TST1026_diffs, aes(x=XofTrace, y=YofTrace))
ggTia3_1026 + geom_count(mapping=aes(color=ifelse(when_diff < quant25_spans_tia3_TST1026_diffs,
substr(when_diff,1,9), NA)), size = 1.5)+
scale_y_continuous(limits = c(min(tia3_in_TST1026_diffs[,"YofTrace"]), max(tia3_in_TST1026_diffs[,"YofTrace"])), breaks = seq(min(tia3_in_TST1026_diffs[,"YofTrace"]), max(tia3_in_TST1026_diffs[,"YofTrace"]), by = 50)) +
scale_x_continuous(limits = c(min(tia3_in_TST1026_diffs[,"XofTrace"]), max(tia3_in_TST1026_diffs[,"XofTrace"])), breaks = seq(min(tia3_in_TST1026_diffs[,"XofTrace"]), max(tia3_in_TST1026_diffs[,"XofTrace"]), by = 50)) +
scale_colour_discrete("Intervalos de tiempo") +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Movimientos más rápidos ('estresados') del segmento -TIA- 3") +
labs(x = "Magnitudes en el eje horizontal de movimientos del ratón",
y = "Magnitudes en el eje vertical de movimientos del ratón",
caption = "Fig. 7 Segmento -TIA- 3 en el archivo out2221026.txt (TST1026/26_test) del Sujeto Investigado. Etiquetas: '#observación[intervalo desde la marca anterior'")+
geom_text_repel(min.segment.length = 0,
size = 3,
force = 3,
segment.color = '#cccccc',
segment.size = 0.5,
box.padding = unit(2.5, 'lines'),
point.padding = unit(.25, 'lines'),
nudge_x = 7,
nudge_y = 9,
aes(label=ifelse(when_diff <= quant25_spans_tia3_TST1026_diffs,
paste(id,"[", substr(when_diff,1,7)),NA)))
gg1062_Trace <- ggplot(TST1062, aes(XofTrace, YofTrace))
gg1062_Trace + geom_point(aes(color = SYLLABLE), size = 1, alpha = .75) +
scale_y_continuous(limits = c(min(TST1062[,"YofTrace"]), max(TST1062[,"YofTrace"])), breaks = seq(min(TST1062[,"YofTrace"]), max(TST1062[,"YofTrace"]), by = 250)) +
scale_x_continuous(limits = c(min(TST1062[,"XofTrace"]), max(TST1062[,"XofTrace"])), breaks = seq(min(TST1062[,"XofTrace"]), max(TST1062[,"XofTrace"]), by = 200)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Sujeto en una situación NO estresada") +
scale_colour_discrete("Segmento") +
labs(x = "eje X de trayectorias", y = "eje Y de trayectorias",
caption = "Fig. 8 Trayectorias en el archivo out2221062.txt ---TST1062/62_test en el proceso")
# progresión de las observaciones
xxx <- ggplot(go4_in_TST1062_diffs, aes(x=as.integer(id), y=substr(when_diff,1,9)))
go4_diff_levels_progress <- xxx + geom_count(mapping=aes(color=substr(when_diff,1,9)), size = 4) +
geom_line(aes(group = 1), size = 1/3) +
scale_colour_discrete("Intervalos de tiempo") +
labs(x = "Progresión de las observaciones", y = "Intervalos de tiempo") +
theme(plot.caption = element_text(hjust = 0)) + # set the left align here
labs(title = "Seg. GO 4. Fluctuaciones de estrés sobre la cabeza del joystick",
caption = "Fig. 9 Segmento GO 4 del archivo out2221062.txt ---TST1062/f62_test en el proceso. Etiquetas: # de observación") +
geom_text(aes(label = paste0(id)), nudge_x = 1)
# trayectoria etiquetada
yyy <- ggplot(go4_in_TST1062_diffs, aes(x=XofTrace, y=YofTrace))
go4_trail <- yyy + geom_count(mapping=aes(color=ifelse(when_diff >= quant0_spans_go4_in_TST1062,
substr(when_diff,1,9), NA)), size = 3)+
scale_y_continuous(limits = c(min(go4_in_TST1062_diffs[,"YofTrace"]),
max(go4_in_TST1062_diffs[,"YofTrace"])),
breaks = seq(min(go4_in_TST1062_diffs[,"YofTrace"]),
max(go4_in_TST1062_diffs[,"YofTrace"]), by = 50)) +
scale_x_continuous(limits = c(min(go4_in_TST1062_diffs[,"XofTrace"]),
max(go4_in_TST1062_diffs[,"XofTrace"])),
breaks = seq(min(go4_in_TST1062_diffs[,"XofTrace"]),
max(go4_in_TST1062_diffs[,"XofTrace"]), by = 50)) +
scale_colour_discrete("Intervalos de tiempo") +
labs(x = "eje X de la trayectoria", y = "eje Y de la trayectoria")+
theme(plot.caption = element_text(hjust = 0)) + # set the left align here
labs(title = "Segmento GO 4. Trazo de los movimientos del ratón",
caption = "Fig. 10 Segmento GO 4 del archivo out2221062.txt ---TST1062/f62_test en el proceso---, del Sujeto investigado. Etiquetas: # de observación") +
geom_text_repel(min.segment.length = 0,
size = 3,
force = 5,
segment.color = '#cccccc',
segment.size = 0.5,
box.padding = unit(2, 'lines'),
point.padding = unit(.3, 'lines'),
nudge_x = -3,
nudge_y = -2,
aes(label=ifelse(when_diff >= quant0_spans_go4_in_TST1062, paste(id),NA)))
# arreglo en la misma página
figures9n10 <- ggarrange(go4_diff_levels_progress, go4_trail,
common.legend = TRUE,
legend = "bottom")
# print plot
figures9n10
R_plot <- ggplot(R_df3, aes(x=XofTrace, y=YofTrace))
R_shcuts <- R_plot + geom_point(size=2) +
facet_wrap(~fromfile, nrow = 2) +
aes(color = substr(when_diff,1,9)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(x = "eje X de la trayectoria", y = "eje Y de la trayectoria",
caption = "Fig. 11 Segmento GO 4 del archivo out2221062.txt ---TST1062/f62_test--- en el proceso") +
scale_colour_discrete("Intervalos de tiempo") +
labs(title = "Reforzamiento de un enfoque relajado. Recorte hipotético de observaciones")
# progresión de las observaciones
xxx <- ggplot(go4_in_TST1062_diffs, aes(x=as.integer(id), y=substr(when_diff,1,9)))
R_go4_diff_levels_progress <- xxx + geom_count(mapping=aes(color=substr(when_diff,1,9)), size = 4) +
geom_line(aes(group = 1), size = 1/3) +
scale_colour_discrete("Intervalos de tiempo") +
labs(x = "Progresión de las observaciones", y = "Niveles de intervalos de tiempo") +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Segmento GO 4. Fluctuaciones de estrés sobre la cabeza del joystick",
caption = "Fig. 12 Segmento GO 4 del archivo out2221062.txt ---TST1062/f62_test en el proceso---, del Sujeto investigado. Etiquetas: # de observación") +
geom_text(aes(label = paste0(id)), nudge_x = 1)
# arreglo en la misma página
figures11n12 <- ggarrange( R_shcuts, R_go4_diff_levels_progress,
common.legend = TRUE,
legend = "bottom")
# print plot
figures11n12
S_plot <- ggplot(S_df3, aes(x=XofTrace, y=YofTrace))
S_shcuts <- S_plot + geom_point(size=2) +
facet_wrap(~fromfile, nrow = 2) +
aes(color = substr(when_diff,1,9)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(x = "eje X de la trayectoria", y = "eje Y de la trayectoria",
caption = "Fig. 13 Segmento GO 4 del archivo out2221062.txt ---TST1062/f62_test--- en el proceso") +
scale_colour_discrete("Intervalos de tiempo") +
labs(title = "Reforzamiento de un enfoque estresado. Recorte hipotético de observaciones")
# progresión de las observaciones
yyy <- ggplot(go4_in_TST1062_diffs, aes(x=as.integer(id), y=substr(when_diff,1,9)))
S_go4_diff_levels_progress <- yyy + geom_count(mapping=aes(color=substr(when_diff,1,9)), size = 4) +
geom_line(aes(group = 1), size = 1/3) +
scale_colour_discrete("Intervalos de tiempo") +
labs(x = "Progresión de las observaciones", y = "Niveles de intervalos de tiempo") +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Segmento GO 4. Fluctuaciones de estrés sobre la cabeza del joystick",
caption = "Fig. 14 Segmento GO 4 del archivo out2221062.txt ---TST1062/f62_test en el proceso---, del Sujeto investigado. Etiquetas: # de observación") +
geom_text(aes(label = paste0(id)), nudge_x = 1)
# arreglo en la misma página
figures13n14 <- ggarrange( S_shcuts, S_go4_diff_levels_progress,
common.legend = TRUE,
legend = "bottom")
# print plot
figures13n14
“Magnitudes de estrés” sobre la cabeza del joystick del mouse, en términos de intervalos de tiempo entre los movimientos del mouse en los segmentos FRAY 5 y SAN-6 del archivo out2221041_ggc.txt (CTRL1041/41_ctrl en el proceso). El Observador sostiene/suelta la cabeza del joystick con la mano derecha y hace clic con el botón izquierdo del ratón con la mano izquierda. Sólo ocasionalmente, como al principio del segmento SAN-6, el observador arrastró el joystick en una dirección totalmente indeseada.
Fig. 15 Toma del Observador: trazos contenidos en el archivo out2221041_ggc.txt —CTRL1041/41_ctrl.
ggCTRL1041Trace <- ggplot(CTRL1041, aes(XofTrace, YofTrace))
ggCTRL1041Trace + geom_point(aes(color = SYLLABLE), size = 1) +
scale_y_continuous(limits = c(min(CTRL1041[,"YofTrace"]), max(CTRL1041[,"YofTrace"])), breaks = seq(min(CTRL1041[,"YofTrace"]), max(CTRL1041[,"YofTrace"]), by = 100)) +
scale_x_continuous(limits = c(min(CTRL1041[,"XofTrace"]), max(CTRL1041[,"XofTrace"])), breaks = seq(min(CTRL1041[,"XofTrace"]), max(CTRL1041[,"XofTrace"]), by = 100)) +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Trayectorias en el experimento del Observador") +
scale_colour_discrete("Segmento") +
labs(x = "Eje X de los trazos", y = "Eje Y de los trazos",
caption = "Fig. 15 Trazos en el archivo out2221041_ggc.txt CTRL1041/41_ctrl in el proceso")
ggFray5_1041 <- ggplot(fray5_in_CTRL1041_diffs, aes(x=XofTrace, y=YofTrace))
ggFray5_1041 + geom_count(mapping=aes(color=ifelse(when_diff <= quant25_spans_fray5_CTRL1041, substr(when_diff,1,6), NA)), size = 2)+
scale_y_continuous(limits = c(min(fray5_in_CTRL1041_diffs[,"YofTrace"]), max(fray5_in_CTRL1041_diffs[,"YofTrace"])), breaks = seq(min(fray5_in_CTRL1041_diffs[,"YofTrace"]), max(fray5_in_CTRL1041_diffs[,"YofTrace"]), by = 100)) +
scale_x_continuous(limits = c(min(fray5_in_CTRL1041_diffs[,"XofTrace"]), max(fray5_in_CTRL1041_diffs[,"XofTrace"])), breaks = seq(min(fray5_in_CTRL1041_diffs[,"XofTrace"]), max(fray5_in_CTRL1041_diffs[,"XofTrace"]), by = 100)) +
scale_colour_discrete("Time span") +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Observaciones con marca de tiempo más estresadas/rápidas en el segmento FRAY 5") +
labs(x = "Magnitudes en el eje horizontal de movimientos del ratón",
y = "Magnitudes en el eje vertical de movimientos del ratón",
caption = "Fig. 16 Segmento FRAY 5 del archivo out2221041_ggc.txt (CTRL1041/41_ctrl en el proceso) Etiquetas: '# de Observación[intervalo de tiempo'")+
geom_text_repel(min.segment.length = 0,
size = 3,
force = 5,
segment.color = '#cccccc',
segment.size = 0.5,
box.padding = unit(1, 'lines'),
point.padding = unit(.25, 'lines'),
nudge_x = -7,
nudge_y = 6,
aes(label=ifelse(when_diff < quant25_spans_fray5_CTRL1041, paste(id,"[", substr(when_diff,1,7)),NA)))
ggSan6_1041 <- ggplot(san6_in_CTRL1041_diffs, aes(x=XofTrace, y=YofTrace))
ggSan6_1041 + geom_count(mapping=aes(color=ifelse(when_diff <= quant25_spans_san6_CTRL1041, substr(when_diff,1,7), NA)), size = 2)+
scale_y_continuous(limits = c(min(san6_in_CTRL1041_diffs[,"YofTrace"]), max(san6_in_CTRL1041_diffs[,"YofTrace"])), breaks = seq(min(san6_in_CTRL1041_diffs[,"YofTrace"]), max(san6_in_CTRL1041_diffs[,"YofTrace"]), by = 100)) +
scale_x_continuous(limits = c(min(san6_in_CTRL1041_diffs[,"XofTrace"]), max(san6_in_CTRL1041_diffs[,"XofTrace"])), breaks = seq(min(san6_in_CTRL1041_diffs[,"XofTrace"]), max(fray5_in_CTRL1041_diffs[,"XofTrace"]), by = 100)) +
scale_colour_discrete("Intervalo de tiempo") +
theme(plot.caption = element_text(hjust = 0)) +
labs(title = "Observaciones con marca de tiempo más estresadas/rápidas en el segmento SAN-6") +
labs(x = "Magnitudes en el eje horizontal de movimientos del ratón",
y = "Magnitudes en el eje vertical de movimientos del ratón",
caption = "Fig. 17 Segmento FRAY 5 del archivo out2221041_ggc.txt (CTRL1041/41_ctrl en el proceso) Etiquetas: '# de Observación[intervalo de tiempo'")+
geom_text_repel(min.segment.length = 0,
size = 3,
force = 5,
segment.color = '#cccccc',
segment.size = 0.5,
box.padding = unit(1, 'lines'),
point.padding = unit(.25, 'lines'),
nudge_x = -7,
nudge_y = 6,
aes(label=ifelse(when_diff <= quant25_spans_san6_CTRL1041, paste(id,"[", substr(when_diff,1,7)),NA)))
Pseudocódigo para ser probado en los scripts de Chuck/miniAudicle antes de intentarlo en el propio código Dasher. El refuerzo de la retroalimentación visual de movimientos relajados sería algo como lo siguiente: “SI SÓLO y SÓLO SI el manejo de la cabeza del ratón ES MÁS LENTO que el umbral de un parámetro de configuración/entrenamiento, actualizar la posición del cursor en la ventana del programa”.
Inicio del programa “control de movimientos del mouse con joystick”
COMENTARIO: formato de declaración de variables: tipo de variable, nombre de variable [= opcional/valor de configuración]
numeric, Threshold
position, window.mousePosition
mousePosition, previousMousePosition = origin
mousePosition, newMousePosition = origin
movement, mouseMovement = MOVEDnot
gate, goAhead = TRUE
Beginning of EXTERNAL Loop {
if goAhead is TRUE: {
window.mousePosition = window.newMousePosition
} else if goAhead is FALSE: {
window.mousePosition = window.previousMousePosition
} endif
Beginning of INTERNAL Loop {
if mouseMovement turns MOVEDyes: {
update newMousePosition with mouseMovement.timeStampedDifference
} endif
if newMousePosition.mouseMovement.timeStampedDifference is SLOWER than Threshold: {
update previousMousePosition with newMousePosition
go to Beginning of EXTERNAL loop with goAhead = TRUE
} else if FASTER than Threshold: {
go to Beginning of EXTERNAL loop with goAhead = FALSE
} else if EQUAL to Threshold: {
go to Beginning of INTERNAL loop
} endif
} End of INTERNAL loop
} End of EXTERNAL loop
Fin del programa “control de movimientos del mouse con joystick”