“every step [less] deeper into the analysis takes a soul [up, up and] away…”

…attributed to Teilhard de Chardin, except for my bracketed lack of “beautiful” statistical “balloons”

SYNOPSIS. “Dasher is a competitive text-entry system wherever a full-size keyboard cannot be used.” In Certain Cerebral Palsy Users of Dasher, joystick mouses are preferential. Depending on handicap degrees, neuromuscular issues and spasms may hamper fluidity of use. This paper attempts the characterization of a primordial number of mouse trails strokes significant for the betterment of Dasher use. The inclusion of that identification into Dasher C++ source; and suggesting a solution (holding/getting back, getting ahead) in the cursor position would ideally help the use of Dasher, and ease the nervous tension; a spasms trigger itself. The generation of a user’s “strokes dictionary”/magnitudes threshold able to come together with the language dictionaries training engines of the Dasher would be the ultimate step for this research. The system configurations for this February/2022 paper was: macOS Monterey Version 12.2 on iMac (iMac (Retina 4K, 21.5-inch, 2017), 3 GHz Intel Core i5 with 4 nuclei processor, 8 GB 2400 MHz DDR4 of RAM; Version 1.3.1073 © 2009-2020 RStudio, PBC, Inc., under R version 4.0.2 (2020-06-22) – “Taking Off Again”. The mouse movements text files researched in this paper were generated under two configurations: I.- miniAudicle version 1.3.5.2 (gidora) git: a8d59b9 Copyright (c) Spencer Salazar; MacOS Catalina 10.15.7 on iMac (Retina 4k, 2017) with a wireless Apple Magic Mouse 2. II.- miniAudicle version 1.4.1.0 (gidora) git: 9f6ee78 Copyright (c) Spencer Salazar; Quemu MacOS High Sierra Version 10.13.6 Virtual System (on a Samsung intel(R) CoreTM i3, Ubuntu 20.04 System) with a heavy duty OPM-200 joystick mouse.

PREAMBLE. (Note.- Please right click links below and click open link in new window/tab)

Towards easing the use of Dasher.

Here is a demo of Dasher use configured with “normal” control options resembling a video game environment in which the scene (a wall filled with text predictions) reacts as the user moves the cursor closer to the wall, proposing suitable routes of text construction. The Subject in this previous video does not have movement handicaps. Our Cerebral Palsy target user writes with Dasher under “pulsation” control options which allow to approach the “scene” (the text proposing wall) moving the mouse cursor accordingly, situating the cursor, and finally clicking on the left button of the joystick mouse. This three actions magnify the text wall and get new propositions of text construction predictions, until a word is constructed and a new cycle begins after a space or another orthographic element is entered.

Capturing the mouse trails.

Running of script trails.ck coded in Chuck/miniAudicle –a robust time managing music language/graphic environment–, renders text files containing information about mouse movements. Each written row holds delta X and delta Y magnitudes, cumulative columns of those magnitudes, miniAudicle’s Virtual Machine time stamps in seconds/Thousandths of a second, X and Y coordinates of labeled (Yield, FRAY 1, SAN- 2, etc.) buttons that need to be hovered and clicked on in order to display next button (up to eight in each single Subject test or control take). X and Y buttons coordinates feeds the user with a map of consecutive targets in the displayed window. Plotting both: the maps, and the trajectories between buttons, give visual ideas about the qualities (e.g. straight versus twisted lines) of the take. Further timing analysis give information about the “stress” quality of the joystick head manipulation (e.g. faster versus slower movements). Data files and previous research for this paper can be found in following GitHub’s mousetrails page. Similarly to Dasher’s use under “pulsation” control options, the script trails.ck requires from our target user several repetitive actions that she performs with the same left hand: holding the joystick, moving the cursor towards the proposed button, releasing the joystick, clicking the left mouse button, and waiting until the next button in the script appears.

A “pattern(less) identification” surrender, yet.

Holding and releasing the OPM_200 mouse joystick head may include trails “bumps” in Cerebral Palsy users; same as with spasms, depending of the user stress level. The analysis below typifies faster/“most stressed” movements more likely to occur before and after mouse paths twists; more evident where trails show that Subject became aware of a “wrongly going” mouse trajectory towards next button clicking. Instead of trying to conceptualize a spasm pattern dictionary per se, a simpler approach would consist of a per Dasher session calibration round, to establish a threshold under which faster movements (more likely to produce undesired paths) are filtered in order to reach the resemblance of a Dasher use under “normal” control options as in the demo video above. Feeding Dasher code with fastest/“most stressed” magnitudes of mouse strokes, or establishing a threshold, would allow to “straighten out” the Dasher interface progression; and, might help discarding “wrongly going” paths, feeding back a reinforcement of “relaxed” use of the joystick if the user feels that her involuntary movements don’t affect badly the text input efficiency.

1. DATA PROCESSING

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. EXPLORATORY PATH FINDINGS

2.1 Exploring button maps and trajectories in downloaded dataframes

A map shows points indicators of the upper left corner of 100x100 buttons displayed one after the other so the user has to click in any region of the button in order to generate the next clickable button. With the exception of previously researched generated table out222.txt (miniAudicle version 1.3.5.2 (gidora) git: a8d59b9 Copyright (c) Spencer Salazar; in a MacOS Catalina 10.15.7 on iMac (Retina 4k, 2017) with a wireless Apple Magic Mouse 2); rest of maps –TEST by researched Cerebral Palsy Subject, CONTROL by Observer– were generated in a Quemu MacOS High Sierra Version 10.13.6 Virtual System (on a Samsung intel(R) CoreTM i3, Ubuntu 20.04 System and the scripting was run in miniAudicle version 1.4.1.0 (gidora) git: 9f6ee78 Copyright (c) Spencer Salazar;) with a heavy duty OPM-200 joystick mouse.

2.1.1 Maps
  • From even numbers ending named tables

Generated maps by the “trails.ck” script with names ending in an even number are identical in same systems; similar in equally random seeded (but different system configurations) script runnings; and, accidentally, some map points are missing or unequally displayed (no matter what system configuration) due to button timing out or double clicking.

  • From odd numbers ending named tables

Generated files can render whatever buttons coordinates except for “Yield” labeled buttons, always displayed in X,Y (0,0) upper left corner of scripted excercise window; despite system configurations, timing out or double clickings.

  • Fig.1 below: generated map from PREVIOUSLY researched generated file out222.txt (simuled_spam/22_ctrl in process)
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 = "Previously researched 'even' buttons map") +
        scale_colour_discrete("Button label") +
        labs(x = "x axis of buttons map window", y = "y axis of buttons map window", 
        caption = "Fig. 1 Map from downloaded file out222.txt")

  • Fig. 2 shows maps generated either by Researched Subject or by Observer. Left and center columns show maps differences in plots labeled "f16_test" and "f62_test", to plots labeled "22_ctrl" or "26_test" (from files out2221016.txt, out2221062.txt, out2221022_ggc.txt and out2221022.txt, respectively). The right column, (plots labeled "41_ctrl" and "test19") from files out2221041_ggc.txt and out2221019.txt, respectively. The generation of file out2221016.txt –a poorly observed excercise– shows in plot f16_test a very similar map as in plots labeled 22_ctrl and 26_test, with exception of last three buttons (6,7,8). The generation of file out2221062.txt “more convoluted” –and better observed– owes its map differences to no clicking time outs on “SAN- 2” and “FRAY 5” buttons; from there on, only button -TIA- 7 appears in the window in the same relation as in the other two plots(22_ctrl and 26_test): “upwards towards NorhWest”. Since Chuck-miniAudicle window system situates origin in the upper left corner of the window, Y window coordinates grow downwards in the positive magnitudes, thus we plot YofButton coordinates with sign changed in order to resemble observer and Subject visual experience during the running of the 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 = "Subject/Observer Generated Button Maps") +
        scale_colour_discrete("Button label") +
        labs(x = "x axis of buttons map window", y = "y axis of buttons map window", 
        caption = "Fig. 2 Maps from subject-test and observer-ctrl exercices")

