library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rstatix)
## 
## Attaching package: 'rstatix'
## 
## The following object is masked from 'package:stats':
## 
##     filter
library(ggplot2)
library(ggpubr)
library(ez)
library(lme4)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
library(lmerTest)
## 
## Attaching package: 'lmerTest'
## 
## The following object is masked from 'package:lme4':
## 
##     lmer
## 
## The following object is masked from 'package:stats':
## 
##     step
library(dplyr)

setwd("~/conducta_aud_tms/fMRI_task_aud/csvlog/taskswitch")


ts <- read_csv("ts_correctas.csv")
## Rows: 178 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): subj, tx, condition, sesion
## dbl (1): correct_responses
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Filtrar sujetos con ambas sesiones
sujetos_completos <- ts %>%
  group_by(subj) %>%
  filter(all(c("ses-01", "ses-02") %in% sesion)) %>%
  ungroup()


table(sujetos_completos$subj, sujetos_completos$sesion)
##         
##          ses-01 ses-02
##   sub-01      2      2
##   sub-03      2      2
##   sub-04      2      2
##   sub-05      2      2
##   sub-06      2      2
##   sub-07      2      2
##   sub-08      2      2
##   sub-09      2      2
##   sub-10      2      2
##   sub-11      2      2
##   sub-12      2      2
##   sub-13      2      2
##   sub-14      2      2
##   sub-15      2      2
##   sub-16      2      2
##   sub-17      2      2
##   sub-18      2      2
##   sub-19      2      2
##   sub-20      2      2
##   sub-22      2      2
##   sub-24      2      2
##   sub-25      2      2
##   sub-28      2      2
##   sub-29      2      2
##   sub-30      2      2
##   sub-31      2      2
##   sub-32      2      2
##   sub-33      2      2
##   sub-34      2      2
##   sub-35      2      2
##   sub-36      2      2
##   sub-37      2      2
##   sub-38      2      2
##   sub-40      2      2
##   sub-42      2      2
##   sub-43      2      2
##   sub-44      2      2
##   sub-45      2      2
##   sub-46      2      2
##   sub-47      2      2
##   sub-48      2      2

Filtrar los datos de la condicion switch para los 3 grupos, revisar los supuestos de normalidad y efectuar anova

#filtrar para switch
datos_switch <- sujetos_completos %>%
  filter(condition == "switch")

#Verificar normalidad de datos 
# QQ-Plot
ggplot(datos_switch, aes(sample = correct_responses)) +
  geom_qq() +
  facet_grid(tx ~ sesion) +
  geom_qq_line()

# Shapiro-Wilk por grupo
datos_switch %>%
  group_by(tx, sesion) %>%
  shapiro_test(correct_responses)
#Prueba de Levene para la homogeneidad de varianzas
datos_switch %>%
  levene_test(correct_responses ~ tx * sesion)
#Se cumplieron los supuestos 
# Modelo ANOVA
modelo <- anova_test(
  data = datos_switch,
  dv = correct_responses,
  wid = subj,       # Variable de identificación de sujetos
  between = tx,     # Factor entre-sujetos
  within = sesion   # Factor intra-sujetos
)

# Resultados
summary(modelo)
##     Effect               DFn             DFd           F        
##  Length:3           Min.   :1.000   Min.   :38   Min.   :1.108  
##  Class :character   1st Qu.:1.500   1st Qu.:38   1st Qu.:1.555  
##  Mode  :character   Median :2.000   Median :38   Median :2.002  
##                     Mean   :1.667   Mean   :38   Mean   :2.000  
##                     3rd Qu.:2.000   3rd Qu.:38   3rd Qu.:2.446  
##                     Max.   :2.000   Max.   :38   Max.   :2.890  
##        p             p<.05                ges        
##  Min.   :0.0970   Length:3           Min.   :0.0290  
##  1st Qu.:0.1230   Class :character   1st Qu.:0.0315  
##  Median :0.1490   Mode  :character   Median :0.0340  
##  Mean   :0.1957                      Mean   :0.0340  
##  3rd Qu.:0.2450                      3rd Qu.:0.0365  
##  Max.   :0.3410                      Max.   :0.0390
get_anova_table(modelo)
#reportar resultados 
cat(
  "Efecto de tx: F(2, 38) =", round(modelo$F[1], 3), ", p =", round(modelo$p[1], 3), 
  "\nEfecto de sesion: F(1, 38) =", round(modelo$F[2], 3), ", p =", round(modelo$p[2], 3),
  "\nInteracción tx:sesion: F(2, 38) =", round(modelo$F[3], 3), ", p =", round(modelo$p[3], 3)
)
## Efecto de tx: F(2, 38) = 1.108 , p = 0.341 
## Efecto de sesion: F(1, 38) = 2.89 , p = 0.097 
## Interacción tx:sesion: F(2, 38) = 2.002 , p = 0.149
#No significativo para SWITCH

