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