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