Eu queria saber exatamente por que a coleta de dados até que um resultado significativo (por exemplo, ) seja obtido (por exemplo, p-hacking) aumenta a taxa de erro do tipo I?
Eu também apreciaria muito uma R
demonstração desse fenômeno.
Eu queria saber exatamente por que a coleta de dados até que um resultado significativo (por exemplo, ) seja obtido (por exemplo, p-hacking) aumenta a taxa de erro do tipo I?
Eu também apreciaria muito uma R
demonstração desse fenômeno.
Respostas:
O problema é que você está se dando muitas chances de passar no teste. É apenas uma versão chique deste diálogo:
Vou virar você para ver quem paga o jantar.
OK, eu chamo de chefes.
Ratos, você ganhou. Melhores dois dos três?
Para entender isso melhor, considere um modelo simplificado - mas realista - desse procedimento seqüencial . Suponha que você comece com um "teste" de um certo número de observações, mas esteja disposto a continuar experimentando por mais tempo para obter um valor-p menor que . A hipótese nula é que cada observação vem (independentemente) de uma distribuição normal padrão. A alternativa é que o venha independentemente de uma distribuição normal de variação de unidade com uma média diferente de zero. A estatística do teste será a média de todas as observações, , divididas pelo erro padrão, . Para um teste bilateral, os valores críticos são osX i X i n ˉ X 1 / √ 0,0250,975Zα=±1,96 e pontos percentuais da distribuição normal padrão, aproximadamente.
Este é um bom teste - para um único experimento com um tamanho fixo de amostra . Ele tem exatamente uma chance de de rejeitar a hipótese nula, não importa qual seja .5 % n
Vamos converter algebricamente isso para um teste equivalente com base na soma de todos os valores,S N = X 1 + X 2 + ⋯ + X n = n ˉ X .
Assim, os dados são "significativos" quando
isso é,
Se formos espertos, reduziremos nossas perdas e desistiremos quando crescer muito e os dados ainda não tiverem entrado na região crítica.
Isso descreve um passeio aleatório . A fórmula equivale a erguer uma "cerca" ou barreira parabólica curva ao redor do gráfico da caminhada aleatória : o resultado é "significativo" se algum ponto da caminhada aleatória atingir a cerca.
É uma propriedade de passeios aleatórios que, se esperarmos o suficiente, é muito provável que em algum momento o resultado pareça significativo.
Aqui estão 20 simulações independentes até um limite de amostras. Todos eles começam a testar em amostras, momento em que verificamos se cada ponto está fora das barreiras que foram traçadas de acordo com a fórmula . A partir do momento em que o teste estatístico é o primeiro "significativo", os dados simulados são coloridos em vermelho.
Você pode ver o que está acontecendo: a caminhada aleatória sobe e desce cada vez mais à medida que aumenta. As barreiras estão se espalhando na mesma proporção - mas nem sempre são rápidas o suficiente para evitar a caminhada aleatória.
Em 20% dessas simulações, foi encontrada uma diferença "significativa" - geralmente bem cedo - embora em todas elas a hipótese nula esteja absolutamente correta! A execução de mais simulações desse tipo indica que o tamanho real do teste está próximo de em vez do valor pretendido de : ou seja, sua disposição de continuar procurando "significância" até um tamanho de amostra de oferece chance de rejeitar o nulo, mesmo quando o nulo for verdadeiro.
Observe que nos quatro casos "significativos", à medida que os testes continuavam, os dados pararam de parecer significativos em alguns momentos. Na vida real, um pesquisador que para mais cedo perde a chance de observar essas "reversões". Essa seletividade através da parada opcional influencia os resultados.
Nos testes seqüenciais de honestidade e bondade, as barreiras são linhas. Eles se espalham mais rápido do que as barreiras curvas mostradas aqui.
library(data.table)
library(ggplot2)
alpha <- 0.05 # Test size
n.sim <- 20 # Number of simulated experiments
n.buffer <- 5e3 # Maximum experiment length
i.min <- 30 # Initial number of observations
#
# Generate data.
#
set.seed(17)
X <- data.table(
n = rep(0:n.buffer, n.sim),
Iteration = rep(1:n.sim, each=n.buffer+1),
X = rnorm((1+n.buffer)*n.sim)
)
#
# Perform the testing.
#
Z.alpha <- -qnorm(alpha/2)
X[, Z := Z.alpha * sqrt(n)]
X[, S := c(0, cumsum(X))[-(n.buffer+1)], by=Iteration]
X[, Trigger := abs(S) >= Z & n >= i.min]
X[, Significant := cumsum(Trigger) > 0, by=Iteration]
#
# Plot the results.
#
ggplot(X, aes(n, S, group=Iteration)) +
geom_path(aes(n,Z)) + geom_path(aes(n,-Z)) +
geom_point(aes(color=!Significant), size=1/2) +
facet_wrap(~ Iteration)
As pessoas que são novas no teste de hipóteses tendem a pensar que, uma vez que o valor de p fique abaixo de 0,05, a adição de mais participantes diminuirá ainda mais o valor de p. Mas isso não é verdade. Sob a hipótese nula, o valor de p é distribuído uniformemente entre 0 e 1 e pode saltar bastante nesse intervalo.
Simulei alguns dados em R (minhas habilidades em R são bastante básicas). Nesta simulação, coleciono 5 pontos de dados - cada um com uma associação de grupo selecionada aleatoriamente (0 ou 1) e cada um com uma medida de resultado selecionada aleatoriamente ~ N (0,1). A partir do participante 6, conduzo um teste t a cada iteração.
for (i in 6:150) {
df[i,1] = round(runif(1))
df[i,2] = rnorm(1)
p = t.test(df[ , 2] ~ df[ , 1], data = df)$p.value
df[i,3] = p
}
Os valores de p estão nesta figura. Observe que encontro resultados significativos quando o tamanho da amostra está entre 70 e 75. Se eu parar por aí, acabarei acreditando que minhas descobertas são significativas, porque perderei o fato de que meus valores de p retornaram com uma amostra maior (isso realmente aconteceu comigo uma vez com dados reais). Como sei que ambas as populações têm uma média de 0, isso deve ser um falso positivo. Esse é o problema da adição de dados até p <0,05. Se você adicionar testes suficientes, p acabará por ultrapassar o limite 0,05 e você poderá encontrar um efeito significativo em qualquer conjunto de dados.
R
código não é executado.
df
primeiro (de preferência no tamanho final). Como o código começa a ser escrito na linha 6, a implicação (que se encaixa no texto da resposta) é que o df já existe com 5 linhas já preenchidas. Talvez algo parecido com isto tenha sido planejado: n150<-vector("numeric",150); df<-data.frame(gp=n150,val=n150,pval=n150); init<-1:5; df[init,1]<-c(0,1,0,1,0); df[init,2]<-rnorm(5)
(execute o código acima) e talvez: plot(df$pv[6:150])
Essa resposta diz respeito apenas à probabilidade de obter um resultado "significativo" e à distribuição do tempo para esse evento no modelo do @ whuber.
Como no modelo de @whuber, denota o valor da estatística de teste após a coleta das observações e assume que as observações são seu padrão normal . Então modo que se comporte como um movimento browniano padrão de tempo contínuo, se ignorarmos por enquanto o fato de termos um processo de tempo discreto (gráfico à esquerda abaixo).
Seja o primeiro tempo de passagem de através das barreiras dependentes do tempo (o número de observações necessárias antes que o teste se torne significativo).
Considere o processo transformado obtido escalando por seu desvio padrão no tempo deixando a nova escala de tempo tal que Segue-se de (1) e (2) que é normalmente distribuído com e
Para o modelo transformado, as barreiras tornam-se constantes independentes do tempo iguais a . Sabe-se então ( Nobile et. Al. 1985 ; Ricciardi & Sato, 1988 ) que o primeiro tempo de passagem do processo OU através dessas barreiras é distribuído aproximadamente exponencialmente com algum parâmetro (dependendo das barreiras em ) (estimadas em para abaixo). Há também uma massa de pontos extra em tamanho in . "Rejeição" deeventualmente acontece com probabilidade 1. Portanto, (o número de observações que precisam ser coletadas antes de obter um resultado "significativo") segue aproximadamente uma distribuição exponencial de log com o valor esperado Assim, tem uma expectativa finita apenas se (por tempo suficiente) grandes níveis de significância ).
O exposto acima ignora o fato de que para o modelo real é discreto e que o processo real é discreto - e não em tempo contínuo. Portanto, o modelo acima superestima a probabilidade de a barreira ter sido atravessada (e subestima o ) porque o caminho da amostra em tempo contínuo pode atravessar a barreira apenas temporariamente entre dois pontos de tempo discretos adjacentes e . Mas tais eventos devem ter probabilidade insignificante para grande . E T t t + 1 t
A figura a seguir mostra uma estimativa de Kaplan-Meier de na escala log-log, juntamente com a curva de sobrevida para a aproximação exponencial em tempo contínuo (linha vermelha).
Código R:
# Fig 1
par(mfrow=c(1,2),mar=c(4,4,.5,.5))
set.seed(16)
n <- 20
npoints <- n*100 + 1
t <- seq(1,n,len=npoints)
subset <- 1:n*100-99
deltat <- c(1,diff(t))
z <- qnorm(.975)
s <- cumsum(rnorm(npoints,sd=sqrt(deltat)))
plot(t,s,type="l",ylim=c(-1,1)*z*sqrt(n),ylab="S(t)",col="grey")
points(t[subset],s[subset],pch="+")
curve(sqrt(t)*z,xname="t",add=TRUE)
curve(-sqrt(t)*z,xname="t",add=TRUE)
tau <- log(t)
y <- s/sqrt(t)
plot(tau,y,type="l",ylim=c(-2.5,2.5),col="grey",xlab=expression(tau),ylab=expression(Y(tau)))
points(tau[subset],y[subset],pch="+")
abline(h=c(-z,z))
# Fig 2
nmax <- 1e+3
nsim <- 1e+5
alpha <- .05
t <- numeric(nsim)
n <- 1:nmax
for (i in 1:nsim) {
s <- cumsum(rnorm(nmax))
t[i] <- which(abs(s) > qnorm(1-alpha/2)*sqrt(n))[1]
}
delta <- ifelse(is.na(t),0,1)
t[delta==0] <- nmax + 1
library(survival)
par(mfrow=c(1,1),mar=c(4,4,.5,.5))
plot(survfit(Surv(t,delta)~1),log="xy",xlab="t",ylab="P(T>t)",conf.int=FALSE)
curve((1-alpha)*exp(-.125*(log(x))),add=TRUE,col="red",from=1,to=nmax)
É preciso dizer que a discussão acima é para uma visão de mundo freqüentista, cuja multiplicidade vem das chances de você dar dados mais extremas, não das chances de dar um efeito à existência. A causa raiz do problema é que os valores de p e os erros do tipo I usam condicionamento de fluxo de informações de retorno ao passado , o que torna importante "como você chegou aqui" e o que poderia ter acontecido. Por outro lado, o paradigma bayesiano codifica ceticismo sobre um efeito no próprio parâmetro, não nos dados. Isso faz com que cada probabilidade posterior seja interpretada da mesma forma, independentemente de você ter calculado outra probabilidade posterior de um efeito há 5 minutos ou não. Mais detalhes e uma simulação simples podem ser encontrados em http://www.fharrell.com/2017/10/continuous-learning-from-data-no.
Consideramos um pesquisador coletando uma amostra do tamanho , , para testar alguma hipótese . Ele rejeita se uma estatística de teste adequada exceder seu valor crítico de nível . Caso contrário, ele coletará outra amostra de tamanho , e rejeitará se o teste rejeitar a amostra combinada . Se ele ainda não obtiver rejeição, procederá dessa maneira, até vezes no total.x 1 θ = θ 0 t α c n x 2 ( x 1 , x 2 ) K
Este problema parece já ter sido abordado por P. Armitage, CK McPherson e BC Rowe (1969), Jornal da Royal Statistical Society. Série A (132), 2, 235-244: "Testes de significância repetidos em dados acumulativos" .
O ponto de vista bayesiano sobre esta questão, também discutido aqui, é, a propósito, discutido em Berger e Wolpert (1988), "O Princípio da Verossimilhança" , Seção 4.2.
Aqui está uma replicação parcial dos resultados de Armitage et al (código abaixo), que mostra como os níveis de significância aumentam quando , bem como possíveis fatores de correção para restaurar os valores críticos de nível . Observe que a pesquisa na grade demora um pouco para ser executada - a implementação pode ser bastante ineficiente.α
Tamanho da regra de rejeição padrão em função do número de tentativas
Tamanho em função do aumento de valores críticos para diferentes
Valores críticos ajustados para restaurar 5% dos testes em função de
reps <- 50000
K <- c(1:5, seq(10,50,5), seq(60,100,10)) # the number of attempts a researcher gives herself
alpha <- 0.05
cv <- qnorm(1-alpha/2)
grid.scale.cv <- cv*seq(1,1.5,by=.01) # scaled critical values over which we check rejection rates
max.g <- length(grid.scale.cv)
results <- matrix(NA, nrow = length(K), ncol=max.g)
for (kk in 1:length(K)){
g <- 1
dev <- 0
K.act <- K[kk]
while (dev > -0.01 & g <= max.g){
rej <- rep(NA,reps)
for (i in 1:reps){
k <- 1
accept <- 1
x <- rnorm(K.act)
while(k <= K.act & accept==1){
# each of our test statistics for "samples" of size n are N(0,1) under H0, so just scaling their sum by sqrt(k) gives another N(0,1) test statistic
rej[i] <- abs(1/sqrt(k)*sum(x[1:k])) > grid.scale.cv[g]
accept <- accept - rej[i]
k <- k+1
}
}
rej.rate <- mean(rej)
dev <- rej.rate-alpha
results[kk,g] <- rej.rate
g <- g+1
}
}
plot(K,results[,1], type="l")
matplot(grid.scale.cv,t(results), type="l")
abline(h=0.05)
cv.a <- data.frame(K,adjusted.cv=grid.scale.cv[apply(abs(results-alpha),1,which.min)])
plot(K,cv.a$adjusted.cv, type="l")