Filtrar los datos de la condicion noswitch para los 3 grupos, revisar los supuestos de normalidad y efectuar anova

#filtrar para noswitch
datos_noswitch <- sujetos_completos %>%
  filter(condition == "noswitch")

#Verificar normalidad de datos 
# QQ-Plot
ggplot(datos_noswitch, aes(sample = correct_responses)) +
  geom_qq() +
  facet_grid(tx ~ sesion) +
  geom_qq_line()

# Shapiro-Wilk por grupo
datos_noswitch %>%
  group_by(tx, sesion) %>%
  shapiro_test(correct_responses)
#Prueba de Levene para la homogeneidad de varianzas
datos_noswitch %>%
  levene_test(correct_responses ~ tx * sesion)
#Se cumplieron los supuestos 
# Modelo ANOVA
modelo_noswitch <- anova_test(
  data = datos_noswitch,
  dv = correct_responses,
  wid = subj,       # Variable de identificación de sujetos
  between = tx,     # Factor entre-sujetos
  within = sesion   # Factor intra-sujetos
)

# Resultados
summary(modelo)
##     Effect               DFn             DFd           F        
##  Length:3           Min.   :1.000   Min.   :38   Min.   :1.108  
##  Class :character   1st Qu.:1.500   1st Qu.:38   1st Qu.:1.555  
##  Mode  :character   Median :2.000   Median :38   Median :2.002  
##                     Mean   :1.667   Mean   :38   Mean   :2.000  
##                     3rd Qu.:2.000   3rd Qu.:38   3rd Qu.:2.446  
##                     Max.   :2.000   Max.   :38   Max.   :2.890  
##        p             p<.05                ges        
##  Min.   :0.0970   Length:3           Min.   :0.0290  
##  1st Qu.:0.1230   Class :character   1st Qu.:0.0315  
##  Median :0.1490   Mode  :character   Median :0.0340  
##  Mean   :0.1957                      Mean   :0.0340  
##  3rd Qu.:0.2450                      3rd Qu.:0.0365  
##  Max.   :0.3410                      Max.   :0.0390
get_anova_table(modelo)
#reportar resultados 
cat(
  "Efecto de tx: F(2, 38) =", round(modelo_noswitch$F[1], 3), ", p =", round(modelo_noswitch$p[1], 3), 
  "\nEfecto de sesion: F(1, 38) =", round(modelo_noswitch$F[2], 3), ", p =", round(modelo_noswitch$p[2], 3),
  "\nInteracción tx:sesion: F(2, 38) =", round(modelo_noswitch$F[3], 3), ", p =", round(modelo_noswitch$p[3], 3)
)
## Efecto de tx: F(2, 38) = 3.054 , p = 0.059 
## Efecto de sesion: F(1, 38) = 0.223 , p = 0.64 
## Interacción tx:sesion: F(2, 38) = 2.819 , p = 0.072

Efecto de tx significativo para noswitch Post-hoc

pairwise_t_test(
  data = datos_noswitch,
  correct_responses ~ tx,
  p.adjust.method = "bonferroni"
)

Vizualizacion switch