2.1.2 Trajectories
  • A mouse path segment from an excercise is labeled in the table rows by the column SYLLABLE. Is generated by the mouse movements towards the buttons in the excercise window. Next buttons appear after clicking on them or timing out occurring. First button prompt is labeled “Yield”, and trajectory “Yield” starts from mouse cursor standing position previous to the launching of the excercise. With the exception of the previously generated excercise, observer has situated manually the cursor close to the right where button “Yield” will appear. From then on cumulative path coordinates XofTrace, YofTrace starting with values (0,0) will render a table with accumulated deltaX and deltaY mouse movement magnitudes. Since Chuck-miniAudicle window system situates origin in the upper left corner of the window, Y window coordinates grow downwards in the positive magnitudes, thus we directly accumulate YofTrace column values with minus deltaY magnitudes in order to resemble Subject movements as in the script excercise. Fig. 3 show trajectories from previously researched file 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 = "A spasm simulated in FRAY 1 trajectory") +
        scale_colour_discrete("Segment") +
        labs(x = "x axis of traces", y = "y axis of traces",
        caption = "Fig. 3 Traces from file out222.txt / simuled_spasm in the process")

  • Fig. 4 shows traces from researched Subject/Observer excercises in plots labeled "22_ctrl", "26_test", "41_ctrl", "f16_test", "f62_test" and "test19" (from files out2221022_ggc.txt, out2221026.txt, out2221041_ggc.txt, out2221016.txt, out2221062.txt, and out2221019.txt, respectively). After starting running for file out2221026.txt (plot 26_test), the Research Subject realized that she had not her eye glasses on, but was prompted by the Observer to go on following the paths proposed by the appearing buttons. Her uneasiness is shown by the specially convoluted “Yield” segment, as compared to the relatively less convoluted traces shown in test19 plot. Compared to Observer’s experiments labeled "22_ctrl" and "41_ctrl" showing some trails almost completely straight, all Research Subject experiments (‘test’ headed plots) show degrees of involuntary movements.
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 = "x axis of traces", y = "y axis of traces",
      caption = "Fig. 4 Traces from subject-test and observer-ctrl exercices") +
      scale_colour_discrete("Segment") +
      labs(title = "Subject/Observer Traces from researched tables")

