Săptămâna trecută am postat despre proporția din p Valori care vor fi „fragile” în diferite tipuri de experimente științifice sau alte inferențe. Proporția p Valorile fragile au fost definite ca proporția cuprinsă între 0,01 și 005. Am reacționat la întrebarea dacă este un lucru bun că proporția fragilă din literatura de psihologie pare să fi scăzut peste un deceniu sau două de la aproximativ 32% la aproximativ 26%. Am ajuns la concluzia că acest lucru nu ne -a spus prea multe despre progrese ca răspuns la criza de replicare.
A fost o discuție bună despre Bluesky când am postat pe asta și acum mi -aș califica puțin părerile. Punctele cheie pe care oamenii le -au făcut pe care nu le -am luat în considerare în mod adecvat în prezentarea mea au fost:
- Când oamenii de știință determină o dimensiune adecvată a eșantionului printr -un calcul al puterii, ei se bazează cel mai adesea pe dimensiunea eșantionului necesară pentru a da o anumită cantitate de putere pentru „diferența minimă pe care dorim să o detectăm”, mai degrabă decât diferența pe care o așteaptă de fapt
- Una dintre comploturile mele cheie a arătat o creștere aparentă a fragilului p Valori chiar și cu o putere constantă atunci când diferența planificată între mijloace a fost mare-când ceea ce se întâmpla de fapt a fost probabil un artefact al dimensiunilor minuscule ale eșantionului în această situație foarte artificială (ca să fiu sincer, încă nu sunt sigur în timp ce scriu acest lucru exact ceea ce se întâmpla, dar sunt destul de mulțumit că nu este teribil de important, și cu siguranță nu merită să fie principalul meu complot pe subiect)
- Gândindu -mă mai general la „dacă această scădere a„ fragilă ” p Valorile nu arată ceva pozitiv, atunci ce arată? ” Ceea ce îmi oferă o vedere ceva mai nuanțată.
Acest lucru m -a determinat să decid că ar trebui să mă uit mai sistematic în diferența dintre diferența „planificată pentru” dintre două probe și diferența „reală” în populație. Am făcut câteva simulări de variație aleatorie a diferenței reale față de cea planificată, dar nu suficient de sistematică și cuprinzătoare.
Ceea ce am făcut acum este să compar în mod sistematic fiecare combinație a unei strategii de eșantionare pentru a da o putere de 80% pentru „diferențe minime detectabile” de la 0,05 la 0,60 (12 valori diferite, distanțate 0,05 între ele) și diferențe reale de medie între 0,0 și 1,0 (11 valori diferite, distanțate 0,10 între ele). Cu 10.000 de simulări la fiecare combinație avem 12 x 11 x 10.000 = 1,32 milioane de simulări
Putem vedea că multe combinații rezonabile de diferențe „planificate pentru” și „reale” dintre cele două populații dau proporții fragile de p Valori care sunt destul de diferite de 26%. În special, în situația în care diferența reală este mai mare decât „diferența minimă detectabilă”, că dimensiunea eșantionului ar fi fost calculată pentru o putere de 80% (ceea ce probabil vizează majoritatea cercetătorilor), proporția fragilă devine rapid sub 26%.
Această proporție variază de la 80% atunci când diferența reală este zero (adică ipoteza nulă este adevărată) și p Distribuția valorilor este uniformă peste (0,1); până la mult sub 10% atunci când dimensiunea eșantionului este amplă pentru o putere mare (mult mai mare de 80%), suficientă pentru a ridica diferența reală între cele două populații.
Cred că acest lucru este mai bun la prezentarea problemelor decât blogul meu săptămâna trecută. Iată cum mă gândesc la această problemă acum:
- Aproximativ 26% din p Valorile vor fi într -adevăr „fragile” atunci când dimensiunea eșantionului a fost stabilită pentru a da o putere de 80% pe baza unei diferențe detectabile între două populații, ceea ce este într -adevăr aproximativ ceea ce se dovedește diferența reală.
- În general, o proporție de fragilă p Valorile care sunt mai mari decât acestea sugerează că experimentele sunt sub-alimentate de proiectare sau proiecte decente cu o putere de 80% s-au dovedit a se baza pe diferențe minime de detectalbe care adesea nu sunt diferențe reale în realitate sau se întâmplă altceva sinistru.
- Dacă, de fapt, multe sau majoritatea experimentelor se bazează pe realități în care diferența reală între mijloace este mai mare decât diferența minimă de detectare a eșantioanelor, dimensiunea eșantioanelor a fost aleasă pentru o putere de 80%, ne-am aștepta la o proporție de p Valorile fragile sunt ceva mai mici de 26%.
- Luându -le împreună, este rezonabil de spus asta p Valorile în scădere de la 32% la 26% sunt un lucru bun; Dar probabil că 26% este încă un pic prea mare și nu ar trebui să fie apreciat a fi un punct de referință foarte artificial; Și că nu putem fi siguri ce conduce declinul.
Iată codul R pentru a rula acele 1,32 milioane de simulări, folosind utilizarea foreach şi doParallel R pachete pentru calcul paralel pentru a accelera puțin lucrurile:
library(pwrss)
library(tidyverse)
library(glue)
library(foreach)
library(doParallel)
#' Function to run a two sample experiment with t test on difference of means
#' @returns a single p value
#' @param d difference in means of the two populations that samples are drawn
#' from. If sd1 and sd2 are both 1, then d is a proportion of that sd and
#' everything is scaleless.
experiment <- function(d, m1 = 0, sd1 = 1, sd2 = 1, n1 = 50, n2 = n1, seed = NULL){
if(!is.null(seed)){
set.seed(seed)
}
x1 <- rnorm(n1, m1, sd1)
x2 <- rnorm(n2, m1 + d, sd2)
t.test(x1, x2)$p.value
}
#--------------varying difference and sample sizes---------------
pd1 <- tibble(planned_diff = seq(from = 0.05, to = 0.60, by = 0.05)) |>
# what sample size do we need to have 80% power, based on that planned
# "minimum difference to detect"?:
mutate(n_for_power = sapply(planned_diff, function(d){
as.numeric(pwrss.t.2means(mu1 = d, power = 0.8, verbose = FALSE)$n(1))
}))
# the actual differences, which can be from zero to much bigger than the minimum
# we planned power to detect:
pd2 <- tibble(actual_diff = seq(from = 0, to = 1.0, by = 0.1))
# Number of simulations we do for each combination of planned power (based on a
# given 'minimum difference to detect') and actual power (based on the real
# difference). when the real difference is zero in particular, there will only
# be 1/20 of reps that come up with a 'significant' difference, so 10000 reps in
# total gives us a sample of 500 signficant tests to get the proportion that are
# fragile from, so still not huge. If I'd bothered I could have changed the
# number of reps to do for each combination based on some number that's really
# needed, but I didn't bother.:
reps_each <- 10000
# combine the planned-for and actual differences in a data frame with a row
# for each repeated sim we are going to do:
data <- expand_grid(pd1, pd2) |>
mutate(link = 1) |>
full_join(tibble(link = 1,
rep = 1:reps_each),
relationship = "many-to-many", by = "link") |>
select(-link) |>
mutate(p = NA)
print(glue("Running {nrow(data)} simulations. This will take a while."))
# set up parallel processing cluster
cluster <- makeCluster(7)
registerDoParallel(cluster)
clusterEvalQ(cluster, {
library(foreach)
})
clusterExport(cluster, c("data", "experiment"))
results <- foreach(i = 1:nrow(data), .combine = rbind) %dopar% {
set.seed(i)
# the row of data for just this simulation:
d <- data(i, )
# perform the simulation and capture the p value:
d$p <- experiment(d = d$actual_diff,
n1 = d$n_for_power,
seed = d$rep)
# return the result as a row of data, which will be rbinded into a single data
# frame of all the parallel processes:
return(d)
}
stopCluster(cluster)
#--------------summarise and present results--------------------------
# Summarise and calculate the proportions:
res <- results |>
group_by(planned_diff, n_for_power, actual_diff) |>
summarise(number_sig = sum(p < 0.05),
prop_fragile = sum(p > 0.01 & p < 0.05) / number_sig)
Iată cum desenez două parcele pentru a rezuma asta. Am complotul de linie afișat mai sus și o foaie de căldură care este prezentată sub cod. În general, cred că complotul de linie este mai ușor și mai clar de citit.
# Line chart plot:
res |>
mutate(pd_lab = glue("80% power planned for diff of {planned_diff}")) |>
ggplot(aes(x = actual_diff, y = prop_fragile)) +
facet_wrap(~pd_lab) +
geom_vline(aes(xintercept = planned_diff), colour = "steelblue") +
geom_hline(yintercept = 0.26, colour = "orange") +
geom_point() +
geom_line() +
scale_y_continuous(label = percent) +
labs(y = "Proportion of significant p values that are between 0.01 and 0.05",
x = "Actual difference (in standard deviations)",
subtitle = "Vertical blue line shows where the actual difference equals the minimum difference to detect that the 80% power calculation was based upon.
Horizontal orange line shows the observed average proportion of 'fragile' p values in the recent psychology literature.",
title = "Fragility of p values in relation to actual and planned differences in a two sample t test.")
# Heatmap:
res |>
ggplot(aes(x = actual_diff, y = as.ordered(planned_diff), fill = prop_fragile)) +
geom_tile() +
geom_tile(data = filter(res, prop_fragile > 0.25 & prop_fragile < 0.31),
fill = "white", alpha = 0.1, colour = "white", linewidth = 2) +
scale_fill_viridis_c(label = percent, direction = -1) +
theme(panel.grid.minor = element_blank()) +
labs(y= "Smallest detectable difference for 80% power",
x = "Actual difference (in standard deviations)",
fill = "Proportion of significant p values that are between 0.01 and 0.05:",
subtitle = "Sample size is based on 80% power for the difference on the vertical axis. White boxes indicate where the proportion of fragile significant p values is between 25% and 31%.",
title = "Fragility of p values in relation to actual and planned differences in a two sample t test.")
Iată foaia de căldură pe care o obținem de la asta. Este mai frumos, dar cred că nu este la fel de clar ca cel mai simplu, fațetat.
Asta e totul deocamdată. Nu cred că există implicații mari în acest sens. Doar o mai bună înțelegere a proporției p Valori pe care am putea să le așteptăm să fie în acest interval fragil și ce impact asupra acesteia.
Plănuiesc să mă uit la câteva date din viața reală, pe un subiect complet diferit, în următoarea mea postare.