viz_switch <- ggplot(datos_switch, aes(x = sesion, y = correct_responses, color = tx, group = tx)) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2, alpha = 0.8) +
  stat_summary(fun = mean, geom = "point", size = 3.5, shape = 19) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15, linewidth = 0.8, alpha = 0.6) +
  labs(
    title = "Interacción Tratamiento × Sesión (Condición Switch)",
    subtitle = "ANOVA: Efectos no significativos (p > 0.05)",
    x = "Sesión", 
    y = "Respuestas Correctas (Switch)",
    color = "Tratamiento",
    caption = "Error bars: ±1 SEM"
  ) +
  theme_minimal(base_size = 13) +
  scale_color_manual(
    values = c("control" = "#E41A1C", "active" = "#377EB8", "sham" = "#4DAF4A")
  ) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray30", size = 11),
    legend.position = "top",
    panel.grid.major = element_line(color = "gray90"),
    axis.text = element_text(color = "black")
  ) 

viz_switch

Visualizacion noswitch con etiquetas

viz_noswitch <- ggplot(datos_noswitch, aes(x = sesion, y = correct_responses, color = tx, group = tx)) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2, alpha = 0.8) +
  stat_summary(fun = mean, geom = "point", size = 3.5, shape = 19) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15, linewidth = 0.8, alpha = 0.6) +
  labs(
    title = "Interacción Tratamiento × Sesión (Condición No-Switch)",
    subtitle = "ANOVA: tx (p = 0.059), sesión (p = 0.64), interacción (p = 0.072)",
    x = "Sesión", 
    y = "Respuestas Correctas (No-Switch)",
    color = "Tratamiento",
    caption = "Error bars: ±1 SEM"
  ) +
  theme_minimal(base_size = 13) +
  scale_color_manual(
    values = c("control" = "#E41A1C", "active" = "#377EB8", "sham" = "#4DAF4A")
  ) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray30", size = 11),
    legend.position = "top",
    panel.grid.major = element_line(color = "gray90"),
    axis.text = element_text(color = "black")
  ) 
  
annotations <- data.frame(
  sesion = c("ses-01", "ses-02"),
  correct_responses = rep(max(datos_noswitch$correct_responses) * 1.05, 2),  # Posición Y
  label = c("†", "†"),  # Símbolo de efecto marginal
  tx = "control") 

viz_noswitch +
  geom_text(
    data = annotations,
    aes(x = sesion, y = correct_responses, label = label),
    color = "black", size = 6, fontface = "bold",
    inherit.aes = FALSE  # Ignora los aesthetics del gráfico principal
  )

MLM para condiciones switch y noswitch Efecto aleatorio (1|subj)

modelo_noswitch <- lmer(
  correct_responses ~ tx * sesion + (1 | subj),
  data = datos_noswitch,
  REML = TRUE 
)

summary_noswitch<-summary(modelo_noswitch)
summary_noswitch
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: correct_responses ~ tx * sesion + (1 | subj)
##    Data: datos_noswitch
## 
## REML criterion at convergence: 429
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.0025 -0.1465  0.1579  0.5941  1.2503 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  subj     (Intercept)  1.382   1.175   
##  Residual             12.166   3.488   
## Number of obs: 82, groups:  subj, 41
## 
## Fixed effects:
##                        Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)             20.2143     0.9837 75.2176  20.549  < 2e-16 ***
## txcontrol                4.1857     1.3678 75.2176   3.060  0.00307 ** 
## txsham                   1.9524     1.4480 75.2176   1.348  0.18159    
## sesionses-02             2.9286     1.3183 38.0000   2.221  0.03235 *  
## txcontrol:sesionses-02  -3.9286     1.8330 38.0000  -2.143  0.03856 *  
## txsham:sesionses-02     -3.7619     1.9405 38.0000  -1.939  0.06000 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) txcntr txsham ssn-02 txc:-02
## txcontrol   -0.719                             
## txsham      -0.679  0.489                      
## sesionss-02 -0.670  0.482  0.455               
## txcntrl:-02  0.482 -0.670 -0.327 -0.719        
## txshm:ss-02  0.455 -0.327 -0.670 -0.679  0.489
resultados_noswitch <- summary_noswitch$coefficients

