Me preguntaba exactamente por qué recopilar datos hasta un resultado significativo (p. Ej., se obtiene ) (es decir, piratería informática) aumenta la tasa de error de Tipo I?
También agradecería mucho una R
demostración de este fenómeno.
Me preguntaba exactamente por qué recopilar datos hasta un resultado significativo (p. Ej., se obtiene ) (es decir, piratería informática) aumenta la tasa de error de Tipo I?
También agradecería mucho una R
demostración de este fenómeno.
Respuestas:
El problema es que te estás dando demasiadas oportunidades para pasar la prueba. Es solo una versión elegante de este diálogo:
Te voltearé para ver quién paga la cena.
OK, llamo a los jefes.
Ratas, ganaste. ¿Los dos mejores de tres?
Para comprender esto mejor, considere un modelo simplificado, pero realista, de este procedimiento secuencial . Suponga que comenzará con una "ejecución de prueba" de un cierto número de observaciones, pero está dispuesto a continuar experimentando durante más tiempo para obtener un valor p menor que . La hipótesis nula es que cada observación X i proviene (independientemente) de una distribución Normal estándar. La alternativa es que el X i viene independientemente de una distribución normal de varianza unitaria con una media distinta de cero. El estadístico de prueba será la media de todas las n observaciones, ˉ X , dividido por su error estándar, 1 / √ . Para una prueba de dos lados, los valores críticos son lospuntos porcentuales de0.025y0.975de la distribución Normal estándar,Zα=±1.96aproximadamente.
Esta es una buena prueba, para un solo experimento con un tamaño de muestra fijo . Tiene exactamente un 5 % de posibilidades de rechazar la hipótesis nula, sin importar cuál sea n .
Vamos a convertir algebraicamente esto a un ensayo equivalente en base a la suma de todos los valores, S n = X 1 + X 2 + ⋯ + X n = n ˉ X .
Por lo tanto, los datos son "significativos" cuando
es decir,
Si somos inteligentes, reduciremos nuestras pérdidas y nos rendiremos una vez crezca mucho y los datos aún no hayan ingresado a la región crítica.
Esto describe una caminata aleatoria . La fórmula ( 1 ) equivale a erigir una "valla" o barrera parabólica curva alrededor de la trama de la caminata aleatoria ( n , S n ) : el resultado es "significativo" si lo hay punto de la caminata aleatoria golpea la cerca.
Es una propiedad de las caminatas aleatorias que si esperamos lo suficiente, es muy probable que en algún momento el resultado se vea significativo.
Aquí hay 20 simulaciones independientes hasta un límite de muestras. Todos comienzan a probar en n = 30 muestras, en cuyo punto verificamos si cada punto se encuentra fuera de las barreras que se han dibujado de acuerdo con la fórmula ( 1 ) . Desde el punto en que la prueba estadística es primero "significativa", los datos simulados son de color rojo.
Puedes ver lo que está sucediendo: la caminata aleatoria sube y baja cada vez más a medida que aumenta . Las barreras se están separando aproximadamente a la misma velocidad, pero no siempre lo suficientemente rápido como para evitar la caminata aleatoria.
En el 20% de estas simulaciones, se encontró una diferencia "significativa", generalmente bastante temprano, ¡aunque en cada una de ellas la hipótesis nula es absolutamente correcta! Ejecutar más simulaciones de este tipo indica que el tamaño real de la prueba es cercano al lugar del valor previsto de α = 5 % : es decir, su disposición a seguir buscando "significancia" hasta un tamaño de muestra de 5000 le da un 25 % de posibilidades de rechazar el nulo incluso cuando el nulo es verdadero.
Observe que en los cuatro casos "significativos", a medida que continuaban las pruebas, los datos dejaron de parecer significativos en algunos puntos. En la vida real, un experimentador que se detiene temprano está perdiendo la oportunidad de observar tales "reversiones". Esta selectividad a través de la detención opcional sesga los resultados.
En las pruebas secuenciales de honestidad, las barreras son líneas. Se extienden más rápido que las barreras curvas que se muestran aquí.
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)
Las personas que son nuevas en las pruebas de hipótesis tienden a pensar que una vez que el valor p cae por debajo de 0,05, agregar más participantes solo disminuirá aún más el valor p. Pero esto no es verdad. Bajo la hipótesis nula, el valor de p se distribuye uniformemente entre 0 y 1 y puede rebotar bastante en ese rango.
He simulado algunos datos en R (mis habilidades en R son bastante básicas). En esta simulación, recopilo 5 puntos de datos, cada uno con una pertenencia a un grupo seleccionado al azar (0 o 1) y cada uno con una medida de resultado seleccionada al azar ~ N (0,1). A partir del participante 6, realizo una prueba t en cada iteración.
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
}
Los valores de p están en esta figura. Tenga en cuenta que encuentro resultados significativos cuando el tamaño de la muestra es de alrededor de 70-75. Si me detengo allí, terminaré creyendo que mis hallazgos son significativos porque habré pasado por alto el hecho de que mis valores de p volvieron a subir con una muestra más grande (esto realmente me sucedió una vez con datos reales). Como sé que ambas poblaciones tienen una media de 0, esto debe ser un falso positivo. Este es el problema con la adición de datos hasta p <.05. Si agrega realizar suficientes pruebas, p eventualmente cruzará el umbral de .05 y puede encontrar un efecto significativo en cualquier conjunto de datos.
R
código no se ejecuta en absoluto.
df
primero (preferiblemente en su tamaño final). Dado que el código comienza a escribirse en la fila 6, la implicación (que encaja con el texto de la respuesta) es que df ya existe con 5 filas ya rellenadas. Tal vez algo como esto fue intencionado: 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)
(luego ejecute el código anterior) entonces quizás: plot(df$pv[6:150])
Esta respuesta solo se refiere a la probabilidad de obtener un resultado "significativo" y la distribución del tiempo para este evento bajo el modelo de @ whuber.
Como en el modelo de @whuber, dejemos que denote el valor del estadístico de prueba después de que se hayan recopilado t observaciones y suponga que las observaciones X 1 , X 2 , ...
Considere el proceso transformado obtenido escalando S ( t ) por su desviación estándar en el tiempo t y dejando la nueva escala de tiempo
Lo anterior ignora el hecho de que
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)
Es necesario decir que la discusión anterior es para una visión del mundo frecuentista para la cual la multiplicidad proviene de las posibilidades de que los datos sean más extremos, no de las posibilidades de que exista un efecto para existir. La causa raíz del problema es que los valores p y los errores de tipo I utilizan el condicionamiento del flujo de información hacia atrás en el tiempo hacia atrás, lo que hace que sea importante "cómo llegó aquí" y lo que podría haber sucedido en su lugar. Por otro lado, el paradigma bayesiano codifica el escepticismo sobre un efecto en el parámetro en sí, no en los datos. Eso hace que cada probabilidad posterior se interprete de la misma manera, ya sea que haya calculado otra probabilidad posterior de un efecto hace 5 minutos o no. Puede encontrar más detalles y una simulación simple en http://www.fharrell.com/2017/10/continuous-learning-from-data-no.
Este problema ya parece haber sido abordado por P. Armitage, CK McPherson y BC Rowe (1969), Journal of the Royal Statistical Society. Serie A (132), 2, 235-244: "Pruebas de significancia repetidas en la acumulación de datos" .
El punto de vista bayesiano sobre este tema, también discutido aquí, es, por cierto, discutido en Berger y Wolpert (1988), "El Principio de Probabilidad" , Sección 4.2.
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")