Se você repetir 20 vezes um teste que dá uma resposta errada com probabilidade 1/20, você terá em média 1 resposta errada! (isso é apenas uma aproximação - ver abaixo)
O programa abaixo roda 20 vezes o t-test para duas amostras de 30 dados vindo da mesma gaussiana (media = 0 desvio padrão = 1)
set.seed(1234)
for (i in 1:20){
tt=t.test(rnorm(30),rnorm(30))
print(paste(i,":",round(tt$p.value,3)))
}
Veja a entrada 12! Veja também que não há nada errado em usar o teste t nestes casos.
Formalmente: a probabilidade que a repetição 20 vezes de um teste que erra 5% não de errado nenhuma vez é 0.95^{20} = 0.36. Ou seja a probabilidade que pelo menos uma vez das 20 o teste de errado é 1-0.36 = 0.64
set.seed(1234)
a=matrix(rnorm(300),ncol=20)
b=matrix(rnorm(400),ncol=20)
for (i in 1:20){
teste=t.test(a[,i],b[,i])
print(paste(i,":", round(teste$p.value,3)))
}
set.seed(4321)
a=rnorm(30)
b=rnorm(30)
t.test(a,b)$p.value
t.test(a[1:10],b[1:15])$p.value
t.test(a[10:30],b[15:30])$p.value
t.test(a[seq(1,30,2)],b[seq(1,30,2)])$p.value
Vários experimentos com diferentes conjuntos de dados (da mesma “fonte”) - isso é um problema se voce gera dados para o seu experimento
por exemplo: “Vamos trocar o nome dessa variável do programa e gerar novos dados” - repita isso 20 vezes e provavelmente uma das rodadas vai dar estatisticamente significativa
testes A/B para interface
voce planejou fazer 1000 experimentos para cada lado (há toda uma teoria para calcular o tamanho de um experimento n dado a diferença esperada entre as médias e uma outra medida chamada de (type II error ou power - que normalmente usa-se 80%) Uma pagina sobre como calcular tamanho de teste A/B
-voce mede as diferença antes do final - “da uma olhada nos dados”
set.seed(5555)
a=rnorm(1000)
b=rnorm(1000)
t.test(a,b)$p.value
for (i in seq(50,1000,by=20)) print(cat("i:",i,"pval=",t.test(a[1:i],b[1:i])$p.value))
veja a linha i: 350
- deu um p-valor <0.05 e voce para o experimento.
existe uma teoria de parar antes testes A/B (caso de vacina covid!!) discutida também na pagina acima.
Usar um teste errado (mais forte) para os seus dados normalmente da resultados nas duas direções: de vez em quando voce obtem um p-valor mais baixo que devia e publica algo que não é “verdade”
Mas de vez em quando voce obtem um p-valor mais alto que devia, e deixa de publicar algo que " é verdade" .
set.seed(1234)
a = runif(15)
b = rnorm(7,0.5)
t.test(a,b)
wilcox.test(a,b)
p-valor <0.05 não é um mandamento divino - resultados úteis não foram publicados pois p-valor=0.06
p-valor é uma função da “tamanho da diferença” entre os dois conjuntos e do número de dados:
p-valor muito baixo não significa que os dois conjuntos são muito diferentes. Para n → ∞, p-valor vai para 0 ou 1.
p-valor alto não significa que os conjuntos são iguais, pode significar que você tem poucos dados. Em alguns casos voce quer mostrar que seu programa é tão rápido quanto um programa pago, mas o seu é livre. Ou que seu programa acerta tanto quanto um programa conhecido, mas o seu é mais rápido. Não da para usar p-valor para mostrar que 2 conjuntos são iguais (nesse sentido).
Variações do problema de múltiplos testes geram falsos positivos: afirmações que um fenômeno existe quando ele de fato não existe.
De vez em quando isso é chamado de p-hacking mas o problema existe mesmo quando o pesquisador não tem más intenções
É por isso que para coisas importantes como saúde você deve duvidar que todo resultado que saiu em um só artigo - pode ser um falso positivo.
Blog de um pesquisador que gerou um artigo “fake” que chocolate ajuda a emagrecer
Blog sobre problemas da Ciência