##Loading the dataset and packages

library(readxl)
Conditions2_3_900 <- read_excel("~/Documents/2025/Fall 2025/Master's Thesis/Data/Behavioral_Data/Conditions2&3_900.xlsx")
#View(Conditions2_3_900)

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)
## Learn more about sjPlot with 'browseVignettes("sjPlot")'.
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_900
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(900), labels = c("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 HaF29.jpg Gray28.j… Time900         face-noise     left          correct      
## 4 HaF23.jpg Gray17.j… Time900         face-noise     right         correct      
## 5 Gray11.j… HaF12.jpg Time900         face-noise     right         correct      
## 6 HaF14.jpg Gray3.jpg Time900         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: 100 × 7
## # Groups:   Time_of_Display, Condition_code, Validity [4]
##    Time_of_Display Condition_code Validity Participant_ID count  mean    sd
##    <fct>           <fct>          <fct>    <fct>          <int> <dbl> <dbl>
##  1 Time900         face-noise     Invalid  2                119  297.  30.1
##  2 Time900         face-noise     Valid    2                118  290.  33.2
##  3 Time900         place-noise    Invalid  2                120  299.  27.7
##  4 Time900         place-noise    Valid    2                118  296.  35.0
##  5 Time900         face-noise     Invalid  3                114  388.  45.6
##  6 Time900         face-noise     Valid    3                116  391.  48.0
##  7 Time900         place-noise    Invalid  3                115  386.  39.9
##  8 Time900         place-noise    Valid    3                114  385.  48.5
##  9 Time900         face-noise     Invalid  4                113  327.  54.1
## 10 Time900         face-noise     Valid    4                116  306.  46.1
## # ℹ 90 more rows
RM_anova <- ezANOVA(
  data = RM_ANOVA_data,
  dv = .(mean),
  wid = .(Participant_ID),
  within = .(Condition_code, Validity), detailed = TRUE)

print(RM_anova)
## $ANOVA
##                    Effect DFn DFd          SSn         SSd           F
## 1             (Intercept)   1  24 1.096379e+07 112351.8156 2342.026346
## 2          Condition_code   1  24 4.589281e+02   1149.3206    9.583292
## 3                Validity   1  24 7.085621e+02    724.6462   23.467302
## 4 Condition_code:Validity   1  24 1.511506e+02    541.8394    6.694999
##              p p<.05         ges
## 1 1.921563e-25     * 0.989640561
## 2 4.938330e-03     * 0.003982833
## 3 6.170524e-05     * 0.006136002
## 4 1.615519e-02     * 0.001315282
#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           F
## 1             (Intercept)   1  24 1.096379e+07 112351.8156 2342.026346
## 2          Condition_code   1  24 4.589281e+02   1149.3206    9.583292
## 3                Validity   1  24 7.085621e+02    724.6462   23.467302
## 4 Condition_code:Validity   1  24 1.511506e+02    541.8394    6.694999
##              p p<.05         ges partial_eta_squared
## 1 1.921563e-25     * 0.989640561           0.9898564
## 2 4.938330e-03     * 0.003982833           0.2853589
## 3 6.170524e-05     * 0.006136002           0.4943888
## 4 1.615519e-02     * 0.001315282           0.2181137

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) %>%
  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 [100 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Validity      : Factor w/ 2 levels "Valid","Invalid": 1 2 1 2 1 2 1 2 1 2 ...
##  $ Condition_code: Factor w/ 2 levels "face-noise","place-noise": 1 1 2 2 1 1 2 2 1 1 ...
##  $ Participant_ID: Factor w/ 25 levels "2","3","4","5",..: 1 1 1 1 2 2 2 2 3 3 ...
##  $ mean_rt       : num [1:100] 290 297 296 299 391 ...
##  $ sd_rt         : num [1:100] 33.2 30.1 35 27.7 48 ...
## NULL
print(head(RM_ANOVA_Validity_data, 20))
## # A tibble: 20 × 5
##    Validity Condition_code Participant_ID mean_rt sd_rt
##    <fct>    <fct>          <fct>            <dbl> <dbl>
##  1 Valid    face-noise     2                 290.  33.2
##  2 Invalid  face-noise     2                 297.  30.1
##  3 Valid    place-noise    2                 296.  35.0
##  4 Invalid  place-noise    2                 299.  27.7
##  5 Valid    face-noise     3                 391.  48.0
##  6 Invalid  face-noise     3                 388.  45.6
##  7 Valid    place-noise    3                 385.  48.5
##  8 Invalid  place-noise    3                 386.  39.9
##  9 Valid    face-noise     4                 306.  46.1
## 10 Invalid  face-noise     4                 327.  54.1
## 11 Valid    place-noise    4                 316.  47.8
## 12 Invalid  place-noise    4                 321.  48.1
## 13 Valid    face-noise     5                 300.  40.3
## 14 Invalid  face-noise     5                 300.  45.7
## 15 Valid    place-noise    5                 297.  37.0
## 16 Invalid  place-noise    5                 300.  38.2
## 17 Valid    face-noise     6                 323.  35.6
## 18 Invalid  face-noise     6                 329.  47.1
## 19 Valid    place-noise    6                 327.  41.1
## 20 Invalid  place-noise    6                 330.  45.1
#Calculate means and standard errors for RTs
mean_data <- RM_ANOVA_Validity_data %>%
  group_by(Validity, Condition_code) %>%
  summarise(
    n = n(),
    Mean_Value = mean(mean_rt, na.rm = TRUE),
    SE_Value = sd(mean_rt, na.rm = TRUE) / sqrt(n()),
    .groups = 'drop')

#Print the mean data structure and sample for debugging
print(str(mean_data))
## tibble [4 × 5] (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
##  $ n             : int [1:4] 25 25 25 25
##  $ Mean_Value    : num [1:4] 325 332 333 335
##  $ SE_Value      : num [1:4] 6.54 6.91 7.14 7.06
## NULL
print(head(mean_data, 20))
## # A tibble: 4 × 5
##   Validity Condition_code     n Mean_Value SE_Value
##   <fct>    <fct>          <int>      <dbl>    <dbl>
## 1 Valid    face-noise        25       325.     6.54
## 2 Valid    place-noise       25       332.     6.91
## 3 Invalid  face-noise        25       333.     7.14
## 4 Invalid  place-noise       25       335.     7.06
#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: 0 × 5
## # Groups:   Validity, Condition_code, Participant_ID [0]
## # ℹ 5 variables: Validity <fct>, Condition_code <fct>, Participant_ID <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", "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)

#Running t-test for Conditions and Validity #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        297.  30.1
##  2 2              Valid    face-noise        290.  33.2
##  3 3              Invalid  face-noise        388.  45.6
##  4 3              Valid    face-noise        391.  48.0
##  5 4              Invalid  face-noise        327.  54.1
##  6 4              Valid    face-noise        306.  46.1
##  7 5              Invalid  face-noise        300.  45.7
##  8 5              Valid    face-noise        300.  40.3
##  9 6              Invalid  face-noise        329.  47.1
## 10 6              Valid    face-noise        323.  35.6
## # ℹ 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.3635, df = 24, p-value = 0.0002096
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -11.463740  -4.101524
## sample estimates:
## mean difference 
##       -7.782632
# 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

#Running t-test assumptions

#difference
differences <- valid_means - invalid_means

#normality
hist(differences)

qqnorm(differences)
qqline(differences)

#Shapiro-Wilk normality test
shapiro.test(differences)
## 
##  Shapiro-Wilk normality test
## 
## data:  differences
## W = 0.94615, p-value = 0.205

#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       299.  27.7
##  2 2              Valid    place-noise       296.  35.0
##  3 3              Invalid  place-noise       386.  39.9
##  4 3              Valid    place-noise       385.  48.5
##  5 4              Invalid  place-noise       321.  48.1
##  6 4              Valid    place-noise       316.  47.8
##  7 5              Invalid  place-noise       300.  38.2
##  8 5              Valid    place-noise       297.  37.0
##  9 6              Invalid  place-noise       330.  45.1
## 10 6              Valid    place-noise       327.  41.1
## # ℹ 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.8086, df = 24, p-value = 0.009733
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -4.9701729 -0.7596265
## sample estimates:
## mean difference 
##         -2.8649
# 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

#Running t-test assumptions

#difference
differences <- valid_means - invalid_means

#normality
hist(differences)

qqnorm(differences)
qqline(differences)

#Shapiro-Wilk normality test
shapiro.test(differences)
## 
##  Shapiro-Wilk normality test
## 
## data:  differences
## W = 0.96503, p-value = 0.5234

#Including the Visual Field in the Model

RM_ANOVA_VF_data <- SH_Cleaned_Data %>%
  group_by(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, Validity, Visual_Field), factor) %>%
  arrange(Participant_ID, Condition_code, Validity, Visual_Field)
