##Loading the dataset and packages

library(readxl)
Conditions2_3_Updated <- read_excel("Conditions2&3_Updated.xlsx")
#View(Conditions2_3_Updated)

library(gtsummary)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(rstatix)
## 
## Attaching package: 'rstatix'
## The following object is masked from 'package:stats':
## 
##     filter
library(ggplot2)
library(ggpubr)
library(ggstatsplot)
## You can cite this package as:
##      Patil, I. (2021). Visualizations with statistical details: The 'ggstatsplot' approach.
##      Journal of Open Source Software, 6(61), 3167, doi:10.21105/joss.03167
library(ggpattern)
library(tidyr)
library(Hmisc)
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(sjPlot)
## Install package "strengejacke" from GitHub (`devtools::install_github("strengejacke/strengejacke")`) to load all sj-packages at once!
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ lubridate 1.9.3     ✔ stringr   1.5.1
## ✔ purrr     1.0.2     ✔ tibble    3.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ rstatix::filter()  masks dplyr::filter(), stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ Hmisc::src()       masks dplyr::src()
## ✖ Hmisc::summarize() masks dplyr::summarize()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ez)

##Renaming the Values and Cleaning the Dataset

SH_Data <- Conditions2_3_Updated
SH_Data <- SH_Data[complete.cases(SH_Data$key_resp.rt), ]

correct_data <- SH_Data %>%
  filter(key_resp.corr == 1)

SH_Cleaned_Data <- correct_data %>%
  filter(key_resp.rt > 0.200 & key_resp.rt < 2.00) %>% 
  mutate(cutoff =  mean(as.numeric(key_resp.rt)) + 2 * sd(as.numeric(key_resp.rt))) %>%
  filter(as.numeric(key_resp.rt) < cutoff) %>%
  select(-cutoff) %>%
  mutate(key_resp.rt = (as.numeric(key_resp.rt) * 1000))


SH_Cleaned_Data$key_resp.corr <- factor(SH_Cleaned_Data$key_resp.corr, levels = c(0, 1), labels = c("incorrect", "correct"))
SH_Cleaned_Data$Participant_ID <- factor(SH_Cleaned_Data$Participant_ID)
SH_Cleaned_Data$Time_of_Display <- factor(SH_Cleaned_Data$Time_of_Display, levels = c(100, 900), labels = c("Time100", "Time900"))
SH_Cleaned_Data$Condition_code <- factor(SH_Cleaned_Data$Condition_code, levels = c(2, 3), labels = c("face-noise", "place-noise"))
SH_Cleaned_Data$Validity <- factor(SH_Cleaned_Data$Validity, levels = c('invalid', 'valid'), labels = c("Invalid", "Valid"))
SH_Cleaned_Data$key_resp.keys <- factor(SH_Cleaned_Data$key_resp.keys, levels = c('right', 'left'), labels = c("right", "left"))
SH_Cleaned_Data$Visual_Field <- factor(SH_Cleaned_Data$Visual_Field, levels = c(1, 0), labels = c("right", "left"))
head(SH_Cleaned_Data)
## # A tibble: 6 × 10
##   Left_Pic  Right_Pic Time_of_Display Condition_code key_resp.keys key_resp.corr
##   <chr>     <chr>     <fct>           <fct>          <fct>         <fct>        
## 1 Gray30.j… HaF22.jpg Time900         face-noise     right         correct      
## 2 HaF6.jpg  Gray14.j… Time900         face-noise     right         correct      
## 3 Gray5.jpg HaF13.jpg Time100         face-noise     left          correct      
## 4 Gray12.j… HaF3.jpg  Time100         face-noise     left          correct      
## 5 HaF29.jpg Gray28.j… Time900         face-noise     left          correct      
## 6 HaF26.jpg Gray23.j… Time100         face-noise     right         correct      
## # ℹ 4 more variables: key_resp.rt <dbl>, Participant_ID <fct>, Validity <fct>,
## #   Visual_Field <fct>

##Running an ANOVA

RM_ANOVA_data <- SH_Cleaned_Data %>%
  group_by(Time_of_Display, Condition_code, Validity, Participant_ID) %>%
  summarise(
    count = n(),
    mean = mean(key_resp.rt, na.rm = TRUE),
    sd = sd(key_resp.rt, na.rm = TRUE)
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Time_of_Display, Validity), factor) %>%
  arrange(Participant_ID, Condition_code, Time_of_Display, Validity)
## `summarise()` has grouped output by 'Time_of_Display', 'Condition_code',
## 'Validity'. You can override using the `.groups` argument.
RM_ANOVA_data
## # A tibble: 200 × 7
## # Groups:   Time_of_Display, Condition_code, Validity [8]
##    Time_of_Display Condition_code Validity Participant_ID count  mean    sd
##    <fct>           <fct>          <fct>    <fct>          <int> <dbl> <dbl>
##  1 Time100         face-noise     Invalid  2                 40  287.  31.8
##  2 Time100         face-noise     Valid    2                 40  284.  31.2
##  3 Time900         face-noise     Invalid  2                119  297.  30.1
##  4 Time900         face-noise     Valid    2                118  290.  33.2
##  5 Time100         place-noise    Invalid  2                 40  296.  40.9
##  6 Time100         place-noise    Valid    2                 38  278.  23.7
##  7 Time900         place-noise    Invalid  2                120  299.  27.7
##  8 Time900         place-noise    Valid    2                118  296.  35.0
##  9 Time100         face-noise     Invalid  3                 39  379.  38.4
## 10 Time100         face-noise     Valid    3                 37  373.  54.4
## # ℹ 190 more rows
RM_anova <- ezANOVA(
  data = RM_ANOVA_data,
  dv = .(mean),
  wid = .(Participant_ID),
  within = .(Time_of_Display, Condition_code, Validity), detailed = TRUE)

print(RM_anova)
## $ANOVA
##                                    Effect DFn DFd          SSn        SSd
## 1                             (Intercept)   1  24 2.204890e+07 220619.040
## 2                         Time_of_Display   1  24 2.180289e+02   5944.856
## 3                          Condition_code   1  24 3.540100e+00   1096.068
## 4                                Validity   1  24 8.155315e+02   2329.511
## 5          Time_of_Display:Condition_code   1  24 8.206286e+02   1974.533
## 6                Time_of_Display:Validity   1  24 8.626801e+01   2347.179
## 7                 Condition_code:Validity   1  24 2.620294e+02   1645.375
## 8 Time_of_Display:Condition_code:Validity   1  24 2.470487e-01   1357.102
##              F            p p<.05          ges
## 1 2.398585e+03 1.447084e-25     * 9.893515e-01
## 2 8.802050e-01 3.574920e-01       9.178937e-04
## 3 7.751563e-02 7.830775e-01       1.491717e-05
## 4 8.402086e+00 7.885429e-03     * 3.424744e-03
## 5 9.974553e+00 4.248387e-03     * 3.446075e-03
## 6 8.820940e-01 3.569858e-01       3.633868e-04
## 7 3.822051e+00 6.232500e-02       1.102930e-03
## 8 4.368992e-03 9.478471e-01       1.041021e-06
#Calculating partial Effect Size
anova_table <- RM_anova$ANOVA

#Calculate partial eta squared for each effect
anova_table$partial_eta_squared <- anova_table$SSn / (anova_table$SSn + anova_table$SSd)

print(anova_table)
##                                    Effect DFn DFd          SSn        SSd
## 1                             (Intercept)   1  24 2.204890e+07 220619.040
## 2                         Time_of_Display   1  24 2.180289e+02   5944.856
## 3                          Condition_code   1  24 3.540100e+00   1096.068
## 4                                Validity   1  24 8.155315e+02   2329.511
## 5          Time_of_Display:Condition_code   1  24 8.206286e+02   1974.533
## 6                Time_of_Display:Validity   1  24 8.626801e+01   2347.179
## 7                 Condition_code:Validity   1  24 2.620294e+02   1645.375
## 8 Time_of_Display:Condition_code:Validity   1  24 2.470487e-01   1357.102
##              F            p p<.05          ges partial_eta_squared
## 1 2.398585e+03 1.447084e-25     * 9.893515e-01        0.9900932263
## 2 8.802050e-01 3.574920e-01       9.178937e-04        0.0353777243
## 3 7.751563e-02 7.830775e-01       1.491717e-05        0.0032194200
## 4 8.402086e+00 7.885429e-03     * 3.424744e-03        0.2593069493
## 5 9.974553e+00 4.248387e-03     * 3.446075e-03        0.2935889392
## 6 8.820940e-01 3.569858e-01       3.633868e-04        0.0354509553
## 7 3.822051e+00 6.232500e-02       1.102930e-03        0.1373748893
## 8 4.368992e-03 9.478471e-01       1.041021e-06        0.0001820082