2.2 Hypotheses Probing

  • Probing time spans of consecutive miniAudicle script mouse movements (mouse deltaX and deltaY magnitudes) in a given miniAudicle Virtual Machine time value, in visually “convoluted” segments rendered by Research Subject (as in sections “stressed” 2.2.1 and “not stressed” 2.2.2 sections below); and, comparing with “not convoluted” segments rendered by Research Observer (section 2.2.3) will allow us to characterize different magnitudes of stress over the mouse joystick head. More stressed mouse movements result in shorter spans between consecutive movements in the observations (rows) of the files researched. The shortest span registrations are characterized in the plots below with a value of 0 with no decimals; meaning that two successive movements were registered in the same miniAudicle Virtual Machine time stamp. In “outlier” section 2.2.2 we attempt to characterize Research Subject magnitudes of stress that seemingly do not have a strong correlation with the segment trajectory, leaning us to adopt a displayed mouse movements (points plotted) trimming strategy.
2.2.1 STRESSED. A Research Subject selected “sans” eyeglasses experiment.
  • As mentioned before Subject started the experiment and soon said she had not her glasses on. The resulting stress showed more or less throughout the whole excercise. Fig. 5 shows more precisely the convolutions caused by the stress.
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 = "Subject on a stressful situation") +
        scale_colour_discrete("Segment") +
        labs(x = "x axis of traces", y = "y axis of traces",
        caption = "Fig. 5 Traces from file out2221026.txt ---TST1026/26_test--- in the process")

2.2.1.1 Segment -SAN- 2 (file out2221026.txt, TST1026…/26_test)
  • Fig. 6 shows fast movements (and stress) in segment SAN- 2. Time spans of value 0 with no decimal places point to mouse movements registered in the same miniAudicle Virtual Machine time stamp. Labeling all points below quantile 25% at 0.01750 clutters the plot with 50+ labels, suggesting a more stressed segment than next -TIA- 3 segment in Fig.7. Downgrading the threshold to time spans below 0.01730 allows to more clearly read a story with less (37 in both segments) labeled observations.
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("Time spans") +
  theme(plot.caption = element_text(hjust = 0)) + 
  labs(title = "Most stressed movements in segment SAN- 2 (of 222 observations)") +
  labs(x = "Horizontal mouse movement magnitudes", y = "Vertical mouse movement magnitudes", 
       caption = "Fig. 6 Segment SAN- 2 from subject's file out2221026.txt (TST1026/26_test). Labels: 'obs#[span from previous'")+
  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)))

  • As explained below, most stressed spans of value 0 show in both segments the increase of pressure before or after direction loss and corrections. In the Fig. 6 upper picture, points 15 and 116 seem to denote maximum strength after path corrections; while points 139 and 142 apparently show the stress of a new loss of direction.