## `summarise()` has grouped output by 'Condition_code', 'Validity',
## 'Visual_Field'. You can override using the `.groups` argument.
RM_ANOVA_VF_data
## # A tibble: 200 × 7
## # Groups:   Condition_code, Validity, Visual_Field [8]
##    Condition_code Validity Visual_Field Participant_ID count  mean    sd
##    <fct>          <fct>    <fct>        <fct>          <int> <dbl> <dbl>
##  1 face-noise     Invalid  right        2                 59  296.  31.4
##  2 face-noise     Invalid  left         2                 60  298.  29.1
##  3 face-noise     Valid    right        2                 59  295.  29.1
##  4 face-noise     Valid    left         2                 59  285.  36.5
##  5 place-noise    Invalid  right        2                 60  300.  26.8
##  6 place-noise    Invalid  left         2                 60  298.  28.7
##  7 place-noise    Valid    right        2                 58  295.  38.7
##  8 place-noise    Valid    left         2                 60  296.  31.4
##  9 face-noise     Invalid  right        3                 56  397.  42.8
## 10 face-noise     Invalid  left         3                 58  380.  47.3
## # ℹ 190 more rows
RM_anova_VF <- ezANOVA(
  data = RM_ANOVA_VF_data,
  dv = .(mean),
  wid = .(Participant_ID),
  within = .(Condition_code, Validity, Visual_Field), detailed = TRUE)