Including Plots

#Creating a cleaned summary dataset that computes mean and SD of RTs 
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  group_by(Validity, Condition_code, Participant_ID, Time_of_Display) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Validity), factor) %>%
  mutate(Validity = factor(Validity, levels = c("Valid", "Invalid"))) %>% 
  arrange(Participant_ID, Condition_code, Validity)

#Print the summarized data structure and sample for debugging
print(str(RM_ANOVA_Validity_data))
## tibble [200 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Validity       : Factor w/ 2 levels "Valid","Invalid": 1 1 2 2 1 1 2 2 1 1 ...
##  $ Condition_code : Factor w/ 2 levels "face-noise","place-noise": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Participant_ID : Factor w/ 25 levels "2","3","4","5",..: 1 1 1 1 1 1 1 1 2 2 ...
##  $ Time_of_Display: Factor w/ 2 levels "Time100","Time900": 1 2 1 2 1 2 1 2 1 2 ...
##  $ mean_rt        : num [1:200] 284 290 287 297 278 ...
##  $ sd_rt          : num [1:200] 31.2 33.2 31.8 30.1 23.7 ...
## NULL
print(head(RM_ANOVA_Validity_data, 20))
## # A tibble: 20 × 6
##    Validity Condition_code Participant_ID Time_of_Display mean_rt sd_rt
##    <fct>    <fct>          <fct>          <fct>             <dbl> <dbl>
##  1 Valid    face-noise     2              Time100            284.  31.2
##  2 Valid    face-noise     2              Time900            290.  33.2
##  3 Invalid  face-noise     2              Time100            287.  31.8
##  4 Invalid  face-noise     2              Time900            297.  30.1
##  5 Valid    place-noise    2              Time100            278.  23.7
##  6 Valid    place-noise    2              Time900            296.  35.0
##  7 Invalid  place-noise    2              Time100            296.  40.9
##  8 Invalid  place-noise    2              Time900            299.  27.7
##  9 Valid    face-noise     3              Time100            373.  54.4
## 10 Valid    face-noise     3              Time900            391.  48.0
## 11 Invalid  face-noise     3              Time100            379.  38.4
## 12 Invalid  face-noise     3              Time900            388.  45.6
## 13 Valid    place-noise    3              Time100            377.  49.0
## 14 Valid    place-noise    3              Time900            385.  48.5
## 15 Invalid  place-noise    3              Time100            388.  45.1
## 16 Invalid  place-noise    3              Time900            386.  39.9
## 17 Valid    face-noise     4              Time100            314.  57.6
## 18 Valid    face-noise     4              Time900            306.  46.1
## 19 Invalid  face-noise     4              Time100            336.  44.1
## 20 Invalid  face-noise     4              Time900            327.  54.1
#Calculate means and standard errors for RTs
mean_data <- RM_ANOVA_Validity_data %>%
  group_by(Validity, Condition_code) %>%
  summarise(
    Mean_Value = mean(mean_rt),
    SE_Value = sd(mean_rt) / sqrt(n()),
    .groups = 'drop')

#Print the mean data structure and sample for debugging
print(str(mean_data))
## tibble [4 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Validity      : Factor w/ 2 levels "Valid","Invalid": 1 1 2 2
##  $ Condition_code: Factor w/ 2 levels "face-noise","place-noise": 1 2 1 2
##  $ Mean_Value    : num [1:4] 329 331 335 333
##  $ SE_Value      : num [1:4] 5.15 4.81 4.84 4.92
## NULL
print(head(mean_data, 20))
## # A tibble: 4 × 4
##   Validity Condition_code Mean_Value SE_Value
##   <fct>    <fct>               <dbl>    <dbl>
## 1 Valid    face-noise           329.     5.15
## 2 Valid    place-noise          331.     4.81
## 3 Invalid  face-noise           335.     4.84
## 4 Invalid  place-noise          333.     4.92
#Check for duplicates in the summarized data
duplicates <- RM_ANOVA_Validity_data %>%
  group_by(Validity, Condition_code, Participant_ID) %>%
  filter(n() > 1)
print(duplicates)
## # A tibble: 200 × 6
## # Groups:   Validity, Condition_code, Participant_ID [100]
##    Validity Condition_code Participant_ID Time_of_Display mean_rt sd_rt
##    <fct>    <fct>          <fct>          <fct>             <dbl> <dbl>
##  1 Valid    face-noise     2              Time100            284.  31.2
##  2 Valid    face-noise     2              Time900            290.  33.2
##  3 Invalid  face-noise     2              Time100            287.  31.8
##  4 Invalid  face-noise     2              Time900            297.  30.1
##  5 Valid    place-noise    2              Time100            278.  23.7
##  6 Valid    place-noise    2              Time900            296.  35.0
##  7 Invalid  place-noise    2              Time100            296.  40.9
##  8 Invalid  place-noise    2              Time900            299.  27.7
##  9 Valid    face-noise     3              Time100            373.  54.4
## 10 Valid    face-noise     3              Time900            391.  48.0
## # ℹ 190 more rows
#Define the y-axis limits
y_limits <- c(300, 350) 

#Change the names of the variables on the x-axis
custom_labels <- c("Face-Noise", "Place-Noise")

#Define interaction order 
mean_data$interaction_order <- factor(with(mean_data, interaction(Condition_code, Validity)),
                                      levels = c("face-noise.Valid", "face-noise.Invalid", 
                                                 "place-noise.Valid", "place-noise.Invalid"))

#Make sure Condition_code has the right order
mean_data$Condition_code <- factor(mean_data$Condition_code,
                                   levels = c("face-noise", "place-noise"))

#Define colors of bars
fill_palette <- c("face-noise.Valid" = "#66c2a5",
                  "face-noise.Invalid" = "#FFFFFF",
                  "place-noise.Valid" = "#8da0cb",
                  "place-noise.Invalid" = "#FFFFFF")

#Define colors for borders
color_palette <- c("face-noise.Valid" = "#66c2a5",
                   "face-noise.Invalid" = "#66c2a5",
                   "place-noise.Valid" = "#8da0cb",
                   "place-noise.Invalid" = "#8da0cb")

#Define patterns for valid and invalid conditions
pattern_palette <- c("face-noise.Valid" = "none",
                     "face-noise.Invalid" = "stripe",
                     "place-noise.Valid" = "none",
                     "place-noise.Invalid" = "stripe")


#X-axis labels for the two conditions
custom_labels <- c("face-noise" = "Face-Noise",
                   "place-noise" = "Place-Noise")

#Plotting
ggplot(mean_data,
       aes(x = Condition_code,
           y = Mean_Value,
           fill = interaction_order,
           pattern = interaction_order)) +
  geom_bar_pattern(
    stat = "identity",
    position = position_dodge(width = 0.9),
    aes(color = interaction_order),
    pattern_fill = "black",
    pattern_angle = 45,
    pattern_density = 0.2,
    pattern_spacing = 0.03,
    pattern_key_scale_factor = 0.6
  ) +
  scale_fill_manual(values = fill_palette) +
  scale_pattern_manual(values = pattern_palette) +
  scale_color_manual(values = color_palette) +
  geom_errorbar(
    aes(ymin = Mean_Value - SE_Value,
        ymax = Mean_Value + SE_Value),
    width = 0.2,
    position = position_dodge(width = 0.9),
    color = "black"
  ) +
  scale_x_discrete(labels = custom_labels) +
  xlab("Condition") +
  ylab("Mean Reaction Time") +
  ggtitle("Mean Reaction Time per Validity and Condition") +
  theme_bw() +
  theme(
    axis.title.x = element_text(size = 14),
    axis.title.y = element_text(size = 14),
    axis.text.x  = element_text(size = 12),
    axis.text.y  = element_text(size = 12),
    plot.title   = element_text(size = 16, hjust = 0.5)
  ) +
  coord_cartesian(ylim = y_limits)