# P-valores para efectos específicos:
p_txcontrol <- resultados_noswitch["txcontrol", "Pr(>|t|)"]        # 0.00307 (significativo)
p_txsham <- resultados_noswitch["txsham", "Pr(>|t|)"]              # 0.18159 (no significativo)
p_sesion <- resultados_noswitch["sesionses-02", "Pr(>|t|)"]        # 0.03235 (significativo)
p_interaccion_control <- resultados_noswitch["txcontrol:sesionses-02", "Pr(>|t|)"]  # 0.03856 (significativo)
p_interaccion_sham <- resultados_noswitch["txsham:sesionses-02", "Pr(>|t|)"]        # 0.06000 (marginal)
# Para efectos globales (opcional)
p_global_tx <- 0.05890       # Efecto principal de tx (marginal)
p_global_interaccion <- 0.07221  # Interacción tx:sesion (marginal)

#Para efectos fijos
anova_noswitch<-anova(modelo_noswitch, type = 3) 


mlm_noswitch<-ggplot(datos_noswitch, aes(x = sesion, y = correct_responses, color = tx, group = tx)) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
  stat_summary(fun = mean, geom = "point", size = 3) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.1) +
  labs(
    title = "MLM: Efectos en condición 'noswitch'",
    x = "Sesión", 
    y = "Respuestas Correctas (noswitch)",
    color = "Tratamiento"
  ) +
  theme_minimal() +
  scale_color_brewer(palette = "Set1")

# Añadir anotaciones de significancia
mlm_noswitch <- mlm_noswitch +
  annotate("text", x = 1, y = max(datos_noswitch$correct_responses) * 1.05, 
           label = ifelse(p_txcontrol < 0.01, "**", 
                          ifelse(p_txcontrol < 0.05, "*", 
                                 ifelse(p_txcontrol < 0.1, "†", ""))), 
           color = "black", size = 8, fontface = "bold") +
  annotate("text", x = 1.5, y = max(datos_noswitch$correct_responses) * 1.1, 
           label = ifelse(p_interaccion_control < 0.05, "*", 
                          ifelse(p_interaccion_control < 0.1, "†", "")), 
           color = "#377EB8", size = 8, fontface = "bold") +
  annotate("text", x = 2, y = max(datos_noswitch$correct_responses[datos_noswitch$tx == "sham"]) * 1.05,
           label = ifelse(p_interaccion_sham < 0.1, "†", ""), 
           color = "#4DAF4A", size = 6, fontface = "bold") +
  annotate("text", x = Inf, y = -Inf, 
           label = "** p < 0.01, * p < 0.05, † p < 0.1 (marginal)",
           hjust = 1.1, vjust = -0.5, size = 3.5, color = "gray40")

mlm_noswitch

#-------------------------SWITCH------------------------

modelo_switch <- lmer(
  correct_responses ~ tx * sesion + (1 | subj),
  data = datos_switch,
  REML = TRUE 
)

summary_switch<-summary(modelo_switch)
summary_switch
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: correct_responses ~ tx * sesion + (1 | subj)
##    Data: datos_switch
## 
## REML criterion at convergence: 361.7
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.7437 -0.2094  0.2292  0.4994  1.5524 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  subj     (Intercept) 1.252    1.119   
##  Residual             4.447    2.109   
## Number of obs: 82, groups:  subj, 41
## 
## Fixed effects:
##                        Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)             11.7857     0.6380 72.5020  18.473   <2e-16 ***
## txcontrol                2.0810     0.8871 72.5020   2.346   0.0217 *  
## txsham                   0.6310     0.9391 72.5020   0.672   0.5038    
## sesionses-02             1.7857     0.7970 38.0000   2.240   0.0310 *  
## txcontrol:sesionses-02  -2.1857     1.1082 38.0000  -1.972   0.0559 .  
## txsham:sesionses-02     -0.7857     1.1732 38.0000  -0.670   0.5071    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) txcntr txsham ssn-02 txc:-02
## txcontrol   -0.719                             
## txsham      -0.679  0.489                      
## sesionss-02 -0.625  0.449  0.424               
## txcntrl:-02  0.449 -0.625 -0.305 -0.719        
## txshm:ss-02  0.424 -0.305 -0.625 -0.679  0.489
resultados_switch <- summary_switch$coefficients

