“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.

1. PROCESAMIENTO DE DATOS

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

2. HALLAZGOS DE LA EXPLORACIÓN DE TRAZOS

2.1 Exploración de mapas de botones y trayectorias en las bases de datos descargadas

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.

2.1.1 Mapas
  • De bases de datos cuyos nombres de archivo terminan en número par

Los 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 impar

Los 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.

  • Fig. 1 a continuación: mapa generado a partir del ejercicio PREVIAMENTE investigado: out222.txt (simuled_spam/22_ctrl en el proceso)
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")

  • La Fig. 2 muestra los mapas generados por el Sujeto investigado o por el Observador. Las columnas izquierda y central muestran las diferencias de los mapas en los gráficos etiquetados "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")

2.1.2 Trayectorias
  • Un segmento de ruta de ratón de un ejercicio está etiquetado en las filas de la tabla por la columna SYLLABLE. Es generado por los movimientos del mouse hacia los botones en la ventana del ejercicio. Los siguientes botones aparecen después de hacer clic en ellos o cuando se agota el tiempo de espera. El indicador del primer botón está etiquetado como “Yield”, y la trayectoria “Yield” comienza desde la posición del cursor del mouse antes del inicio del ejercicio. A excepción del ejercicio generado anteriormente, el observador ha situado manualmente el cursor cerca de la derecha donde aparecerá el botón “Yield”. A partir de ese momento, las coordenadas de ruta acumuladas XofTrace, YofTrace, comenzando con los valores (0,0), generarán una tabla con las magnitudes de movimiento del mouse deltaX y deltaY acumuladas. Dado que el sistema de ventana Chuck-miniAudicle sitúa el origen en la esquina superior izquierda de la ventana, las coordenadas de la ventana Y crecen hacia abajo en magnitudes positivas, por lo que acumulamos directamente los valores de la columna YofTrace restando las magnitudes deltaY para reproducir los movimientos del Sujeto tal como se visualizaron en la ejecución del script. La Fig. 3 muestra las trayectorias del archivo investigado anteriormente out222.txt
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")

  • La Fig. 4 muestra rastros de ejercicios investigados del Sujeto/Observador en gráficos etiquetados como "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")

2.2 Sondeos de hipótesis

  • El sondeo de intervalos de tiempo de movimientos consecutivos del ratón en el script miniAudicle: magnitudes deltaX y deltaY en un determinado tiempo de reloj de la Máquina Virtual del miniAudicle, en segmentos visualmente “intrincados” en las tomas del Sujeto de la investigación (como aparecen en las secciones 2.2.1 “estresada” y 2.2.2 “no estresada”, abajo); y, la comparación con segmentos “no intrincados” en tomas del Observador de la investigación (sección 2.2.3) nos permitirán caracterizar diferentes magnitudes de estrés ejercido sobre la cabeza del ratón joystick. Los movimientos de ratón más estresados dan por resultado intervalos de tiempo más cortos entre movimientos consecutivos en las observaciones (filas) de los archivos investigados. Los intervalos más cortos caracterizados en las láminas de abajo son aquéllos de valor 0 sin decimales; lo que significa que dos movimientos consecutivos fueron registrados en la misma marca de tiempo de la Máquina Virtual del miniAudicle. En la sección “outlier” 2.2.2 intentamos caracterizar magnitudes de estrés del Sujeto investigado que aparentemente no presentan una fuerte correlación con la trayectoria del segmento, inclinándonos a adoptar una estrategia de recorte en el despliegue de los movimientos (puntos impresos) del ratón.
2.2.1 ESTRESADA. Un experimento “sin gafas” de la Sujeto investigada.
  • Como se menciona arriba, la Sujeto de la investigación empezó la toma y muy pronto dijo que no tenía sus gafas puestas. El estrés resultante salió a la superficie más o menos durante todo el ejercicio. La Fig. 5 muestra con precisión las intricaciones causadas por el estrés.
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")

2.2.1.1 Segmento -SAN- 2 (file out2221026.txt, TST1026…/26_test)
  • Fig. 6 muestra movimientos rápidos (y estrés) en el segmento SAN- 2. Los intervalos de tiempo con valor 0 sin decimales señalan movimientos del ratón registrados en la misma marca de tiempo de reloj de la Máquina Virtual del miniAudicle. Etiquetar todos los puntos por debajo del cuantil 25% (0.01750) atiborra la gráfica con 50+ etiquetas, sugiriendo la presencia de más estrés en este segmento que en el siguiente -TIA- 3 de la Fig. 7. Reducir el umbral a intervalos de tiempo por abajo de 0.01730 permite una más clara lectura de lo sucedido, con menos observaciones (37 en ambos segmentos) etiquetadas.
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)))

  • Como se explica a continuación, la mayoría de los tramos tensionados de valor 0 muestran en ambos segmentos el aumento de presión antes o después de la pérdida de dirección y las correcciones efectuadas. En la imagen superior de la Fig. 6, los puntos 15 y 116 parecen indicar la fuerza máxima después de las correcciones de trayectoria; mientras que los puntos 139 y 142 muestran aparentemente el estrés de una nueva pérdida de rumbo.