#Plotting across SOAs
#Creating a cleaned summary dataset that computes mean and SD of RTs 
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  group_by(Time_of_Display, Validity, Condition_code, Participant_ID) %>%
  summarise(
    count = n(),
    mean = mean(key_resp.rt, na.rm = TRUE),
    sd = sd(key_resp.rt, na.rm = TRUE)
  ) %>%
  mutate_at(vars(Time_of_Display, Participant_ID, Condition_code, Validity), factor) %>%
  arrange(Time_of_Display, Participant_ID, Condition_code, Validity)
## `summarise()` has grouped output by 'Time_of_Display', 'Validity',
## 'Condition_code'. You can override using the `.groups` argument.
RM_ANOVA_Validity_data
## # A tibble: 200 × 7
## # Groups:   Time_of_Display, Validity, Condition_code [8]
##    Time_of_Display Validity Condition_code Participant_ID count  mean    sd
##    <fct>           <fct>    <fct>          <fct>          <int> <dbl> <dbl>
##  1 Time100         Invalid  face-noise     2                 40  287.  31.8
##  2 Time100         Valid    face-noise     2                 40  284.  31.2
##  3 Time100         Invalid  place-noise    2                 40  296.  40.9
##  4 Time100         Valid    place-noise    2                 38  278.  23.7
##  5 Time100         Invalid  face-noise     3                 39  379.  38.4
##  6 Time100         Valid    face-noise     3                 37  373.  54.4
##  7 Time100         Invalid  place-noise    3                 39  388.  45.1
##  8 Time100         Valid    place-noise    3                 38  377.  49.0
##  9 Time100         Invalid  face-noise     4                 40  336.  44.1
## 10 Time100         Valid    face-noise     4                 40  314.  57.6
## # ℹ 190 more rows
mean_data <- RM_ANOVA_Validity_data %>%
  group_by(Time_of_Display, Condition_code, Validity) %>%
  summarise(Mean_Value = mean(mean),
            SE_Value = sd(mean) / sqrt(n()))
## `summarise()` has grouped output by 'Time_of_Display', 'Condition_code'. You
## can override using the `.groups` argument.
#Define interaction order 
mean_data$interaction_order <- factor(with(mean_data, interaction(Condition_code, Validity)),
                                      levels = c("face-noise.Valid", "face-noise.Invalid", 
                                                 "place-noise.Valid", "place-noise.Invalid"))

#Make sure Condition_code has the right order
mean_data$Condition_code <- factor(mean_data$Condition_code,
                                   levels = c("face-noise", "place-noise"))

#Define colors of bars
fill_palette <- c("face-noise.Valid" = "#66c2a5",
                  "face-noise.Invalid" = "#FFFFFF",
                  "place-noise.Valid" = "#8da0cb",
                  "place-noise.Invalid" = "#FFFFFF")

#Define colors for borders
color_palette <- c("face-noise.Valid" = "#66c2a5",
                   "face-noise.Invalid" = "#66c2a5",
                   "place-noise.Valid" = "#8da0cb",
                   "place-noise.Invalid" = "#8da0cb")

#Define patterns for valid and invalid conditions
pattern_palette <- c("face-noise.Valid" = "none",
                     "face-noise.Invalid" = "stripe",
                     "place-noise.Valid" = "none",
                     "place-noise.Invalid" = "stripe")
#Custom y-axis breaks
custom_y_values <- seq(290, 340, by = 10)  
custom_labels <- c("100 ms", "900 ms")

#Plotting
ggplot(mean_data,
       aes(x = Time_of_Display,
           y = Mean_Value,
           fill = interaction_order,
           pattern = interaction_order)) +
  geom_bar_pattern(
    stat = "identity",
    position = position_dodge(width = 0.9),
    aes(color = interaction_order),
    pattern_fill = "black",
    pattern_angle = 45,
    pattern_density = 0.2,
    pattern_spacing = 0.03,
    pattern_key_scale_factor = 0.6
  ) +
  scale_fill_manual(values = fill_palette) +
  scale_pattern_manual(values = pattern_palette) +
  scale_color_manual(values = color_palette) +
  geom_errorbar(
    aes(ymin = Mean_Value - SE_Value,
        ymax = Mean_Value + SE_Value),
    width = 0.2,
    position = position_dodge(width = 0.9),
    color = "black") +
  scale_x_discrete(labels = custom_labels) +
  xlab("Condition") +
  ylab("Mean Reaction Time") +
  ggtitle("Mean Reaction Time per Validity and Condition") +
  theme_bw() +
  theme(
    axis.title.x = element_text(size = 14),
    axis.title.y = element_text(size = 14),
    axis.text.x  = element_text(size = 12),
    axis.text.y  = element_text(size = 12),
    plot.title   = element_text(size = 16, hjust = 0.5)) +
  coord_cartesian(ylim = y_limits)

#plotting individual performance

#Valid - Invalid difference per participant at 100 and 900
diff_data <- SH_Cleaned_Data %>%
  group_by(Participant_ID, Time_of_Display, Validity) %>%
  summarise(mean_rt = mean(key_resp.rt), .groups = 'drop') %>%
  pivot_wider(names_from = Validity, values_from = mean_rt) %>%
  mutate(diff = Invalid - Valid)

#plotting
ggplot(diff_data, aes(x = Time_of_Display, y = diff)) +
  geom_boxplot() +
  geom_jitter(width = 0.2) +
  ylab("RT Difference (Invalid - Valid)") +
  xlab("Time of Display") +
  ggtitle("Validity Effect Size by SOA")

#####################trends################
#Create participant-level validity effect (Invalid - Valid) for each SOA and condition
validity_diff_data <- SH_Cleaned_Data %>%
  group_by(Participant_ID, Time_of_Display, Condition_code, Validity) %>%
  summarise(mean_rt = mean(key_resp.rt), .groups = 'drop') %>%
  pivot_wider(names_from = Validity, values_from = mean_rt) %>%
  mutate(Validity_Effect = Invalid - Valid)

#Set factor levels for SOA order
validity_diff_data$Time_of_Display <- factor(validity_diff_data$Time_of_Display,
                                             levels = c("Time100", "Time900"))

#Plot for each Condition_code
ggplot(validity_diff_data, aes(x = Time_of_Display, y = Validity_Effect, group = Participant_ID, color = Participant_ID)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  facet_wrap(~ Condition_code) +
  labs(
    title = "Validity Effect (Invalid – Valid RT) by SOA",
    x = "Time of Display",
    y = "Validity Effect (ms)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    strip.text = element_text(size = 14),
    legend.position = "none"
  ) + stat_summary(aes(group = 1), fun = mean, geom = "line", color = "black", size = 1.2, linetype = "dashed")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

###############separated by Validity#######################
#Create a summary dataset: Mean RT per Participant × SOA × Condition × Validity
valid_invalid_data <- SH_Cleaned_Data %>%
  group_by(Participant_ID, Time_of_Display, Condition_code, Validity) %>%
  summarise(mean_rt = mean(key_resp.rt), .groups = 'drop')

# Set factor levels for correct ordering
valid_invalid_data$Time_of_Display <- factor(valid_invalid_data$Time_of_Display, levels = c("Time100", "Time900"))

#Plot for Valid Trials
valid_data <- filter(valid_invalid_data, Validity == "Valid")

ggplot(valid_data, aes(x = Time_of_Display, y = mean_rt, group = Participant_ID, color = Participant_ID)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  facet_wrap(~ Condition_code) +
  stat_summary(aes(group = 1), fun = mean, geom = "line", color = "black", size = 1.2, linetype = "dashed") +
  labs(
    title = "Valid Trials: RT by SOA",
    x = "Time of Display",
    y = "Reaction Time (ms)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    strip.text = element_text(size = 14),
    legend.position = "none"
  )

#Plot for Invalid Trials
invalid_data <- filter(valid_invalid_data, Validity == "Invalid")

ggplot(invalid_data, aes(x = Time_of_Display, y = mean_rt, group = Participant_ID, color = Participant_ID)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  facet_wrap(~ Condition_code) +
  stat_summary(aes(group = 1), fun = mean, geom = "line", color = "black", size = 1.2, linetype = "dashed") +
  labs(
    title = "Invalid Trials: RT by SOA",
    x = "Time of Display",
    y = "Reaction Time (ms)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    strip.text = element_text(size = 14),
    legend.position = "none"
  )

#Running t-tests #t-test comparing the valid vs invalid in 100 ms for face-noise

#Filter and summarize the data
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "face-noise", Time_of_Display == "Time100") %>%
  group_by(Participant_ID, Validity, Condition_code, Time_of_Display) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Time_of_Display), factor) %>%
  arrange(Participant_ID, Condition_code, Time_of_Display)