# P-valores para efectos específicos:
ps_txcontrol <- resultados_switch["txcontrol", "Pr(>|t|)"]        # 0.00307 (significativo)
ps_txsham <- resultados_switch["txsham", "Pr(>|t|)"]              # 0.18159 (no significativo)
ps_sesion <- resultados_switch["sesionses-02", "Pr(>|t|)"]        # 0.03235 (significativo)
ps_interaccion_control <- resultados_switch["txcontrol:sesionses-02", "Pr(>|t|)"]  # 0.03856 (significativo)
ps_interaccion_sham <- resultados_switch["txsham:sesionses-02", "Pr(>|t|)"]        # 0.06000 (marginal)
# Para efectos globales (opcional)
ps_global_tx <- 0.05890       # Efecto principal de tx (marginal)
ps_global_interaccion <- 0.07221  # Interacción tx:sesion (marginal)

#Para efectos fijos
switch_aov<-anova(modelo_switch, type = 3) 
switch_aov
mlm_switch<-ggplot(datos_switch, aes(x = sesion, y = correct_responses, color = tx, group = tx)) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2) +
  stat_summary(fun = mean, geom = "point", size = 3) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.1) +
  labs(
    title = "MLM: Efectos en condición 'switch'",
    x = "Sesión", 
    y = "Respuestas Correctas (switch)",
    color = "Tratamiento"
  ) +
  theme_minimal() +
  scale_color_brewer(palette = "Set1")

mlm_switch <- mlm_switch +
  annotate("text", x = 1, y = max(datos_switch$correct_responses) * 1.05, 
           label = ifelse(ps_txcontrol < 0.01, "**", 
                          ifelse(ps_txcontrol < 0.05, "*", 
                                 ifelse(ps_txcontrol < 0.1, "†", ""))), 
           color = "black", size = 8, fontface = "bold") +
  annotate("text", x = 1.5, y = max(datos_switch$correct_responses) * 1.1, 
           label = ifelse(ps_interaccion_control < 0.05, "*", 
                          ifelse(ps_interaccion_control < 0.1, "†", "")), 
           color = "#377EB8", size = 6, fontface = "bold") +
  annotate("text", x = 2, y = max(datos_switch$correct_responses[datos_switch$tx == "sham"]) * 1.05,
           label = ifelse(ps_interaccion_sham < 0.1, "†", ""), 
           color = "#4DAF4A", size = 6, fontface = "bold") +
  annotate("text", x = Inf, y = -Inf, 
           label = "** p < 0.01, * p < 0.05, † p < 0.1 (marginal)",
           hjust = 1.1, vjust = -0.5, size = 3.5, color = "gray40")

mlm_switch

NOSWITCH

Se analizaron las respuestas correctas mediante un modelo lineal mixto (LMM) con efectos aleatorios por sujeto (1 | subj). Efecto del tratamiento (tx): el grupo control mostró más respuestas correctas que el grupo active en la sesión 1 (β = 4.19, SE = 1.37, t = 3.06, p = 0.003), el grupo sham no difirió significativamente del active (β = 1.95, SE = 1.45, t = 1.35, p = 0.182). Respecto al efecto de la sesión (ses-02 vs. ses-01): hubo un aumento general en respuestas correctas en la sesión 2 (β = 2.93, SE = 1.32, t = 2.22, p = 0.032). Sobre la interacción tx × sesión: la ventaja del control en la sesión 1 disminuyó significativamente en la sesión 2 (β = −3.93, SE = 1.83, t = −2.14, p = 0.039). El grupo sham mostró una tendencia marginal a disminuir (β = −3.76, SE = 1.94, t = −1.94, p = 0.060).

SWITCH