2.2.1.2 Segmento -TIA- 3 (archivo out2221026.txt, TST1026…/26_test)
  • La Fig. 7 muestra movimientos más rápidos (y estrés) en el segmento -TIA- 3. Lapsos de tiempo de valor 0 sin decimales apuntan a dos movimientos de mouse consecutivos registrados en la misma marca de tiempo de la Máquina Virtual miniAudicle: el punto anterior y el marcado con 0. La lámina a continuación dibuja una dirección “incorrecta” desde el primer contacto con la cabeza del ratón; y no muestra puntos, a excepción del número 6, por debajo del umbral de 0.01730; como si el Sujeto estuviera descontando esos movimientos involuntarios como movimientos específicos orientados a la tarea objetivo. Pero después de girar la dirección en el punto 10, la presión aumenta mientras se da cuenta de una dirección muy “incorrecta” después de los puntos 21, 40; y los puntos de valor 0 están presentes antes y después del cambio de dirección del punto 54. Nuevamente, después del giro alrededor del punto 119.
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)))

2.2.2 “NO ESTRESADA”. Un experimento del Sujeto Investigado.
  • Fig. 8 Esta ejecución (observada y anotada) del script, de la lámina de abajo, a pesar de sus giros, no contiene grandes ni muchos movimientos rápidos o estresados de la cabeza del ratón. Los detalles de la toma del archivo out2221062.txt se pueden leer en este informe.
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")

2.2.2.1 ¿Un segmento “fuera de lugar” (outlier)?
  • Las Fig. 9 / Fig.10 a continuación muestran el progreso de las observaciones con los niveles de estrés; y la trayectoria etiquetada de las 39 observaciones del segmento GO 4 del archivo out2221062.txt (TST1062/f62_test).
# 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

  • Las figuras de arriba contienen una narración sobre las percepciones y respuestas del Sujeto mientras ejecuta la tarea de llevar el cursor del mouse desde el punto 1, oscurecido en el gráfico, hacia al siguiente botón de 100x100px situado alrededor del punto 39 del segmento. Un segmento bastante corto que no es visualmente propenso a generar malestar/estrés. Como en el inicio del segmento anterior que se muestra en la Fig. 7, los primeros puntos se trazaron bajo un movimiento involuntario o impreciso al sujetar el joystick. Las imprecisiones, o los movimientos de alta precisión, son más difíciles de evitar/lograr si no se está al tanto de la escritura subyacente de los senderos; incluso si no se sufren —como en nuestro Sujeto investigado— espasmos/problemas neuromusculares.
2.2.2.1.1 Reforzamiento de un Enfoque Relajado
  • Las Fig. 11 / Fig. 12 intentan ilustrar lo que llamamos “refuerzo de un enfoque relajado”, donde el usuario sería retroalimentado con despliegues del cursor tendientes a evitar incomodidad. Nuestra Sujeto, una antigua usuario de silla de ruedas movida por batería, es más o menos inmune a la buena o mala respuesta del joystick de conducción de la silla de ruedas.
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

2.2.2.1.2 Reforzamiento de un Enfoque Estresado
  • Las Fig. 13 / Fig. 14 intentan ilustrar lo que llamamos “refuerzo de un enfoque estresado”, en el que el usuario sería retroalimentado con despliegues del cursor tendientes a reforzar movimientos rápidos/estresados. A pesar del hecho de que nuestra Sujeto, una usuaria de silla de ruedas movida por batería desde hace mucho tiempo, es más o menos inmune a la buena o mala respuesta del joystick de conducción de la silla de ruedas.
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

  • Desde el punto de vista de la “economía de los movimientos mostrados”, a saber, la actividad mostrada de un cursor que responda menos al manejo del joystick, es evidente que las Figuras 11 y 13 en las subláminas tituladas “>= quant75% (0.0348)” y “<= quant25% (0.0232)”, respectivamente, van a a la cabeza. Sin embargo, el enfoque bajo este último “<= quant25% (0.0232)”, aunque aparentemente sea el que “llega” al extremo del segmento en los puntos 38 y 39; en los primeros 15 puntos de esa sección de “dirección incorrecta totalmente no deseada”, el enfoque “estresado” teóricamente solo proporcionaría el apoyo visual de un solo punto (# 10) de observación: un movimiento de apoyo entre 15. Por otro lado, el enfoque bajo la sublámina “> = quant75% (0.0348)” de la Fig. 11 proporcionaría hasta 5 movimientos de apoyo, incluido el punto n.º 15 (el movimiento más lento del segmento, en 0.2553999) antes del cambio de dirección. Nuestra aspiración es que proporcionando esos 5 movimientos de apoyo del mouse —menos dramáticos que la visualización y percepción del segmento completo de 15 puntos a su velocidad reportada (subláminas bajo el título “no shorcut” = sin recortes)—, el Sujeto haría el giro correctivo antes de llegar al quinto y último de esos movimientos de apoyo; mejorando así su desempeño.
2.2.3 UNA INVESTIGACIÓN DE CONTROL POR EL OBSERVADOR.
  • “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")

  • La Fig. 16 y la Fig. 17 a continuación muestran grados similares de estrés del observador sobre la cabeza del ratón. En ambos segmentos, las ocurrencias de dos movimientos más rápidos (puntos 85 y 91 en el segmento FRAY 5, puntos 12 y 19 en el segmento SAN- 6) debajo de su respectivo umbral cuantil 25% de segmento, ocurren antes y después de la misma sección de cambio de dirección/giro; aunque, el cambio de dirección después del punto 84 en el segmento FRAY 5, debajo, es bastante sutil. Mientras que la dirección del segmento FRAY 5 es hacia arriba y la dirección del segmento SAN-6 es hacia abajo, ambos pares de movimientos más rápidos en su segmento ocurren a una distancia de observación de 6 y 7 puntos de observación, respectivamente.
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)))

  • Fig. 17 Segmento SAN- 6 con un cambio de dirección totalmente indeseado
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)))

3. CONCLUSIONES

4. POR HACER