#View the summarized data
print(RM_ANOVA_Validity_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Time_of_Display mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>             <dbl> <dbl>
##  1 2              Invalid  face-noise     Time100            287.  31.8
##  2 2              Valid    face-noise     Time100            284.  31.2
##  3 3              Invalid  face-noise     Time100            379.  38.4
##  4 3              Valid    face-noise     Time100            373.  54.4
##  5 4              Invalid  face-noise     Time100            336.  44.1
##  6 4              Valid    face-noise     Time100            314.  57.6
##  7 5              Invalid  face-noise     Time100            318.  38.0
##  8 5              Valid    face-noise     Time100            309.  37.9
##  9 6              Invalid  face-noise     Time100            319.  42.2
## 10 6              Valid    face-noise     Time100            309.  30.3
## # ℹ 40 more rows
#Extract vectors for each validity condition
valid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

#Ensure the vectors are aligned by Participant_ID
if (length(valid_means) != length(invalid_means)) {stop("Mismatch in the number of participants between validity conditions")}

#Perform the paired t-test
res <- t.test(valid_means, invalid_means, paired = TRUE)

#View the t-test results
print(res)
## 
##  Paired t-test
## 
## data:  valid_means and invalid_means
## t = -1.4069, df = 24, p-value = 0.1723
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -12.19713   2.30902
## sample estimates:
## mean difference 
##       -4.944053
#Summary statistics
summary_stats <- RM_ANOVA_Validity_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n())

#View summary statistics
print(summary_stats)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     337.    NA    25
## 2 Valid       332.    NA    25

#t-test comparing the valid vs invalid in 100 ms for place-noise

#Filter and summarize the data
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "place-noise", Time_of_Display == "Time100") %>%
  group_by(Participant_ID, Validity, Condition_code, Time_of_Display) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Time_of_Display), factor) %>%
  arrange(Participant_ID, Condition_code, Time_of_Display)

#View the summarized data
print(RM_ANOVA_Validity_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Time_of_Display mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>             <dbl> <dbl>
##  1 2              Invalid  place-noise    Time100            296.  40.9
##  2 2              Valid    place-noise    Time100            278.  23.7
##  3 3              Invalid  place-noise    Time100            388.  45.1
##  4 3              Valid    place-noise    Time100            377.  49.0
##  5 4              Invalid  place-noise    Time100            315.  46.5
##  6 4              Valid    place-noise    Time100            298.  39.5
##  7 5              Invalid  place-noise    Time100            320.  28.4
##  8 5              Valid    place-noise    Time100            319.  51.6
##  9 6              Invalid  place-noise    Time100            314.  31.8
## 10 6              Valid    place-noise    Time100            312.  34.6
## # ℹ 40 more rows
#Extract vectors for each validity condition
valid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

#Ensure the vectors are aligned by Participant_ID
if (length(valid_means) != length(invalid_means)) {stop("Mismatch in the number of participants between validity conditions")}

#Perform the paired t-test
res <- t.test(valid_means, invalid_means, paired = TRUE)

#View the t-test results
print(res)
## 
##  Paired t-test
## 
## data:  valid_means and invalid_means
## t = -0.168, df = 24, p-value = 0.868
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -6.724711  5.712368
## sample estimates:
## mean difference 
##      -0.5061712
#Summary statistics
summary_stats <- RM_ANOVA_Validity_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n())

#View summary statistics
print(summary_stats)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     331.    NA    25
## 2 Valid       331.    NA    25

#t-test comparing the valid vs invalid in 900 ms for face-noise

#Filter and summarize the data
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "face-noise", Time_of_Display == "Time900") %>%
  group_by(Participant_ID, Validity, Condition_code, Time_of_Display) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Time_of_Display), factor) %>%
  arrange(Participant_ID, Condition_code, Time_of_Display)

#View the summarized data
print(RM_ANOVA_Validity_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Time_of_Display mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>             <dbl> <dbl>
##  1 2              Invalid  face-noise     Time900            297.  30.1
##  2 2              Valid    face-noise     Time900            290.  33.2
##  3 3              Invalid  face-noise     Time900            388.  45.6
##  4 3              Valid    face-noise     Time900            391.  48.0
##  5 4              Invalid  face-noise     Time900            327.  54.1
##  6 4              Valid    face-noise     Time900            306.  46.1
##  7 5              Invalid  face-noise     Time900            300.  45.7
##  8 5              Valid    face-noise     Time900            300.  40.3
##  9 6              Invalid  face-noise     Time900            329.  47.1
## 10 6              Valid    face-noise     Time900            323.  35.6
## # ℹ 40 more rows
#Extract vectors for each validity condition
valid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

#Ensure the vectors are aligned by Participant_ID
if (length(valid_means) != length(invalid_means)) {stop("Mismatch in the number of participants between validity conditions")}

#Perform the paired t-test
res <- t.test(valid_means, invalid_means, paired = TRUE)

#View the t-test results
print(res)
## 
##  Paired t-test
## 
## data:  valid_means and invalid_means
## t = -4.3287, df = 24, p-value = 0.000229
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -11.388555  -4.034838
## sample estimates:
## mean difference 
##       -7.711697
#Summary statistics
summary_stats <- RM_ANOVA_Validity_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n())

#View summary statistics
print(summary_stats)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     333.    NA    25
## 2 Valid       325.    NA    25

#t-test comparing the valid vs invalid in 900 ms for place-noise

#Filter and summarize the data
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "place-noise", Time_of_Display == "Time900") %>%
  group_by(Participant_ID, Validity, Condition_code, Time_of_Display) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Time_of_Display), factor) %>%
  arrange(Participant_ID, Condition_code, Time_of_Display)

#View the summarized data
print(RM_ANOVA_Validity_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Time_of_Display mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>             <dbl> <dbl>
##  1 2              Invalid  place-noise    Time900            299.  27.7
##  2 2              Valid    place-noise    Time900            296.  35.0
##  3 3              Invalid  place-noise    Time900            386.  39.9
##  4 3              Valid    place-noise    Time900            385.  48.5
##  5 4              Invalid  place-noise    Time900            321.  48.1
##  6 4              Valid    place-noise    Time900            316.  47.8
##  7 5              Invalid  place-noise    Time900            300.  38.2
##  8 5              Valid    place-noise    Time900            297.  37.0
##  9 6              Invalid  place-noise    Time900            330.  45.1
## 10 6              Valid    place-noise    Time900            327.  41.1
## # ℹ 40 more rows
#Extract vectors for each validity condition
valid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

#Ensure the vectors are aligned by Participant_ID
if (length(valid_means) != length(invalid_means)) {stop("Mismatch in the number of participants between validity conditions")}

#Perform the paired t-test
res <- t.test(valid_means, invalid_means, paired = TRUE)

#View the t-test results
print(res)
## 
##  Paired t-test
## 
## data:  valid_means and invalid_means
## t = -2.9998, df = 24, p-value = 0.006208
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -5.0516061 -0.9336866
## sample estimates:
## mean difference 
##       -2.992646
#Summary statistics
summary_stats <- RM_ANOVA_Validity_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n())

#View summary statistics
print(summary_stats)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     335.    NA    25
## 2 Valid       332.    NA    25

#Benjamini-Hochberg correction

p_vals <- c(
  face_100  = 0.17,
  place_100 = 0.87,
  face_900  = 0.000229,
  place_900 = 0.006208)

p_adj <- p.adjust(p_vals, method = "BH")
p_adj
##  face_100 place_100  face_900 place_900 
## 0.2266667 0.8700000 0.0009160 0.0124160

#Running t-test for Conditions and Validity Collapsed across SOAs #testing Face-Noise

#Filter and summarize the data
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "face-noise") %>%
  group_by(Participant_ID, Validity, Condition_code) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code), factor) %>%
  arrange(Participant_ID, Condition_code)