Se analizaron las respuestas correctas mediante un modelo lineal mixto (LMM) con efectos aleatorios por sujeto (1 | subj). Efecto del tratamiento (tx): el grupo control superó al active en la sesión 1 (β = 2.08, SE = 0.89, t = 2.35, p = 0.022) y el grupo sham no difirió significativamente (β = 0.63, SE = 0.94, t = 0.67, p = 0.504).Efecto de la sesión (ses-02 vs. ses-01): hubo una mejora general en la sesión 2 (β = 1.79, SE = 0.80, t = 2.24, p = 0.031). Interacción tx × sesión: el grupo control mostró una tendencia marginal a reducir en la sesión 2 (β = −2.19, SE = 1.11, t = −1.97, p = 0.056). No hubo cambios significativos para el grupo sham (β = −0.79, SE = 1.17, t = −0.67, p = 0.507).

SOLO ACTIVOS Y SHAM

library(ARTool)
library(emmeans)
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
dd <- read.csv("ts_correctas.csv")

# Filtrar sujetos con ambas sesiones y tx = "sham" o "active"
datos_filtrados <- dd %>%
  filter(tx %in% c("sham", "active")) %>%  # Solo sham y active
  group_by(subj) %>%
  filter(all(c("ses-01", "ses-02") %in% sesion)) %>%  # Que tengan ambas sesiones
  ungroup()

# Verificar sujetos únicos
unique(datos_filtrados$subj)
##  [1] "sub-16" "sub-17" "sub-18" "sub-19" "sub-20" "sub-22" "sub-24" "sub-25"
##  [9] "sub-28" "sub-30" "sub-31" "sub-32" "sub-33" "sub-34" "sub-35" "sub-36"
## [17] "sub-37" "sub-38" "sub-40" "sub-42" "sub-43" "sub-44" "sub-45" "sub-46"
## [25] "sub-47" "sub-48"

SWITCH

dd_switch <- datos_filtrados %>%
  filter(condition == "switch") %>%
  mutate(
    tx = factor(tx),          
    sesion = factor(sesion)   
  ) %>%
  select(subj, tx, sesion, correct_responses)

dd_switch$sesion <- factor(dd_switch$sesion)
dd_switch$tx <- factor(dd_switch$tx)


#Reviso supuestos y no cumple el de normalidad por lo que intento con un Aligned Rank Transform (ART)

modelo_art <- art(
  correct_responses ~ tx * sesion + (1 | subj),
  data = dd_switch
)

artanova_switch<-anova(modelo_art)
artanova_switch
if ("sesion" %in% rownames(artanova_switch)) {
  emmeans(artlm(modelo_art, "sesion"), pairwise ~ sesion, adjust = "tukey")
}
## NOTE: Results may be misleading due to involvement in interactions
## $emmeans
##  sesion emmean   SE   df lower.CL upper.CL
##  ses-01   22.4 2.91 46.2     16.6     28.3
##  ses-02   30.7 2.91 46.2     24.9     36.6
## 
## Results are averaged over the levels of: tx 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast            estimate   SE df t.ratio p.value
##  (ses-01) - (ses-02)     -8.3 3.69 24  -2.251  0.0338
## 
## Results are averaged over the levels of: tx 
## Degrees-of-freedom method: kenward-roger
plot(residuals(modelo_art))

 #Resultados
 #contrast            estimate   SE df t.ratio p.value
 #(ses-01) - (ses-02)     -8.3 3.69 24  -2.251  0.0338


#Para una aproximacion mas tradicional 
#Prueba de Friedman (within-subjects, para comparar ses-01 vs ses-02).
#Prueba de Wilcoxon rank-sum (between-subjects, para comparar sham vs active en cada sesión).

sham_data_switch <- dd_switch %>%
  filter(tx == "sham") %>%
  pivot_wider(names_from = sesion, values_from = correct_responses)

friedman.test(cbind(sham_data_switch$`ses-01`, sham_data_switch$`ses-02`))
## 
##  Friedman rank sum test
## 
## data:  cbind(sham_data_switch$`ses-01`, sham_data_switch$`ses-02`)
## Friedman chi-squared = 4.5, df = 1, p-value = 0.03389
active_data_switch <- dd_switch %>%
  filter(tx == "active") %>%
  pivot_wider(names_from = sesion, values_from = correct_responses)

