Assume you conduct 100 significance tests in a single study (maybe something like genome-wide association study). In order to address the issue of multiple testing and to keep the family-wise error rate at 5%, the p-values are adjusted, e.g., using Bonferroni or FDR (Benjamini-Hochberg). Are significance tests that are still significant after adjustment, over-estimating the true effect? A quick simulation in R seems to suggest "yes" - at least under some conditions. In my simulation, small effects showed this exaggeration, but large effects do not. The reason behind this is that the large effec always showed a significant result for the sample size I have chosen, so conditioning on being significant did not change anything.
Is there a more formal explanation of this, and maybe some more formal literature on this issue? I am aware of Gelman's Type M error (error of magnitude), but am curious what else is out there.
effest <- function() {
n <- 1000
#random treatment
tr <- rbinom(n,1,.5)
#two true nulls
x1 <- rnorm(n,0,1)
x2 <- rnorm(n,0,1)
#two false nulls, variances of errors are adjusted so that all x's have total variance of 1
#x3 has effect of .2
#x4 has effect of .5
x3 <- .2*tr + rnorm(n,0,.98)
x4 <- .5*tr + rnorm(n,0,.865)
t1 <- t.test(x1~tr)
t2 <- t.test(x2~tr)
t3 <- t.test(x3~tr)
t4 <- t.test(x4~tr)
ps <- c(t1$p.value,t2$p.value,t3$p.value,t4$p.value,
as.numeric(t1$estimate),as.numeric(t2$estimate),as.numeric(t3$estimate),as.numeric(t4$estimate))
return(ps)
}
library(plyr)
res <- data.frame(raply(5000,effest(),.progress = "text"))
names(res) <- c("p1","p2","p3","p4","m10","m11","m20","m21","m30","m31","m40","m41")
res$md1 <- res$m11-res$m10
res$md2 <- res$m21-res$m20
res$md3 <- res$m31-res$m30
res$md4 <- res$m41-res$m40
par(mfrow=c(2,2))
#pvalues of true null
hist(res$p1)
hist(res$p2)
#pvalues of false nulls
hist(res$p3)
hist(res$p4)
#treatment effects of true nulls, across all reps
hist(res$md1)
abline(v=mean(res$md1),col="red")
hist(res$md2)
abline(v=mean(res$md2),col="red")
#treatment effects of false nulls, across all reps
hist(res$md3)
abline(v=mean(res$md3),col="red")
hist(res$md4)
abline(v=mean(res$md4),col="red")
#treatment effects of true nulls, across sig reps
hist(res$md1[res$p1 <.05])
abline(v=mean(res$md1[res$p1 <.05]),col="red")
hist(res$md2[res$p2 <.05])
abline(v=mean(res$md2[res$p2 <.05]),col="red")
#treatment effects of false nulls, across sig reps
hist(res$md3[res$p3 <.05])
abline(v=mean(res$md3[res$p3 <.05]),col="red")
hist(res$md4[res$p4 <.05])
abline(v=mean(res$md4[res$p4 <.05]),col="red")
#treatment effects of true nulls, across sig reps using stringent p < .001
hist(res$md1[res$p1 <.001])
abline(v=mean(res$md1[res$p1 <.001]),col="red")
hist(res$md2[res$p2 <.001])
abline(v=mean(res$md2[res$p2 <.001]),col="red")
#treatment effects of false nulls, across sig reps using stringent p < .001
hist(res$md3[res$p3 <.001])
abline(v=mean(res$md3[res$p3 <.001]),col="red")
hist(res$md4[res$p4 <.001])
abline(v=mean(res$md4[res$p4 <.001]),col="red")