# View the summarized data
print(RM_ANOVA_Validity_data)
## # A tibble: 50 × 5
##    Participant_ID Validity Condition_code mean_rt sd_rt
##    <fct>          <fct>    <fct>            <dbl> <dbl>
##  1 2              Invalid  face-noise        294.  30.7
##  2 2              Valid    face-noise        289.  32.7
##  3 3              Invalid  face-noise        386.  44.0
##  4 3              Valid    face-noise        387.  50.0
##  5 4              Invalid  face-noise        330.  51.7
##  6 4              Valid    face-noise        308.  49.2
##  7 5              Invalid  face-noise        305.  44.5
##  8 5              Valid    face-noise        303.  39.8
##  9 6              Invalid  face-noise        326.  46.0
## 10 6              Valid    face-noise        320.  34.9
## # ℹ 40 more rows
# Step 2: Extract vectors for each validity condition
valid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

# Ensure the vectors are aligned by Participant_ID
if (length(valid_means) != length(invalid_means)) {
  stop("Mismatch in the number of participants between validity conditions")
}

# Step 3: Perform the paired t-test
res <- t.test(valid_means, invalid_means, paired = TRUE)

# View the t-test results
print(res)
## 
##  Paired t-test
## 
## data:  valid_means and invalid_means
## t = -4.4986, df = 24, p-value = 0.0001487
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -10.502675  -3.896481
## sample estimates:
## mean difference 
##       -7.199578
# Summary statistics
summary_stats <- RM_ANOVA_Validity_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n()
  )

# View summary statistics
print(summary_stats)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     334.    NA    25
## 2 Valid       327.    NA    25

#testing Place-Noise

#Filter and summarize the data
RM_ANOVA_Validity_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "place-noise") %>%
  group_by(Participant_ID, Validity, Condition_code) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code), factor) %>%
  arrange(Participant_ID, Condition_code)

# View the summarized data
print(RM_ANOVA_Validity_data)
## # A tibble: 50 × 5
##    Participant_ID Validity Condition_code mean_rt sd_rt
##    <fct>          <fct>    <fct>            <dbl> <dbl>
##  1 2              Invalid  place-noise       298.  31.4
##  2 2              Valid    place-noise       291.  33.4
##  3 3              Invalid  place-noise       387.  41.1
##  4 3              Valid    place-noise       383.  48.6
##  5 4              Invalid  place-noise       319.  47.6
##  6 4              Valid    place-noise       311.  46.4
##  7 5              Invalid  place-noise       305.  37.0
##  8 5              Valid    place-noise       302.  42.2
##  9 6              Invalid  place-noise       326.  42.6
## 10 6              Valid    place-noise       323.  40.0
## # ℹ 40 more rows
# Step 2: Extract vectors for each validity condition
valid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means <- RM_ANOVA_Validity_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

# Ensure the vectors are aligned by Participant_ID
if (length(valid_means) != length(invalid_means)) {
  stop("Mismatch in the number of participants between validity conditions")
}

# Step 3: Perform the paired t-test
res <- t.test(valid_means, invalid_means, paired = TRUE)

# View the t-test results
print(res)
## 
##  Paired t-test
## 
## data:  valid_means and invalid_means
## t = -2.0061, df = 24, p-value = 0.05625
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -4.77869825  0.06791688
## sample estimates:
## mean difference 
##       -2.355391
# Summary statistics
summary_stats <- RM_ANOVA_Validity_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n()
  )

# View summary statistics
print(summary_stats)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     334.    NA    25
## 2 Valid       331.    NA    25

#Including the Visual Field in the Model

RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  group_by(Time_of_Display, Condition_code, Validity, Visual_Field, Participant_ID) %>%
  summarise(
    count = n(),
    mean = mean(key_resp.rt, na.rm = TRUE),
    sd = sd(key_resp.rt, na.rm = TRUE)
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Time_of_Display, Validity, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Time_of_Display, Validity, Visual_Field)
## `summarise()` has grouped output by 'Time_of_Display', 'Condition_code',
## 'Validity', 'Visual_Field'. You can override using the `.groups` argument.
RM_ANOVA_VF_data
## # A tibble: 400 × 8
## # Groups:   Time_of_Display, Condition_code, Validity, Visual_Field [16]
##    Time_of_Display Condition_code Validity Visual_Field Participant_ID count
##    <fct>           <fct>          <fct>    <fct>        <fct>          <int>
##  1 Time100         face-noise     Invalid  right        2                 20
##  2 Time100         face-noise     Invalid  left         2                 20
##  3 Time100         face-noise     Valid    right        2                 20
##  4 Time100         face-noise     Valid    left         2                 20
##  5 Time900         face-noise     Invalid  right        2                 59
##  6 Time900         face-noise     Invalid  left         2                 60
##  7 Time900         face-noise     Valid    right        2                 59
##  8 Time900         face-noise     Valid    left         2                 59
##  9 Time100         place-noise    Invalid  right        2                 20
## 10 Time100         place-noise    Invalid  left         2                 20
## # ℹ 390 more rows
## # ℹ 2 more variables: mean <dbl>, sd <dbl>
RM_anova_VF <- ezANOVA(
  data = RM_ANOVA_VF_data,
  dv = .(mean),
  wid = .(Participant_ID),
  within = .(Time_of_Display, Condition_code, Validity, Visual_Field), detailed = TRUE)

print(RM_anova_VF)
## $ANOVA
##                                                  Effect DFn DFd          SSn
## 1                                           (Intercept)   1  24 4.410124e+07
## 2                                       Time_of_Display   1  24 4.475434e+02
## 3                                        Condition_code   1  24 3.637282e+00
## 4                                              Validity   1  24 1.637574e+03
## 5                                          Visual_Field   1  24 5.300197e-03
## 6                        Time_of_Display:Condition_code   1  24 1.645223e+03
## 7                              Time_of_Display:Validity   1  24 1.759966e+02
## 8                               Condition_code:Validity   1  24 5.161618e+02
## 9                          Time_of_Display:Visual_Field   1  24 3.941308e-01
## 10                          Condition_code:Visual_Field   1  24 7.381775e+02
## 11                                Validity:Visual_Field   1  24 1.084749e+02
## 12              Time_of_Display:Condition_code:Validity   1  24 4.404291e-01
## 13          Time_of_Display:Condition_code:Visual_Field   1  24 1.144954e+02
## 14                Time_of_Display:Validity:Visual_Field   1  24 3.470410e+02
## 15                 Condition_code:Validity:Visual_Field   1  24 6.828298e+01
## 16 Time_of_Display:Condition_code:Validity:Visual_Field   1  24 2.443175e+00
##           SSd            F            p p<.05          ges
## 1  442411.531 2.392410e+03 1.492104e-25     * 9.885693e-01
## 2   11933.621 9.000656e-01 3.522201e-01       8.768712e-04
## 3    2300.825 3.794064e-02 8.472019e-01       7.132725e-06
## 4    4700.357 8.361447e+00 8.016516e-03     * 3.201033e-03
## 5   18590.963 6.842288e-06 9.979345e-01       1.039378e-08
## 6    4047.129 9.756386e+00 4.619034e-03     * 3.215936e-03
## 7    4702.342 8.982585e-01 3.526953e-01       3.450135e-04
## 8    3379.101 3.666029e+00 6.752611e-02       1.011179e-03
## 9    3284.766 2.879700e-03 9.576480e-01       7.728970e-07
## 10   1984.884 8.925589e+00 6.391588e-03     * 1.445487e-03
## 11   1493.694 1.742926e+00 1.992219e-01       2.126760e-04
## 12   2829.605 3.735609e-03 9.517701e-01       8.636887e-07
## 13   2508.385 1.095482e+00 3.056870e-01       2.244772e-04
## 14   1117.309 7.454505e+00 1.166586e-02     * 6.800908e-04
## 15   2077.238 7.889281e-01 3.832402e-01       1.338862e-04
## 16   2577.470 2.274952e-02 8.813708e-01       4.791087e-06
#Calculating partial Effect Size
anova_table_VF <- RM_anova_VF$ANOVA

#Calculate partial eta squared for each effect
anova_table_VF$partial_eta_squared <- anova_table_VF$SSn / (anova_table_VF$SSn + anova_table_VF$SSd)