friedman.test(cbind(active_data_switch$`ses-01`, active_data_switch$`ses-02`))
## 
##  Friedman rank sum test
## 
## data:  cbind(active_data_switch$`ses-01`, active_data_switch$`ses-02`)
## Friedman chi-squared = 3.6, df = 1, p-value = 0.05778
ses1_data_switch <- dd_switch %>%
  filter(sesion == "ses-01")

wilcox.test(correct_responses ~ tx, data = ses1_data_switch)
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot
## compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  correct_responses by tx
## W = 72.5, p-value = 0.5659
## alternative hypothesis: true location shift is not equal to 0
ses2_data_switch <- dd_switch %>%
  filter(sesion == "ses-02")

wilcox.test(correct_responses ~ tx, data = ses2_data_switch)
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot
## compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  correct_responses by tx
## W = 71, p-value = 0.4951
## alternative hypothesis: true location shift is not equal to 0

VIZUALIZACION DE SWITCH

viz_ddswitch <- ggplot(dd_switch, aes(x = sesion, y = correct_responses, color = tx, group = tx)) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2, alpha = 0.8) +
  stat_summary(fun = mean, geom = "point", size = 3.5, shape = 19) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15, linewidth = 0.8, alpha = 0.6) +
  labs(
    title = "Efecto del Tratamiento y Sesión en la Condición Switch",
    subtitle = paste(
      "Friedman (intra-grupo): sham p = 0.034*, active p = 0.058\n",
      "Wilcoxon (entre-grupos): ses-01 p = 0.40, ses-02 p = 0.88"
    ),
    x = "Sesión", 
    y = "Respuestas Correctas (Switch)",
    color = "Tratamiento",
    caption = "Error bars: ±1 SEM\n* p < 0.05; Pruebas no paramétricas (Friedman/Wilcoxon)"
  ) +
  theme_minimal(base_size = 13) +
  scale_color_manual(
    values = c("active" = "#377EB8", "sham" = "#4DAF4A"),
    labels = c("active" = "Active (n=14)", "sham" = "Sham (n=12)")  # Añade tamaño de muestra
  ) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray30", size = 11),
    legend.position = "top",
    panel.grid.major = element_line(color = "gray90"),
    axis.text = element_text(color = "black"))

viz_ddswitch

Se analizaron las respuestas correctas en la condición switch mediante pruebas no paramétricas debido a la violación de supuestos (normalidad/homocedasticidad). Para comparar el efecto del tratamiento entre sesiones, se usó la prueba de Friedman (intra-grupo) y la prueba de Wilcoxon (entre grupos). En el grupo sham, hubo un cambio significativo entre sesiones (χ² = 4.5, p = 0.034), mientras que en el grupo active no (χ² = 3.6, p = 0.058). Las comparaciones entre grupos (active vs. sham) no mostraron diferencias significativas en ninguna sesión (ses-01: W = 59, p = 0.19; ses-02: W = 96, p = 0.53)

NOSWITCH

dd_noswitch <- datos_filtrados %>%
  filter(condition == "noswitch")

dd_noswitch$sesion <- factor(dd_noswitch$sesion)

#verificar supuestos de normalidad
dd_noswitch %>% 
  group_by(tx, sesion) %>% 
  shapiro_test(correct_responses)
#NELSON, has no parametricas

dd_noswitch$sesion <- factor(dd_noswitch$sesion)
dd_noswitch$tx <- factor(dd_noswitch$tx)

modelo_art2 <- art(
  correct_responses ~ tx * sesion + (1 | subj),
  data = dd_noswitch
)

artanova_noswitch<-anova(modelo_art2)
artanova_noswitch
#NADA

#                  F Df Df.res  Pr(>F)  
#1 tx        0.37449  1     24 0.54632  
#2 sesion    1.32965  1     24 0.26022  
#3 tx:sesion 2.25889  1     24 0.14589  


