Мне было интересно, почему именно сбор данных, пока не будет получен значительный результат (например, ) (т. Е. P-хакерство), увеличивает частоту ошибок типа I?
Я также был бы очень признателен за R
демонстрацию этого явления.
Мне было интересно, почему именно сбор данных, пока не будет получен значительный результат (например, ) (т. Е. P-хакерство), увеличивает частоту ошибок типа I?
Я также был бы очень признателен за R
демонстрацию этого явления.
Ответы:
Проблема в том, что вы даете себе слишком много шансов пройти тест. Это просто модная версия этого диалога:
Я переверну тебя, чтобы увидеть, кто платит за ужин.
Хорошо, я называю головы.
Крысы, ты победил. Лучшие два из трех?
Чтобы лучше это понять, рассмотрим упрощенную, но реалистичную модель этой последовательной процедуры . Предположим, вы начнете с «пробного запуска» определенного количества наблюдений, но готовы продолжить эксперименты дольше, чтобы получить значение р менее . Нулевая гипотеза состоит в том, что каждое наблюдение происходит (независимо) от стандартного нормального распределения. Альтернатива состоит в том, что приходят независимо от нормального распределения единичной дисперсии с ненулевым средним. Статистика теста будет представлять собой среднее значение всех наблюдений, , деленное на их стандартную ошибку, . Для двустороннего теста критическими значениями являютсяX i X i n ˉ X 1 / √ 0,0250,975Zα=±1,96 и процентных пункта от стандартного нормального распределения, приблизительно.
Это хороший тест - для одного эксперимента с фиксированным размером выборки . У него есть ровно вероятности отклонить нулевую гипотезу, независимо от того, каким может быть .5 % n
Давайте алгебраически преобразуем это в эквивалентный тест, основанный на сумме всех значений,С п = Х 1 + Х 2 + ⋯ + Х п = п ˉ Х .
Таким образом, данные являются "значительными", когда
это,
Если мы умны, мы сократим наши потери и сдадимся, как только станет очень большим, а данные все еще не поступят в критическую область.
Это описывает случайную прогулку . Формула сводится к возведению изогнутого параболического «забора» или барьера вокруг графика случайного блуждания : результат является «значительным», если любая точка случайного блуждания попадает в забор.
Это свойство случайных прогулок, поэтому , если мы будем ждать достаточно долго, очень вероятно, что в какой-то момент результат будет выглядеть значительным.
Вот 20 независимых симуляций с пределом выборок. Все они начинают тестирование при выборках, после чего мы проверяем, находится ли каждая точка вне барьеров, которые были нарисованы в соответствии с формулой . Начиная с того момента, когда статистический тест является первым «значимым», моделируемые данные окрашиваются в красный цвет.
Вы можете видеть, что происходит: случайное блуждание все больше и больше поднимается и опускается с ростом . Барьеры разносятся примерно с одинаковой скоростью, но не всегда достаточно быстро, чтобы избежать случайного блуждания.
В 20% этих симуляций была обнаружена «значительная» разница - обычно довольно рано - даже при том, что в каждой из них нулевая гипотеза абсолютно верна! Выполнение большего количества симуляций этого типа указывает на то, что истинный размер теста близок к а не к предполагаемому значению : то есть ваша готовность продолжать искать «значимость» до размера выборки дает вам шанс отклонить ноль, даже если ноль имеет значение true.
Обратите внимание, что во всех четырех «значимых» случаях по мере продолжения тестирования данные перестали выглядеть значимыми в некоторых точках. В реальной жизни экспериментатор, который останавливается рано, теряет возможность наблюдать такие «реверсии». Эта избирательность путем необязательной остановки смещает результаты.
В последовательных тестах честности и добродетели барьеры - это линии. Они распространяются быстрее, чем изогнутые барьеры, показанные здесь.
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)
Люди, которые плохо знакомы с проверкой гипотез, склонны думать, что, как только значение ap опустится ниже 0,05, добавление большего количества участников приведет только к дальнейшему снижению значения p. Но это не правда. Согласно нулевой гипотезе, значение ap равномерно распределяется между 0 и 1 и может колебаться в этом диапазоне совсем немного.
Я смоделировал некоторые данные в R (мои навыки R довольно просты). В этой симуляции я собираю 5 точек данных - каждая со случайно выбранным членством в группе (0 или 1) и каждая со случайно выбранной конечной мерой ~ N (0,1). Начиная с участника 6, я провожу t-тест на каждой итерации.
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
}
Значения p приведены на этом рисунке. Обратите внимание, что я нахожу значительные результаты, когда размер выборки составляет около 70-75. Если я остановлюсь там, я в конечном итоге буду полагать, что мои выводы важны, потому что я упустил тот факт, что мои значения р подскочили назад с большей выборкой (это на самом деле произошло со мной однажды с реальными данными). Поскольку я знаю, что обе популяции имеют среднее значение 0, это должно быть ложным положительным результатом. Это проблема с добавлением данных до p <.05. Если вы добавите достаточное количество тестов, p в конечном итоге переступит порог 0,05, и вы сможете обнаружить значительный эффект для любого набора данных.
R
код не работает вообще.
df
первую очередь (желательно в окончательном размере). Поскольку код начинает писать в строке 6, подразумевается (что соответствует тексту ответа), что df уже существует с 5 уже заполненными строками. Может быть, что-то вроде этого было задумано: 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)
(затем запустите код выше), тогда, возможно: plot(df$pv[6:150])
Этот ответ касается только вероятности окончательного получения «значимого» результата и распределения времени до этого события по модели @ whuber.
Как и в модели @whuber, пусть обозначает значение статистики теста после того, как наблюдений было собрано, и предположим, что наблюдения являются стандартными нормальными , Тогда , что ведет себя как стандартное броуновское движение с непрерывным временем, если мы на данный момент игнорируем тот факт, что у нас есть процесс с дискретным временем (левый график ниже).
Обозначим через первое время прохождения через зависящие от времени барьеры (количество наблюдений, необходимое до того, как тест станет значительным).
Рассмотрим преобразованный процесс полученный путем масштабирования на его стандартное отклонение в момент времени и позволяя новому масштабу времени , чтобы Из (1) и (2) следует, что обычно распределяется с и
Для преобразованной модели барьеры становятся независимыми от времени константами, равными . Тогда известно ( Nobile et. Al. 1985 ; Ricciardi & Sato, 1988 ), что первое время прохождения OU-процесса через эти барьеры приблизительно экспоненциально распределено с некоторым параметром (в зависимости от барьеров в ) (оценивается как для ниже). Существует также дополнительная точечная масса размера в . «Отказ» отτ = 0 H 0 T = e T E T ≈ 1 + ( 1 - α ) ∫ ∞ 0 e τ λ e - λ τ d τ . T λ > 1 αв конечном итоге происходит с вероятностью 1. Следовательно, (число наблюдений, которое необходимо собрать, прежде чем получить «значительный» результат), приблизительно соответствует логарифмическому экспоненциальному распределению с ожидаемым значением Таким образом, имеет конечное ожидание, только если (для достаточно большие уровни значимости ).
Вышесказанное игнорирует тот факт, что для реальной модели является дискретным и что реальный процесс является дискретным, а не непрерывным временем. Следовательно, вышеупомянутая модель переоценивает вероятность того, что барьер был пересечен (и недооценивает ), потому что путь выборки с непрерывным временем может пересекать барьер только временно между двумя соседними дискретными моментами времени и . Но такие события должны иметь незначительную вероятность для больших . Е Т т т + 1 т
На следующем рисунке показана оценка Каплана-Мейера в логарифмическом масштабе вместе с кривой выживания для экспоненциального приближения с непрерывным временем (красная линия).
Код 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)
Нужно сказать, что приведенное выше обсуждение относится к частому мировоззрению, для которого множественность исходит из шансов, которые вы предоставляете, чтобы данные были более экстремальными, а не из шансов, которые вы даете эффекту на существование. Коренная причина проблемы заключается в том, что в p-значениях и ошибках типа I используется обратный поток информации об обратном времени, что делает важным «как вы сюда попали» и что могло произойти вместо этого. С другой стороны, байесовская парадигма кодирует скептицизм в отношении влияния на сам параметр, а не на данные. Это позволяет интерпретировать каждую последующую вероятность независимо от того, вычислили ли вы другую последнюю вероятность эффекта 5 минут назад или нет. Более подробную информацию и простую симуляцию можно найти по адресу http://www.fharrell.com/2017/10/continuous-learning-from-data-no.
Мы считаем, что исследователь собирает выборку размером , , чтобы проверить некоторую гипотезу . Он отклоняет, если подходящая тестовая статистика превышает ее критическое значение уровня . Если это не так, он собирает другую выборку размером , и отклоняет ее, если тест отклоняет для объединенной выборки . Если он по-прежнему не получает отказа, он поступает таким образом, всего до раз.x 1 θ = θ 0 t α c n x 2 ( x 1 , x 2 ) K
Эта проблема, по-видимому, уже была рассмотрена П. Армитиджем, К. К. Макферсоном и BC Роу (1969), Журнал Королевского статистического общества. Серия A (132), 2, 235-244: «Повторные проверки значимости накапливающихся данных» .
Байесовская точка зрения по этому вопросу, также обсуждаемая здесь, кстати, обсуждается в Berger and Wolpert (1988), «Принцип правдоподобия» , раздел 4.2.
Вот частичная репликация результатов Armitage et al (код ниже), которая показывает, как повышаются уровни значимости при , а также возможные поправочные коэффициенты для восстановления критических значений уровня- . Обратите внимание, что поиск по сетке занимает некоторое время - реализация может быть довольно неэффективной.α
Размер стандартного правила отклонения как функция количества попыток
Размер как функция увеличения критических значений для разных
Скорректированные критические значения для восстановления 5% тестов в зависимости от
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")