We know that P-values (within t-test context as an example..) is highly sensitive to sample size. A larger sample will yield a smaller p-value remaining everything else constant. On the other hand, Cohen´s d effect size remains the same.
I'm inspired in this code here, but I´ve changed some parts to make the difference between means constant, instead of creating a random variable based on a normal distribution.
Although everything is working, I do imagine that some of the experts in this community could improve my syntax.
library(tidyverse)
ctrl_mean <- 8
ctrl_sd <- 1
treated_mean <- 7.9
treated_sd <- 1.2
sample <- numeric() #criar vetor para grupar resultados
nsim <- 1000 #criar variavel
t_result <- numeric()
for (i in 1:nsim) {
set.seed(123)
t_result[i] <- (mean(ctrl_mean)-mean(treated_mean))/sqrt((ctrl_sd^2/(i))+(treated_sd^2/(i))) #manual t test
sample[i] <- i # number of participants
}
ds <- data.frame(
sample = sample, #assign the sample size
t_result = round(t_result,3), #get the t test result
degrees = sample*2-2) #compute the degrees of freedom
ds %>%
filter(sample>1) %>%
mutate(P_Value = 2*pt(abs(t_result), df=degrees,lower.tail=FALSE)) %>%
left_join(ds,.) -> ds
#plot
ggplot(ds, aes(x=sample, y=P_Value)) +
geom_line() +
annotate("segment", x = 1, xend=sample, y = 0.05, yend = 0.05, colour = "purple", linetype = "dashed") +
annotate("segment", x = 1, xend=sample, y = 0.01, yend = 0.01, colour = "red", linetype = "dashed") +
annotate("text", x = c(1,1), y=c(.035,.001), label = c("p < 0.05", "p < 0.01"))