2.2.1.2 Segment -TIA- 3 (file out2221026.txt, TST1026…/26_test)
  • Fig. 7 shows faster movements (and stress) in segment -TIA- 3. Time spans of value 0 with no decimal places points to two consecutive mouse movements registered in the same miniAudicle Virtual Machine time stamp: the previous point and the 0 stamped one. The plate below draws a “wrong” direction as early as the first contact with the head mouse; and shows no points, exception made for number 6, under the 0.01730 threshold, as if the Subject were discounting those involuntary movements as out of the target task oriented specific movements. But after turning direction at point 10, pressure increases while getting aware of a very “wrong” direction after points 21, 40; and 0 value points are present before and after point 54 change of direction. Again, after point 119 turn.
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("Time span") +
        theme(plot.caption = element_text(hjust = 0)) + 
        labs(title = "Most stressed time stamped movements in segment -TIA- 3") +
        labs(x = "Horizontal mouse movement magnitudes", y = "Vertical mouse movement magnitudes", 
        caption = "Fig. 7 Segment -TIA- 3 from file out2221026.txt (TST1026/26_test) Labels: 'obs#[span from previous'")+
        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 “NOT STRESSED”. A Researched Subject experiment.
  • Fig. 8 This observed annotated running in plate below, despite its twists, does not contain great nor many fast or stressed mouse head movements. Details of out2221062.txt file take can be read in this report.
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 = "Subject on a NOT stressful situation") +
        scale_colour_discrete("Segment") +
        labs(x = "x axis of traces", y = "y axis of traces",
        caption = "Fig. 8 Traces from file out2221062.txt ---TST1062/f62_test--- in the process")

2.2.2.1 An outlier segment?
  • Fig. 9 / Fig.10 below show observations progress with levels of stress; and, labeled trajectory of the 39 observations of GO 4 segment from file out2221062.txt (TST1062/f62_test).
# observations progress
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("Time spans") +
        labs(x = "Observations progress", y = "Time span levels") +
        theme(plot.caption = element_text(hjust = 0)) + # set the left align here
        labs(title = "Segment GO 4. Stress fluctuations on joystick head", 
              caption = "Fig. 9 GO 4 segment from file out2221062.txt ---TST1062/f62_test--- in the process. Labels: observation #") +
         geom_text(aes(label = paste0(id)), nudge_x = 1)


# labeled trajectory
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("Time spans") +
        labs(x = "X axis of mouse movements", y = "Y axis of mouse movements")+
        theme(plot.caption = element_text(hjust = 0)) + # set the left align here
        labs(title = "Segment GO 4. Mouse movements path", 
             caption = "Fig. 10 GO 4 segment from subject's file out2221062.txt ---TST1062/f62_test--- in the process. Labels: observation #") +
         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)))



# in same page arrange 
figures9n10 <- ggarrange(go4_diff_levels_progress, go4_trail,
                   common.legend = TRUE, 
                   legend = "bottom")
# print plot
figures9n10

  • The figures above hold a narrative about the subject’s perceptions and responses while performing the task of taking the mouse cursor from obscured point 1 in the graph, to end of segment point 39 where next 100x100 button had to be clicked –a rather short segment, not visually prone to generate uneasiness/stress. As in previous segment start shown in Fig. 7, first points were traced under an involuntary or inaccurate movement. Inaccuracies, or highly precise movements, are difficult to avoid/achieve if you are not aware of the trails writing task; even if you don’t suffer —as our researched Subject— spasms or involuntary/innacurate neuromuscular issues.
2.2.2.1.1 Reinforcemnt Feedback of a Relaxed Approach
  • Fig. 11 / Fig. 12 try to illustrate what we call a “reinforcement of a relaxed approach”, where the user would be feedbacked with cursor displays prone to prevent discomfort. Our Subject, a battery moved wheelchair longtime user, is more or less immune to good/bad responsiveness of the wheelchair’s driving joystick.
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 = "x axis of traces", y = "y axis of traces",
             caption = "Fig. 11 GO 4 segment from file out2221062.txt ---TST1062/f62_test--- in the process") +
        scale_colour_discrete("Time stamped spans") +
        labs(title = "Reinforcement Feedback of a relaxed approach. Hypothetical path trimmings")

# observations progress
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("Time spans") +
        labs(x = "Observations progress", y = "Time span levels") +
        theme(plot.caption = element_text(hjust = 0)) + # set the left align here
        labs(title = "Segment GO 4. Stress fluctuations on joystick head", 
              caption = "Fig. 12 GO 4 segment from file out2221062.txt ---TST1062/f62_test--- in the process. Label: observation #") +
         geom_text(aes(label = paste0(id)), nudge_x = 1)



 
# in same page arrange 
figures11n12 <- ggarrange( R_shcuts, R_go4_diff_levels_progress,
                   common.legend = TRUE, 
                   legend = "bottom")
# print plot
figures11n12