print(anova_table_VF)
##                                                  Effect DFn DFd          SSn
## 1                                           (Intercept)   1  24 4.410124e+07
## 2                                       Time_of_Display   1  24 4.475434e+02
## 3                                        Condition_code   1  24 3.637282e+00
## 4                                              Validity   1  24 1.637574e+03
## 5                                          Visual_Field   1  24 5.300197e-03
## 6                        Time_of_Display:Condition_code   1  24 1.645223e+03
## 7                              Time_of_Display:Validity   1  24 1.759966e+02
## 8                               Condition_code:Validity   1  24 5.161618e+02
## 9                          Time_of_Display:Visual_Field   1  24 3.941308e-01
## 10                          Condition_code:Visual_Field   1  24 7.381775e+02
## 11                                Validity:Visual_Field   1  24 1.084749e+02
## 12              Time_of_Display:Condition_code:Validity   1  24 4.404291e-01
## 13          Time_of_Display:Condition_code:Visual_Field   1  24 1.144954e+02
## 14                Time_of_Display:Validity:Visual_Field   1  24 3.470410e+02
## 15                 Condition_code:Validity:Visual_Field   1  24 6.828298e+01
## 16 Time_of_Display:Condition_code:Validity:Visual_Field   1  24 2.443175e+00
##           SSd            F            p p<.05          ges partial_eta_squared
## 1  442411.531 2.392410e+03 1.492104e-25     * 9.885693e-01        9.900679e-01
## 2   11933.621 9.000656e-01 3.522201e-01       8.768712e-04        3.614712e-02
## 3    2300.825 3.794064e-02 8.472019e-01       7.132725e-06        1.578365e-03
## 4    4700.357 8.361447e+00 8.016516e-03     * 3.201033e-03        2.583768e-01
## 5   18590.963 6.842288e-06 9.979345e-01       1.039378e-08        2.850953e-07
## 6    4047.129 9.756386e+00 4.619034e-03     * 3.215936e-03        2.890234e-01
## 7    4702.342 8.982585e-01 3.526953e-01       3.450135e-04        3.607716e-02
## 8    3379.101 3.666029e+00 6.752611e-02       1.011179e-03        1.325101e-01
## 9    3284.766 2.879700e-03 9.576480e-01       7.728970e-07        1.199731e-04
## 10   1984.884 8.925589e+00 6.391588e-03     * 1.445487e-03        2.710836e-01
## 11   1493.694 1.742926e+00 1.992219e-01       2.126760e-04        6.770505e-02
## 12   2829.605 3.735609e-03 9.517701e-01       8.636887e-07        1.556261e-04
## 13   2508.385 1.095482e+00 3.056870e-01       2.244772e-04        4.365256e-02
## 14   1117.309 7.454505e+00 1.166586e-02     * 6.800908e-04        2.369932e-01
## 15   2077.238 7.889281e-01 3.832402e-01       1.338862e-04        3.182582e-02
## 16   2577.470 2.274952e-02 8.813708e-01       4.791087e-06        9.469989e-04

#Plotting with VF included

#Summarize the data
RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  group_by(Validity, Condition_code, Participant_ID, Visual_Field) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Validity, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Validity, Visual_Field)

#Set factor levels to ensure the correct order
RM_ANOVA_VF_data$Validity <- factor(RM_ANOVA_VF_data$Validity, levels = c("Valid", "Invalid"))
RM_ANOVA_VF_data$Visual_Field <- factor(RM_ANOVA_VF_data$Visual_Field, levels = c("left", "right"))

#Print the summarized data structure and sample for debugging
print(str(RM_ANOVA_VF_data))
## tibble [200 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Validity      : Factor w/ 2 levels "Valid","Invalid": 2 2 1 1 2 2 1 1 2 2 ...
##  $ Condition_code: Factor w/ 2 levels "face-noise","place-noise": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Participant_ID: Factor w/ 25 levels "2","3","4","5",..: 1 1 1 1 1 1 1 1 2 2 ...
##  $ Visual_Field  : Factor w/ 2 levels "left","right": 2 1 2 1 2 1 2 1 2 1 ...
##  $ mean_rt       : num [1:200] 296 293 292 286 298 ...
##  $ sd_rt         : num [1:200] 32.5 29 30.2 35 26.6 ...
## NULL
print(head(RM_ANOVA_VF_data, 20))
## # A tibble: 20 × 6
##    Validity Condition_code Participant_ID Visual_Field mean_rt sd_rt
##    <fct>    <fct>          <fct>          <fct>          <dbl> <dbl>
##  1 Invalid  face-noise     2              right           296.  32.5
##  2 Invalid  face-noise     2              left            293.  29.0
##  3 Valid    face-noise     2              right           292.  30.2
##  4 Valid    face-noise     2              left            286.  35.0
##  5 Invalid  place-noise    2              right           298.  26.6
##  6 Invalid  place-noise    2              left            298.  35.7
##  7 Valid    place-noise    2              right           292.  35.5
##  8 Valid    place-noise    2              left            291.  31.5
##  9 Invalid  face-noise     3              right           393.  41.8
## 10 Invalid  face-noise     3              left            379.  45.1
## 11 Valid    face-noise     3              right           398.  49.6
## 12 Valid    face-noise     3              left            376.  48.2
## 13 Invalid  place-noise    3              right           389.  40.5
## 14 Invalid  place-noise    3              left            385.  42.0
## 15 Valid    place-noise    3              right           377.  48.9
## 16 Valid    place-noise    3              left            390.  47.8
## 17 Invalid  face-noise     4              right           334.  51.2
## 18 Invalid  face-noise     4              left            326.  52.2
## 19 Valid    face-noise     4              right           310.  54.7
## 20 Valid    face-noise     4              left            305.  43.2
#Calculate means and standard errors for each variable, including Visual_Field
mean_data_VF <- RM_ANOVA_VF_data %>%
  group_by(Validity, Condition_code, Visual_Field) %>%
  summarise(
    Mean_Value = mean(mean_rt),
    SE_Value = sd(mean_rt) / sqrt(n()),
    .groups = 'drop')

#Print the mean data structure and sample for debugging
print(str(mean_data_VF))
## tibble [8 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Validity      : Factor w/ 2 levels "Valid","Invalid": 1 1 1 1 2 2 2 2
##  $ Condition_code: Factor w/ 2 levels "face-noise","place-noise": 1 1 2 2 1 1 2 2
##  $ Visual_Field  : Factor w/ 2 levels "left","right": 1 2 1 2 1 2 1 2
##  $ Mean_Value    : num [1:8] 325 328 333 330 333 ...
##  $ SE_Value      : num [1:8] 6.75 6.85 7.07 6.78 7.52 ...
## NULL
print(head(mean_data_VF, 20))
## # A tibble: 8 × 5
##   Validity Condition_code Visual_Field Mean_Value SE_Value
##   <fct>    <fct>          <fct>             <dbl>    <dbl>
## 1 Valid    face-noise     left               325.     6.75
## 2 Valid    face-noise     right              328.     6.85
## 3 Valid    place-noise    left               333.     7.07
## 4 Valid    place-noise    right              330.     6.78
## 5 Invalid  face-noise     left               333.     7.52
## 6 Invalid  face-noise     right              335.     6.67
## 7 Invalid  place-noise    left               334.     7.01
## 8 Invalid  place-noise    right              333.     7.15
#Check for duplicates in the summarized data
duplicates <- RM_ANOVA_VF_data %>%
  group_by(Validity, Condition_code, Participant_ID, Visual_Field) %>%
  filter(n() > 1)
print(duplicates)
## # A tibble: 0 × 6
## # Groups:   Validity, Condition_code, Participant_ID, Visual_Field [0]
## # ℹ 6 variables: Validity <fct>, Condition_code <fct>, Participant_ID <fct>,
## #   Visual_Field <fct>, mean_rt <dbl>, sd_rt <dbl>
#Define the y-axis limits
y_limits <- c(300, 350) 

#Change the names of the variables on the x-axis
custom_labels <- c("face-noise" = "face-noise",
                   "place-noise" = "place-noise")

#Define the interaction order
mean_data_VF <- mean_data_VF %>%
  mutate(interaction_order = paste0(Condition_code, ".", Validity))