#Para una aproximacion mas tradicional 
#Prueba de Friedman (within-subjects, para comparar ses-01 vs ses-02).
#Prueba de Wilcoxon rank-sum (between-subjects, para comparar sham vs active en cada sesión).

sham_data_noswitch <- dd_noswitch %>%
  filter(tx == "sham") %>%
  pivot_wider(names_from = sesion, values_from = correct_responses)

friedman.test(cbind(sham_data_noswitch$`ses-01`, sham_data_noswitch$`ses-02`))
## 
##  Friedman rank sum test
## 
## data:  cbind(sham_data_noswitch$`ses-01`, sham_data_noswitch$`ses-02`)
## Friedman chi-squared = 0.4, df = 1, p-value = 0.5271
active_data_noswitch <- dd_noswitch %>%
  filter(tx == "active") %>%
  pivot_wider(names_from = sesion, values_from = correct_responses)

friedman.test(cbind(active_data_noswitch$`ses-01`, active_data_noswitch$`ses-02`))
## 
##  Friedman rank sum test
## 
## data:  cbind(active_data_noswitch$`ses-01`, active_data_noswitch$`ses-02`)
## Friedman chi-squared = 1.9231, df = 1, p-value = 0.1655
ses1_data_noswitch <- dd_noswitch %>%
  filter(sesion == "ses-01")

wilcox.test(correct_responses ~ tx, data = ses1_data_noswitch)
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot
## compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  correct_responses by tx
## W = 59, p-value = 0.1963
## alternative hypothesis: true location shift is not equal to 0
ses2_data_noswitch <- dd_noswitch %>%
  filter(sesion == "ses-02")

wilcox.test(correct_responses ~ tx, data = ses2_data_noswitch)
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot
## compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  correct_responses by tx
## W = 96, p-value = 0.5393
## alternative hypothesis: true location shift is not equal to 0
viz_ddnoswitch <- ggplot(dd_noswitch, aes(x = sesion, y = correct_responses, color = tx, group = tx)) +
  stat_summary(fun = mean, geom = "line", linewidth = 1.2, alpha = 0.8) +
  stat_summary(fun = mean, geom = "point", size = 3.5, shape = 19) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.15, linewidth = 0.8, alpha = 0.6) +
  labs(
    title = "Efecto del Tratamiento y Sesión en la Condición NoSwitch",
    subtitle = paste(
      "Friedman (intra-grupo): sham p = 0.5271, active p = 0.1655\n",
      "Wilcoxon (entre-grupos): ses-01 p = 0.1963, ses-02 p = 0.5393"
    ),
    x = "Sesión", 
    y = "Respuestas Correctas (NoSwitch)",
    color = "Tratamiento",
    caption = "Error bars: ±1 SEM\n* p < 0.05; Pruebas no paramétricas (Friedman/Wilcoxon)"
  ) +
  theme_minimal(base_size = 13) +
  scale_color_manual(
    values = c("active" = "#377EB8", "sham" = "#4DAF4A"),
    labels = c("active" = "Active (n=14)", "sham" = "Sham (n=12)")  # Añade tamaño de muestra
  ) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray30", size = 11),
    legend.position = "top",
    panel.grid.major = element_line(color = "gray90"),
    axis.text = element_text(color = "black"))

viz_ddnoswitch

Se analizaron las respuestas correctas en la condición no-switch mediante pruebas no paramétricas debido a la violación de supuestos (normalidad y/o homocedasticidad). Para evaluar el efecto del tratamiento entre sesiones, se aplicó la prueba de Friedman (comparación intra-grupo) y la prueba de Wilcoxon (comparación entre grupos active vs. sham).No hubo resultados significativos en el grupo sham entre sesiones (χ² = 0.4, p = 0.527). Tampoco se encontraron cambios significativos (χ² = 1.92, p = 0.166). La comparaciones entre grupos (activo vs sham)no mostraron diferencias significativas en ninguna sesión (ses-01: W = 59, p = 0.196; W = 96, p = 0.539)