print(RM_anova_VF)
## $ANOVA
##                                 Effect DFn DFd          SSn        SSd
## 1                          (Intercept)   1  24 2.192650e+07 224858.088
## 2                       Condition_code   1  24 8.839968e+02   2329.818
## 3                             Validity   1  24 1.429043e+03   1413.840
## 4                         Visual_Field   1  24 1.853820e+00  12017.844
## 5              Condition_code:Validity   1  24 2.968382e+02   1097.129
## 6          Condition_code:Visual_Field   1  24 1.228867e+02   1586.592
## 7                Validity:Visual_Field   1  24 4.703699e+01   1159.391
## 8 Condition_code:Validity:Visual_Field   1  24 2.401703e+01   1170.187
##              F            p p<.05          ges
## 1 2.340302e+03 1.938451e-25     * 9.889215e-01
## 2 9.106259e+00 5.950537e-03     * 3.585948e-03
## 3 2.425806e+01 5.024425e-05     * 5.784148e-03
## 4 3.702135e-03 9.519864e-01       7.547059e-06
## 5 6.493417e+00 1.764661e-02     * 1.207004e-03
## 6 1.858877e+00 1.854084e-01       5.000357e-04
## 7 9.736903e-01 3.336059e-01       1.914564e-04
## 8 4.925781e-01 4.895304e-01       9.776654e-05
#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        SSd
## 1                          (Intercept)   1  24 2.192650e+07 224858.088
## 2                       Condition_code   1  24 8.839968e+02   2329.818
## 3                             Validity   1  24 1.429043e+03   1413.840
## 4                         Visual_Field   1  24 1.853820e+00  12017.844
## 5              Condition_code:Validity   1  24 2.968382e+02   1097.129
## 6          Condition_code:Visual_Field   1  24 1.228867e+02   1586.592
## 7                Validity:Visual_Field   1  24 4.703699e+01   1159.391
## 8 Condition_code:Validity:Visual_Field   1  24 2.401703e+01   1170.187
##              F            p p<.05          ges partial_eta_squared
## 1 2.340302e+03 1.938451e-25     * 9.889215e-01        0.9898490142
## 2 9.106259e+00 5.950537e-03     * 3.585948e-03        0.2750615548
## 3 2.425806e+01 5.024425e-05     * 5.784148e-03        0.5026737692
## 4 3.702135e-03 9.519864e-01       7.547059e-06        0.0001542318
## 5 6.493417e+00 1.764661e-02     * 1.207004e-03        0.2129448690
## 6 1.858877e+00 1.854084e-01       5.000357e-04        0.0718854568
## 7 9.736903e-01 3.336059e-01       1.914564e-04        0.0389886418
## 8 4.925781e-01 4.895304e-01       9.776654e-05        0.0201113213