mean_data_VF$interaction_order <- factor(
  mean_data_VF$interaction_order,
  levels = c("face-noise.Valid", "face-noise.Invalid",
             "place-noise.Valid", "place-noise.Invalid"))

mean_data_VF$Condition_code <- factor(mean_data_VF$Condition_code,
                                      levels = c("face-noise", "place-noise"))



#key for fill (condition + validity)
mean_data_VF <- mean_data_VF %>%
  mutate(fill_key = paste0(Condition_code, ".", Validity))

#fill colors
fill_palette <- c(
  "face-noise.Valid"    = "#66c2a5",
  "face-noise.Invalid"  = "#FFFFFF",
  "place-noise.Valid"   = "#8da0cb",
  "place-noise.Invalid" = "#FFFFFF")

#borders color
border_palette <- c(
  "face-noise"  = "#66c2a5",
  "place-noise" = "#8da0cb")

#fill pattern
pattern_palette <- c(
  "Valid"   = "none",
  "Invalid" = "stripe")

#Plotting
ggplot(mean_data_VF,aes(x = Condition_code, y = Mean_Value, group = Validity)) +
  geom_col_pattern(aes(fill = fill_key, color = Condition_code, pattern = Validity),
    position = position_dodge(width = 0.9),
    width = 0.85,
    linewidth = 0.7,
    pattern_fill = "black",
    pattern_colour = "black",
    pattern_density = 0.25,
    pattern_spacing = 0.04,
    pattern_angle = 45) +
  geom_errorbar(aes(
      ymin = Mean_Value - SE_Value,
      ymax = Mean_Value + SE_Value),
    width = 0.2,
    position = position_dodge(width = 0.9),
    color = "black",
    linewidth = 0.5) +
  scale_fill_manual(values = fill_palette) +
  scale_color_manual(values = border_palette) +
  scale_pattern_manual(values = pattern_palette) +
  facet_wrap(~ Visual_Field,
    ncol = 2,
    labeller = labeller(Visual_Field = c(left = "Left Visual Field", right = "Right Visual Field"))) +
  scale_x_discrete(labels = c("face-noise" = "face-noise", "place-noise" = "place-noise")) +
  xlab("Condition") +
  ylab("Mean Reaction Time") +
  ggtitle("Mean Reaction Time per Validity, Condition, and Visual Field") +
  theme_bw() +
  theme(
    axis.title.x = element_text(size = 14),
    axis.title.y = element_text(size = 14),
    axis.text.x  = element_text(size = 12),
    axis.text.y  = element_text(size = 12),
    plot.title   = element_text(size = 16, hjust = 0.5)) +
  coord_cartesian(ylim = y_limits)

#Checking the Distribution of RTs accross VFs
mean_data_VF %>%
     arrange(Condition_code, Validity, Visual_Field) %>%
     print(n = Inf)
## # A tibble: 8 × 7
##   Validity Condition_code Visual_Field Mean_Value SE_Value interaction_order  
##   <fct>    <fct>          <fct>             <dbl>    <dbl> <fct>              
## 1 Valid    face-noise     left               325.     6.75 face-noise.Valid   
## 2 Valid    face-noise     right              328.     6.85 face-noise.Valid   
## 3 Invalid  face-noise     left               333.     7.52 face-noise.Invalid 
## 4 Invalid  face-noise     right              335.     6.67 face-noise.Invalid 
## 5 Valid    place-noise    left               333.     7.07 place-noise.Valid  
## 6 Valid    place-noise    right              330.     6.78 place-noise.Valid  
## 7 Invalid  place-noise    left               334.     7.01 place-noise.Invalid
## 8 Invalid  place-noise    right              333.     7.15 place-noise.Invalid
## # ℹ 1 more variable: fill_key <chr>

#Plotting with SOAs

#Plotting across SOAs
#Creating a cleaned summary dataset that computes mean and SD of RTs 
RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  group_by(Time_of_Display, Validity, Condition_code, Visual_Field, Participant_ID) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt   = sd(key_resp.rt, na.rm = TRUE),
    n_trials = sum(!is.na(key_resp.rt)),
    .groups = "drop"
  ) %>%
  mutate(across(c(Time_of_Display, Validity, Condition_code, Visual_Field, Participant_ID), factor))

#set factor order
RM_ANOVA_VF_data$Validity       <- factor(RM_ANOVA_VF_data$Validity, levels = c("Valid", "Invalid"))
RM_ANOVA_VF_data$Visual_Field   <- factor(RM_ANOVA_VF_data$Visual_Field, levels = c("left", "right"))
RM_ANOVA_VF_data$Condition_code <- factor(RM_ANOVA_VF_data$Condition_code, levels = c("face-noise", "place-noise"))

#Group means + SE across participants
mean_data_VF <- RM_ANOVA_VF_data %>%
  group_by(Time_of_Display, Condition_code, Validity, Visual_Field) %>%
  summarise(
    Mean_Value = mean(mean_rt, na.rm = TRUE),
    SE_Value   = sd(mean_rt, na.rm = TRUE) / sqrt(n()),
    .groups = "drop") %>%
  mutate(
    fill_key = paste0(Condition_code, ".", Validity),
    fill_key = factor(
      fill_key,
      levels = c("face-noise.Valid", "face-noise.Invalid",
        "place-noise.Valid", "place-noise.Invalid")))


#Styling palettes
fill_palette <- c(
  "face-noise.Valid"    = "#66c2a5",
  "face-noise.Invalid"  = "#FFFFFF",
  "place-noise.Valid"   = "#8da0cb",
  "place-noise.Invalid" = "#FFFFFF")

border_palette <- c(
  "face-noise"  = "#66c2a5",
  "place-noise" = "#8da0cb")

pattern_palette <- c(
  "Valid"   = "none",
  "Invalid" = "stripe")

#x-axis labels for SOA
soa_labels <- c(
  "Time100" = "100 ms",
  "Time900" = "900 ms")

#y-axis limits 
y_limits <- c(300, 350)

#Plot
ggplot(
  mean_data_VF,
  aes(x = Time_of_Display, y = Mean_Value, group = fill_key)
) +
  geom_col_pattern(
    aes(
      fill    = fill_key,         
      color   = Condition_code,   
      pattern = Validity          
    ),
    position = position_dodge(width = 0.9),
    width = 0.85,
    linewidth = 0.7,
    pattern_fill = "black",
    pattern_colour = "black",
    pattern_density = 0.20,
    pattern_spacing = 0.03,
    pattern_angle = 45
  ) +
  geom_errorbar(
    aes(ymin = Mean_Value - SE_Value, ymax = Mean_Value + SE_Value),
    width = 0.2,
    position = position_dodge(width = 0.9),
    color = "black",
    linewidth = 0.5
  ) +
  scale_fill_manual(values = fill_palette) +
  scale_color_manual(values = border_palette) +
  scale_pattern_manual(values = pattern_palette) +
  guides(
    fill = guide_legend(
      title = NULL,
      override.aes = list(
        color = "black",
        pattern_fill = "black",
        pattern_colour = "black",
        pattern_density = 0.20,
        pattern_spacing = 0.03,
        pattern_angle = 45
      )
    ),
    color = "none",
    pattern = "none"
  ) +
  facet_wrap(
    ~ Visual_Field,
    ncol = 2,
    labeller = labeller(Visual_Field = c(left = "Left Visual Field", right = "Right Visual Field"))
  ) +
  scale_x_discrete(labels = soa_labels) +
  xlab("SOA") +
  ylab("Mean Reaction Time (ms)") +
  ggtitle("Mean Reaction Time across SOA by Condition, Validity, and Visual Field") +
  theme_bw() +
  theme(
    axis.title.x = element_text(size = 14),
    axis.title.y = element_text(size = 14),
    axis.text.x  = element_text(size = 12),
    axis.text.y  = element_text(size = 12),
    plot.title   = element_text(size = 16, hjust = 0.5)
  ) +
  coord_cartesian(ylim = y_limits)

#testing VF for face-noise conditions for Left Appearance of Faces

#Filter and summarize the data
RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "face-noise", Visual_Field == "left") %>%
  group_by(Participant_ID, Validity, Condition_code, Visual_Field) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Visual_Field)

