Mi chiedevo esattamente perché la raccolta di dati fino a quando non si ottiene un risultato significativo (ad es. ) (ad es. P-hacking) aumenta il tasso di errore di tipo I?
Gradirei anche una R
dimostrazione di questo fenomeno.
Mi chiedevo esattamente perché la raccolta di dati fino a quando non si ottiene un risultato significativo (ad es. ) (ad es. P-hacking) aumenta il tasso di errore di tipo I?
Gradirei anche una R
dimostrazione di questo fenomeno.
Risposte:
Il problema è che ti stai dando troppe possibilità di superare il test. È solo una versione elaborata di questa finestra di dialogo:
Ti girerò per vedere chi paga per cena.
OK, chiamo teste.
Ratti, hai vinto. I migliori due su tre?
Per capirlo meglio, considera un modello semplificato ma realistico di questa procedura sequenziale . Supponiamo che inizi con una "prova" di un certo numero di osservazioni, ma sei disposto a continuare a sperimentare più a lungo per ottenere un valore p inferiore a . L'ipotesi nulla è che ogni osservazione X i provenga (indipendentemente) da una distribuzione normale standard. L'alternativa è che l' X i provengono indipendentemente da un'unità varianza distribuzione normale con una media diversa da zero. La statistica del test sarà la media di tutte le n osservazioni, ˉ X , divise per il loro errore standard, 1 / √ . Per un test su due lati, i valori critici sono0,025e0,975punti percentuali della distribuzione normale standard,Zα=±1,96circa.
Questo è un buon test - per un singolo esperimento con una dimensione del campione fissa . Ha esattamente un 5 % possibilità di rifiutare l'ipotesi nulla, non importa quale n potrebbe essere.
Facciamo algebricamente convertire questo ad una prova equivalente sulla base della somma di tutti gli valori, S n = X 1 + X 2 + ⋯ + X n = n ˉ X .
Pertanto, i dati sono "significativi" quando
questo è,
Se siamo intelligenti, ridurremo le nostre perdite e ci arrenderemo quando diventerà molto grande e i dati non saranno ancora entrati nell'area critica.
Questo descrive una camminata casuale . La formula ( 1 ) equivale a erigere una "recinzione" parabolica curva o barriera attorno al diagramma della camminata casuale ( n , S n ) : il risultato è "significativo" se un punto qualsiasi della camminata casuale colpisce la recinzione.
È una proprietà delle passeggiate casuali che se aspettiamo abbastanza a lungo, è molto probabile che ad un certo punto il risultato sembrerà significativo.
Ecco 20 simulazioni indipendenti fino a un limite di campioni. Iniziano tutti i test su n = 30 campioni, a quel punto controlliamo se ciascun punto si trova al di fuori delle barriere che sono state disegnate secondo la formula ( 1 ) . Dal momento in cui il test statistico è per primo "significativo", i dati simulati sono colorati in rosso.
Si noti che in tutti e quattro i casi "significativi", poiché i test sono continuati, i dati hanno smesso di apparire significativi in alcuni punti. Nella vita reale, uno sperimentatore che si ferma presto perde la possibilità di osservare tali "inversioni". Questa selettività attraverso l'interruzione facoltativa pregiudica i risultati.
Nei test sequenziali onestà-bontà, le barriere sono linee. Si diffondono più velocemente delle barriere curve mostrate qui.
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)
Le persone che non conoscono i test di ipotesi tendono a pensare che una volta che il valore di ap scende al di sotto di 0,05, l'aggiunta di più partecipanti ridurrà ulteriormente il valore di p. Ma questo non è vero. Sotto l'ipotesi nulla, il valore di ap è distribuito uniformemente tra 0 e 1 e può rimbalzare un bel po 'in quell'intervallo.
Ho simulato alcuni dati in R (le mie abilità in R sono piuttosto basilari). In questa simulazione, raccolgo 5 punti dati, ciascuno con un'appartenenza casuale selezionata al gruppo (0 o 1) e ciascuno con una misura di esito selezionata casualmente ~ N (0,1). A partire dal partecipante 6, eseguo un test t ad ogni iterazione.
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
}
I valori di p sono in questa figura. Si noti che trovo risultati significativi quando la dimensione del campione è di circa 70-75. Se mi fermo qui, finirò per credere che le mie scoperte sono significative perché mi sarei perso il fatto che i miei valori di p siano balzati indietro con un campione più ampio (questo in realtà mi è successo una volta con dati reali). Poiché so che entrambe le popolazioni hanno una media di 0, questo deve essere un falso positivo. Questo è il problema con l'aggiunta di dati fino a p <.05. Se aggiungi un numero sufficiente di test, p alla fine supererà la soglia .05 e puoi trovare un effetto significativo in qualsiasi set di dati.
R
codice non viene eseguito affatto.
df
prima (preferibilmente alla sua dimensione finale). Poiché il codice inizia a scrivere alla riga 6, l'implicazione (che si adatta al testo della risposta) è che df esiste già con 5 righe già compilate. Forse si intendeva qualcosa del genere: 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)
(quindi eseguire il codice sopra) quindi forse: plot(df$pv[6:150])
Questa risposta riguarda solo la probabilità di ottenere in definitiva un risultato "significativo" e la distribuzione del tempo a questo evento secondo il modello di @ whuber.
Codice 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)
Va detto che la discussione di cui sopra è per una visione del mondo frequentista per la quale la molteplicità viene dalle possibilità che si danno i dati di essere più estremi, non dalle possibilità che tu dia un effetto per esistere. La causa principale del problema è che i valori p e gli errori di tipo I utilizzano il condizionamento del flusso di informazioni all'indietro, il che rende importante "come sei arrivato qui" e cosa invece potrebbe essere successo. D'altra parte, il paradigma bayesiano codifica lo scetticismo su un effetto sul parametro stesso, non sui dati. Ciò rende ogni probabilità posteriore di essere interpretata allo stesso modo, indipendentemente dal fatto che tu abbia calcolato un'altra probabilità posteriore di un effetto 5 minuti fa o meno. Maggiori dettagli e una semplice simulazione sono disponibili all'indirizzo http://www.fharrell.com/2017/10/continuous-learning-from-data-no.
Questo problema sembra essere già stato affrontato da P. Armitage, CK McPherson e BC Rowe (1969), Journal of the Royal Statistical Society. Serie A (132), 2, 235-244: "Test ripetuti di significatività sui dati accumulati" .
Il punto di vista bayesiano su questo tema, anche discusso qui, è, tra l'altro, discusso in Berger e Wolpert (1988), "The Likelihood Principle" , Sezione 4.2.
Dimensione in funzione dell'aumento dei valori critici per diversi
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")