#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 298 295 285 300 ...
##  $ sd_rt         : num [1:200] 31.4 29.1 29.1 36.5 26.8 ...
## 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.  31.4
##  2 Invalid  face-noise     2              left            298.  29.1
##  3 Valid    face-noise     2              right           295.  29.1
##  4 Valid    face-noise     2              left            285.  36.5
##  5 Invalid  place-noise    2              right           300.  26.8
##  6 Invalid  place-noise    2              left            298.  28.7
##  7 Valid    place-noise    2              right           295.  38.7
##  8 Valid    place-noise    2              left            296.  31.4
##  9 Invalid  face-noise     3              right           397.  42.8
## 10 Invalid  face-noise     3              left            380.  47.3
## 11 Valid    face-noise     3              right           398.  49.6
## 12 Valid    face-noise     3              left            384.  45.7
## 13 Invalid  place-noise    3              right           386.  41.1
## 14 Invalid  place-noise    3              left            386.  39.1
## 15 Valid    place-noise    3              right           377.  49.2
## 16 Valid    place-noise    3              left            394.  46.7
## 17 Invalid  face-noise     4              right           330.  54.8
## 18 Invalid  face-noise     4              left            325.  53.9
## 19 Valid    face-noise     4              right           305.  51.2
## 20 Valid    face-noise     4              left            306.  40.9
#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] 323 327 332 331 333 ...
##  $ SE_Value      : num [1:8] 6.83 6.66 7.08 7.18 7.94 ...
## 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               323.     6.83
## 2 Valid    face-noise     right              327.     6.66
## 3 Valid    place-noise    left               332.     7.08
## 4 Valid    place-noise    right              331.     7.18
## 5 Invalid  face-noise     left               333.     7.94
## 6 Invalid  face-noise     right              333.     6.90
## 7 Invalid  place-noise    left               335.     7.18
## 8 Invalid  place-noise    right              334.     7.38
#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               323.     6.83 face-noise.Valid   
## 2 Valid    face-noise     right              327.     6.66 face-noise.Valid   
## 3 Invalid  face-noise     left               333.     7.94 face-noise.Invalid 
## 4 Invalid  face-noise     right              333.     6.90 face-noise.Invalid 
## 5 Valid    place-noise    left               332.     7.08 place-noise.Valid  
## 6 Valid    place-noise    right              331.     7.18 place-noise.Valid  
## 7 Invalid  place-noise    left               335.     7.18 place-noise.Invalid
## 8 Invalid  place-noise    right              334.     7.38 place-noise.Invalid
## # ℹ 1 more variable: fill_key <chr>

#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            298.  29.1
##  2 2              Valid    face-noise     left            285.  36.5
##  3 3              Invalid  face-noise     left            380.  47.3
##  4 3              Valid    face-noise     left            384.  45.7
##  5 4              Invalid  face-noise     left            325.  53.9
##  6 4              Valid    face-noise     left            306.  40.9
##  7 5              Invalid  face-noise     left            294.  47.0
##  8 5              Valid    face-noise     left            298.  44.1
##  9 6              Invalid  face-noise     left            327.  43.4
## 10 6              Valid    face-noise     left            322.  38.0
## # ℹ 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.8846, df = 24, p-value = 0.0007049
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -14.464083  -4.427193
## sample estimates:
## mean difference 
##       -9.445638
# 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       323.    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.  31.4
##  2 2              Valid    face-noise     right           295.  29.1
##  3 3              Invalid  face-noise     right           397.  42.8
##  4 3              Valid    face-noise     right           398.  49.6
##  5 4              Invalid  face-noise     right           330.  54.8
##  6 4              Valid    face-noise     right           305.  51.2
##  7 5              Invalid  face-noise     right           306.  43.7
##  8 5              Valid    face-noise     right           302.  36.3
##  9 6              Invalid  face-noise     right           331.  50.8
## 10 6              Valid    face-noise     right           325.  33.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 = -2.9493, df = 24, p-value = 0.006998
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -10.402173  -1.837169
## sample estimates:
## mean difference 
##       -6.119671
# 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       327.    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.  28.7
##  2 2              Valid    place-noise    left            296.  31.4
##  3 3              Invalid  place-noise    left            386.  39.1
##  4 3              Valid    place-noise    left            394.  46.7
##  5 4              Invalid  place-noise    left            316.  43.9
##  6 4              Valid    place-noise    left            314.  49.2
##  7 5              Invalid  place-noise    left            302.  35.5
##  8 5              Valid    place-noise    left            300.  35.5
##  9 6              Invalid  place-noise    left            334.  48.7
## 10 6              Valid    place-noise    left            327.  44.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 = -1.7441, df = 24, p-value = 0.09394
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -6.9571012  0.5842798
## sample estimates:
## mean difference 
##       -3.186411
# 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       332.    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           300.  26.8
##  2 2              Valid    place-noise    right           295.  38.7
##  3 3              Invalid  place-noise    right           386.  41.1
##  4 3              Valid    place-noise    right           377.  49.2
##  5 4              Invalid  place-noise    right           326.  51.6
##  6 4              Valid    place-noise    right           318.  46.8
##  7 5              Invalid  place-noise    right           298.  41.0
##  8 5              Valid    place-noise    right           293.  38.6
##  9 6              Invalid  place-noise    right           326.  41.2
## 10 6              Valid    place-noise    right           326.  38.0
## # ℹ 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 = -1.6392, df = 24, p-value = 0.1142
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -5.9475011  0.6820853
## sample estimates:
## mean difference 
##       -2.632708
# 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       331.    NA    25

#B-H Correction

#B-H correction for 4 visual-field follow-up paired t-tests
p_raw <- c(
  face_left  = 0.0007049,
  face_right = 0.006998,
  place_left = 0.09394,
  place_right= 0.1142
)

p_bh <- p.adjust(p_raw, method = "BH")
p_bh
##   face_left  face_right  place_left place_right 
##   0.0028196   0.0139960   0.1142000   0.1142000