2.2.2.1.2 Reinforcemnt feedbck of a Stressed Approach
  • Fig. 13 / Fig. 14 try to illustrate what we call a “stressed reinforcement approach”, where the user would be feedbacked with cursor displays prone to reinforce uneasy fast/stressed movements. Despite the fact that our Subject, a battery moved wheelchair longtime user, is more or less immune to good/bad responsiveness of the wheelchair’s driving joystick.
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 = "x axis of traces", y = "y axis of traces",
             caption = "Fig. 13 GO 4 segment from file out2221062.txt ---TST1062/f62_test--- in the process") +
        scale_colour_discrete("Time stamped spans") +
        labs(title = "Reinforcement Feedback of a stressed approach. Hypothetical path trimmings")


# observations progress
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("Time spans") +
        labs(x = "Observations progress", y = "Time span levels") +
        theme(plot.caption = element_text(hjust = 0)) + # set the left align here
        labs(title = "Segment GO 4. Stress fluctuations on joystick head", 
              caption = "Fig. 14 GO 4 segment from file out2221062.txt ---TST1062/f62_test--- in the process. Label: observation #") +
         geom_text(aes(label = paste0(id)), nudge_x = 1)

 
# in same page arrange 
figures13n14 <- ggarrange( S_shcuts, S_go4_diff_levels_progress,
                   common.legend = TRUE, 
                   legend = "bottom")
# print plot
figures13n14

  • From an “economy of displayed movements” standpoint, namely a cursor’s displayed activity less responsive to joystick handling, it is evident that plates 11 and 13 in subplots titled “>= quant75% (0.0348)” and “<= quant25% (0.0232)”, respectively, are the forerunners. However, the approach under this last “<= quant25% (0.0232)”, even though seemingly the one that “reaches” the segment end at points 38 and 39; in first 15 points of that “wholly undesired” wrong direction section, the approach would theoretically only provide the visual support of only one point (#10) of observation: one supportive movement among 15. On the other hand, the approach under“>= quant75% (0.0348)” subplot of plate 11 would provide up to 5 supportive displayed movements, including point #15 (the slowest movement of the segment at 0.2553) before the change of direction. Our wishful guess is that providing those 5 supportive mouse movements —less dramatic as the displaying and perception of the whole 15 points segment at its reported speed—, the Subject would make the corrective turn before reaching the 5th.
2.2.3 A CONTROL RESEARCH BY OBSERVER.
  • “Magnitudes of stress” over the mouse joystick head, in terms of time spans between mouse movements in Segments FRAY 5 and SAN- 6 from file out2221041_ggc.txt (CTRL1041/41_ctrl in the process). The observer holds/releases joystick head with the right hand, and left clicks the mouse with the left hand. Only occasionally, as in beginning of segment SAN- 6, the observer moved the joystick towards a wholly undesired direction.

  • Fig. 15 Observer’s take: traces from file 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 = "Paths from observer's experiment") +
        scale_colour_discrete("Segment") +
        labs(x = "x axis of traces", y = "y axis of traces",
        caption = "Fig. 15 Traces from file out2221041_ggc.txt CTRL1041/41_ctrl in the process")

  • Fig. 16 and Fig. 17 below show similar degrees of Observer stress over the mouse head. In both segments, occurrences of two fastest movements (points 85 and 91 in segment FRAY 5, points 12 and 19 in segment SAN- 6) under their respective segment quantile 25% threshold occur before and after same section of change of direction/twist; even though, change of direction after point 84 in below FRAY 5 segment is rather subtle. While FRAY 5 segment direction is upwards, and SAN- 6 direction is downwards, both pairs of fastest movements in their segment occur at an observation distance of 6 and 7 observation points, respectively.
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 = "Most stressful/fastest time stamped observations in segment FRAY 5") +
        labs(x = "Horizontal mouse movement magnitudes", y = "Vertical mouse movement magnitudes", 
        caption = "Fig. 16 Segment FRAY 5 from file out2221041_ggc.txt (CTRL1041/41_ctrl in the process) Labels: 'obs#[span from previous'")+
         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 Segment SAN- 6 with a wholly undesired twist
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("Time span") +
         theme(plot.caption = element_text(hjust = 0)) + 
        labs(title = "Most stressful/fastest time stamped observations in segment SAN- 6") +
        labs(x = "Horizontal mouse movement magnitudes", y = "Vertical mouse movement magnitudes", 
        caption = "Fig. 17 Segment FRAY 5 from file out2221041_ggc.txt (CTRL1041/41_ctrl in the process) Labels: 'obs#[span from previous'")+
         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. CONCLUSIONS

4. TO DO