# View the summarized data
print(RM_ANOVA_VF_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Visual_Field mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>          <dbl> <dbl>
##  1 2              Invalid  face-noise     left            293.  29.0
##  2 2              Valid    face-noise     left            286.  35.0
##  3 3              Invalid  face-noise     left            379.  45.1
##  4 3              Valid    face-noise     left            376.  48.2
##  5 4              Invalid  face-noise     left            326.  52.2
##  6 4              Valid    face-noise     left            305.  43.2
##  7 5              Invalid  face-noise     left            300.  46.6
##  8 5              Valid    face-noise     left            303.  44.1
##  9 6              Invalid  face-noise     left            324.  40.5
## 10 6              Valid    face-noise     left            319.  37.5
## # ℹ 40 more rows
# Step 2: Extract vectors for each validity condition
valid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

# Ensure the vectors are aligned by Participant_ID
if (length(valid_means_VF) != length(invalid_means_VF)) {
  stop("Mismatch in the number of participants between validity conditions")
}

# Step 3: Perform the paired t-test
res_VF <- t.test(valid_means_VF, invalid_means_VF, paired = TRUE)

# View the t-test results
print(res_VF)
## 
##  Paired t-test
## 
## data:  valid_means_VF and invalid_means_VF
## t = -3.6708, df = 24, p-value = 0.001205
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -11.995831  -3.361299
## sample estimates:
## mean difference 
##       -7.678565
# Summary statistics
summary_stats_VF <- RM_ANOVA_VF_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n()
  )

# View summary statistics
print(summary_stats_VF)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     333.    NA    25
## 2 Valid       325.    NA    25

#testing VF for face-noise conditions for Right Appearance of Faces

#Filter and summarize the data
RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "face-noise", Visual_Field == "right") %>%
  group_by(Participant_ID, Validity, Condition_code, Visual_Field) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Visual_Field)

# View the summarized data
print(RM_ANOVA_VF_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Visual_Field mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>          <dbl> <dbl>
##  1 2              Invalid  face-noise     right           296.  32.5
##  2 2              Valid    face-noise     right           292.  30.2
##  3 3              Invalid  face-noise     right           393.  41.8
##  4 3              Valid    face-noise     right           398.  49.6
##  5 4              Invalid  face-noise     right           334.  51.2
##  6 4              Valid    face-noise     right           310.  54.7
##  7 5              Invalid  face-noise     right           310.  42.0
##  8 5              Valid    face-noise     right           302.  35.1
##  9 6              Invalid  face-noise     right           329.  51.0
## 10 6              Valid    face-noise     right           320.  32.3
## # ℹ 40 more rows
# Step 2: Extract vectors for each validity condition
valid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

# Ensure the vectors are aligned by Participant_ID
if (length(valid_means_VF) != length(invalid_means_VF)) {
  stop("Mismatch in the number of participants between validity conditions")
}

# Step 3: Perform the paired t-test
res_VF <- t.test(valid_means_VF, invalid_means_VF, paired = TRUE)

# View the t-test results
print(res_VF)
## 
##  Paired t-test
## 
## data:  valid_means_VF and invalid_means_VF
## t = -3.6138, df = 24, p-value = 0.001389
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -10.454513  -2.853923
## sample estimates:
## mean difference 
##       -6.654218
# Summary statistics
summary_stats_VF <- RM_ANOVA_VF_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n()
  )

# View summary statistics
print(summary_stats_VF)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     335.    NA    25
## 2 Valid       328.    NA    25

#testing VF for place-noise conditions for Left Appearance of Places

#Filter and summarize the data
RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "place-noise", Visual_Field == "left") %>%
  group_by(Participant_ID, Validity, Condition_code, Visual_Field) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Visual_Field)

# View the summarized data
print(RM_ANOVA_VF_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Visual_Field mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>          <dbl> <dbl>
##  1 2              Invalid  place-noise    left            298.  35.7
##  2 2              Valid    place-noise    left            291.  31.5
##  3 3              Invalid  place-noise    left            385.  42.0
##  4 3              Valid    place-noise    left            390.  47.8
##  5 4              Invalid  place-noise    left            313.  44.6
##  6 4              Valid    place-noise    left            307.  48.2
##  7 5              Invalid  place-noise    left            304.  35.2
##  8 5              Valid    place-noise    left            302.  37.1
##  9 6              Invalid  place-noise    left            330.  45.6
## 10 6              Valid    place-noise    left            327.  43.3
## # ℹ 40 more rows
# Step 2: Extract vectors for each validity condition
valid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

# Ensure the vectors are aligned by Participant_ID
if (length(valid_means_VF) != length(invalid_means_VF)) {
  stop("Mismatch in the number of participants between validity conditions")
}

# Step 3: Perform the paired t-test
res_VF <- t.test(valid_means_VF, invalid_means_VF, paired = TRUE)

# View the t-test results
print(res_VF)
## 
##  Paired t-test
## 
## data:  valid_means_VF and invalid_means_VF
## t = -0.88045, df = 24, p-value = 0.3873
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -5.005355  2.011847
## sample estimates:
## mean difference 
##       -1.496754
# Summary statistics
summary_stats_VF <- RM_ANOVA_VF_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n()
  )

# View summary statistics
print(summary_stats_VF)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     334.    NA    25
## 2 Valid       333.    NA    25

#testing VF for place-noise conditions for Right Appearance of Places

#Filter and summarize the data
RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  filter(Condition_code == "place-noise", Visual_Field == "right") %>%
  group_by(Participant_ID, Validity, Condition_code, Visual_Field) %>%
  summarise(
    mean_rt = mean(key_resp.rt, na.rm = TRUE),
    sd_rt = sd(key_resp.rt, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate_at(vars(Participant_ID, Condition_code, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Visual_Field)

# View the summarized data
print(RM_ANOVA_VF_data)
## # A tibble: 50 × 6
##    Participant_ID Validity Condition_code Visual_Field mean_rt sd_rt
##    <fct>          <fct>    <fct>          <fct>          <dbl> <dbl>
##  1 2              Invalid  place-noise    right           298.  26.6
##  2 2              Valid    place-noise    right           292.  35.5
##  3 3              Invalid  place-noise    right           389.  40.5
##  4 3              Valid    place-noise    right           377.  48.9
##  5 4              Invalid  place-noise    right           326.  49.9
##  6 4              Valid    place-noise    right           316.  44.4
##  7 5              Invalid  place-noise    right           306.  38.9
##  8 5              Valid    place-noise    right           303.  47.3
##  9 6              Invalid  place-noise    right           322.  39.2
## 10 6              Valid    place-noise    right           319.  36.1
## # ℹ 40 more rows
# Step 2: Extract vectors for each validity condition
valid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Valid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

invalid_means_VF <- RM_ANOVA_VF_data %>%
  filter(Validity == "Invalid") %>%
  arrange(Participant_ID) %>%
  pull(mean_rt)

# Ensure the vectors are aligned by Participant_ID
if (length(valid_means_VF) != length(invalid_means_VF)) {
  stop("Mismatch in the number of participants between validity conditions")
}

# Step 3: Perform the paired t-test
res_VF <- t.test(valid_means_VF, invalid_means_VF, paired = TRUE)

# View the t-test results
print(res_VF)
## 
##  Paired t-test
## 
## data:  valid_means_VF and invalid_means_VF
## t = -2.1738, df = 24, p-value = 0.03981
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -6.3816226 -0.1654965
## sample estimates:
## mean difference 
##        -3.27356
# Summary statistics
summary_stats_VF <- RM_ANOVA_VF_data %>%
  group_by(Validity) %>%
  summarise(
    mean_rt = mean(mean_rt),
    sd_rt = sd(mean_rt),
    n = n()
  )

# View summary statistics
print(summary_stats_VF)
## # A tibble: 2 × 4
##   Validity mean_rt sd_rt     n
##   <fct>      <dbl> <dbl> <int>
## 1 Invalid     333.    NA    25
## 2 Valid       330.    NA    25

#B-H Correction

#Bonferroni correction for 4 visual-field follow-up paired t-tests
#correct the 4 p-values you already got:
p_raw <- c(
  face_left  = 0.001205,
  face_right = 0.001389,
  place_left = 0.3873,
  place_right= 0.03981
)

p_bonf <- p.adjust(p_raw, method = "bonferroni")
p_bonf
##   face_left  face_right  place_left place_right 
##    0.004820    0.005556    1.000000    0.159240