Tôi đã tự hỏi chính xác tại sao thu thập dữ liệu cho đến khi có được một kết quả quan trọng (ví dụ: ) (ví dụ, hack p) làm tăng tỷ lệ lỗi Loại I?
Tôi cũng sẽ đánh giá cao một R
cuộc biểu tình của hiện tượng này.
Tôi đã tự hỏi chính xác tại sao thu thập dữ liệu cho đến khi có được một kết quả quan trọng (ví dụ: ) (ví dụ, hack p) làm tăng tỷ lệ lỗi Loại I?
Tôi cũng sẽ đánh giá cao một R
cuộc biểu tình của hiện tượng này.
Câu trả lời:
Vấn đề là bạn đang cho bản thân quá nhiều cơ hội để vượt qua bài kiểm tra. Đây chỉ là một phiên bản ưa thích của hộp thoại này:
Tôi sẽ lật bạn để xem ai trả tiền cho bữa tối.
OK, tôi gọi người đứng đầu.
Chuột, bạn đã thắng. Tốt nhất hai trong số ba?
Để hiểu rõ hơn về điều này, hãy xem xét một mô hình đơn giản - nhưng thực tế - của quy trình tuần tự này . Giả sử bạn sẽ bắt đầu với "chạy thử" một số lượng quan sát nhất định, nhưng sẵn sàng tiếp tục thử nghiệm lâu hơn để có giá trị p nhỏ hơn . Giả thuyết là mỗi quan sát đến (độc lập) từ một phân phối chuẩn. Thay thế là độc lập với phân phối bình thường phương sai đơn vị với giá trị trung bình khác. Thống kê kiểm tra sẽ là giá trị trung bình của tất cả các quan sát , , chia cho lỗi tiêu chuẩn của chúng, . Đối với thử nghiệm hai mặt, các giá trị tới hạn làX i X i n ˉ X 1 / √ 0,0250,975Zα=±1,96 và điểm phần trăm của phân phối chuẩn, xấp xỉ.
Đây là một thử nghiệm tốt - cho một thử nghiệm duy nhất với cỡ mẫu cố định . Nó có chính xác cơ hội bác bỏ giả thuyết khống, bất kể có thể là gì.5 % n
Chúng ta hãy chuyển đổi đại số này thành một thử nghiệm tương đương dựa trên tổng của tất cả giá trị,S n = X 1 + X 2 + ⋯ + X n = n ˉ X .
Do đó, dữ liệu là "đáng kể" khi
đó là,
Nếu chúng ta thông minh, chúng ta sẽ cắt lỗ và từ bỏ một khi phát triển rất lớn và dữ liệu vẫn chưa vào khu vực quan trọng.
Điều này mô tả một đi bộ ngẫu nhiên . Công thức tương đương với việc dựng một "hàng rào" hoặc hàng rào cong, xung quanh âm mưu của bước đi ngẫu nhiên : kết quả là "đáng kể" nếu bất kỳ điểm nào của bước đi ngẫu nhiên chạm vào hàng rào. ( 1 ) ( n , S n )
Đó là một đặc tính của các cuộc đi bộ ngẫu nhiên mà nếu chúng ta chờ đợi đủ lâu, rất có thể đến một lúc nào đó kết quả sẽ có ý nghĩa.
Dưới đây là 20 mô phỏng độc lập với giới hạn mẫu. Tất cả đều bắt đầu thử nghiệm với mẫu, tại đó chúng tôi kiểm tra xem mỗi điểm có nằm ngoài các rào cản đã được rút ra theo công thức . Từ thời điểm kiểm tra thống kê đầu tiên là "đáng kể", dữ liệu mô phỏng được tô màu đỏ.n = 30 ( 1 )
Bạn có thể thấy những gì đang diễn ra: bước đi ngẫu nhiên quất lên xuống ngày càng nhiều khi tăng. Các rào cản đang lan rộng với tốc độ tương tự - nhưng không đủ nhanh để luôn luôn tránh đi bộ ngẫu nhiên.
Trong 20% các mô phỏng này, một sự khác biệt "đáng kể" đã được tìm thấy - thường là khá sớm - mặc dù trong mỗi một trong số chúng, giả thuyết null là hoàn toàn chính xác! Chạy nhiều mô phỏng loại này chỉ ra rằng kích thước thử nghiệm thực sự gần bằng thay vì giá trị dự định là : nghĩa là bạn sẵn sàng tiếp tục tìm kiếm "mức ý nghĩa" lên đến cỡ mẫu mang lại cho bạn cơ hội từ chối null ngay cả khi null là đúng.α = 5 % 5000 25 %
Lưu ý rằng trong tất cả bốn trường hợp "đáng kể", khi thử nghiệm tiếp tục, dữ liệu đã ngừng trông có ý nghĩa ở một số điểm. Trong cuộc sống thực, một người thí nghiệm dừng lại sớm đang mất cơ hội quan sát những "sự đảo ngược" như vậy. Sự chọn lọc này thông qua việc dừng tùy chọn làm sai lệch kết quả.
Trong các bài kiểm tra tuần tự trung thực đến tốt, các rào cản là các dòng. Chúng lan truyền nhanh hơn các rào cản cong được hiển thị ở đây.
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)
Những người chưa quen với thử nghiệm giả thuyết có xu hướng nghĩ rằng một khi giá trị ap giảm xuống dưới 0,05, việc thêm nhiều người tham gia sẽ chỉ làm giảm giá trị p hơn nữa. Nhưng điều này không đúng. Theo giả thuyết null, giá trị ap được phân phối đồng đều giữa 0 và 1 và có thể nảy xung quanh khá nhiều trong phạm vi đó.
Tôi đã mô phỏng một số dữ liệu trong R (kỹ năng R của tôi khá cơ bản). Trong mô phỏng này, tôi thu thập 5 điểm dữ liệu - mỗi điểm có thành viên nhóm được chọn ngẫu nhiên (0 hoặc 1) và mỗi điểm có số đo kết quả được chọn ngẫu nhiên ~ N (0,1). Bắt đầu từ người tham gia 6, tôi tiến hành kiểm tra t ở mỗi lần lặp.
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
}
Các giá trị p nằm trong hình này. Lưu ý rằng tôi tìm thấy kết quả quan trọng khi cỡ mẫu khoảng 70-75. Nếu tôi dừng lại ở đó, tôi sẽ tin rằng những phát hiện của tôi rất có ý nghĩa vì tôi đã bỏ lỡ thực tế là giá trị p của tôi đã tăng trở lại với một mẫu lớn hơn (điều này thực sự đã xảy ra với tôi một lần với dữ liệu thực). Vì tôi biết cả hai quần thể đều có giá trị trung bình bằng 0, nên đây phải là số dương. Đây là vấn đề với việc thêm dữ liệu cho đến p <0,05. Nếu bạn thêm tiến hành kiểm tra đủ, p cuối cùng sẽ vượt qua ngưỡng 0,05 và bạn có thể tìm thấy một hiệu ứng đáng kể là bất kỳ tập dữ liệu nào.
R
mã của bạn hoàn toàn không chạy.
df
trước (tốt nhất là ở kích thước cuối cùng của nó). Vì mã bắt đầu viết ở hàng 6, nên hàm ý (phù hợp với văn bản của câu trả lời) là df đã tồn tại với 5 hàng đã được điền vào. Có lẽ một cái gì đó như thế này đã được dự định: 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)
(sau đó chạy mã ở trên) có lẽ: plot(df$pv[6:150])
Câu trả lời này chỉ liên quan đến xác suất cuối cùng nhận được kết quả "đáng kể" và phân phối thời gian cho sự kiện này theo mô hình của @ whuber's.
Như trong mô hình của @whuber, hãy để biểu thị giá trị của thống kê kiểm tra sau khi các quan sát được thu thập và giả sử rằng các quan sát là iid chuẩn . Sau đó sao cho hoạt động như một chuyển động Brownian tiêu chuẩn liên tục, nếu chúng ta bỏ qua khoảnh khắc thực tế là chúng ta có một quá trình thời gian rời rạc (âm mưu bên trái).
Gọi là thời gian vượt qua đầu tiên của qua các rào cản phụ thuộc thời gian (số lượng quan sát cần thiết trước khi thử nghiệm chuyển sang đáng kể).
Hãy xem xét quá trình biến đổi thu được bằng cách chia tỷ lệ theo độ lệch chuẩn của nó tại thời điểm và bằng cách để thang đo thời gian mới sao cho Theo sau (1) và (2) rằng thường được phân phối với và S ( t )
Đối với mô hình được chuyển đổi, các rào cản trở thành hằng số độc lập với thời gian bằng . Sau đó, người ta đã biết ( Nobile và cộng sự 1985 ; Ricciardi & Sato, 1988 ) rằng thời gian trôi qua đầu tiên của quy trình OU qua các rào cản này được phân phối theo cấp số nhân với một số tham số (tùy thuộc vào các rào cản tại ) (ước tính cho bên dưới). Ngoài ra còn có một khối lượng điểm phụ có kích thước in . "Từ chối" củacuối cùng xảy ra với xác suất 1. Do đó, (số lượng quan sát cần thu thập trước khi nhận được kết quả "có ý nghĩa") theo sau phân phối theo cấp số nhân log với giá trị dự kiến Do đó, có một kỳ vọng hữu hạn nếu (đủ mức ý nghĩa lớn ).
Ở trên bỏ qua thực tế là cho mô hình thực là rời rạc và quy trình thực là rời rạc - thay vì liên tục - thời gian. Do đó, mô hình trên đánh giá quá cao khả năng rào cản đã bị vượt qua (và đánh giá thấp ) vì đường dẫn mẫu thời gian liên tục có thể chỉ vượt qua rào cản tạm thời ở giữa hai điểm thời gian rời rạc liền kề và . Nhưng những sự kiện như vậy nên có xác suất không đáng kể cho lớn . E T t t + 1 t
Hình dưới đây cho thấy ước tính Kaplan-Meier của trên thang đo log-log cùng với đường cong sống sót cho xấp xỉ thời gian liên tục theo hàm mũ (đường màu đỏ).
Mã 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)
Cần phải nói rằng các cuộc thảo luận ở trên là dành cho một thế giới quan thường xuyên, trong đó tính đa dạng xuất phát từ cơ hội bạn đưa dữ liệu trở nên cực đoan hơn, không phải từ cơ hội bạn tạo ra hiệu ứng tồn tại. Nguyên nhân cốt lõi của vấn đề là các giá trị p và lỗi loại I sử dụng điều hòa luồng thông tin ngược thời gian ngược, điều này quan trọng "làm thế nào bạn có được ở đây" và điều gì có thể xảy ra thay thế. Mặt khác, mô hình Bayes mã hóa sự hoài nghi về một hiệu ứng trên chính tham số, chứ không phải trên dữ liệu. Điều đó làm cho mỗi xác suất sau được giải thích giống nhau cho dù bạn có tính xác suất sau khác của hiệu ứng 5 phút trước hay không. Thông tin chi tiết và mô phỏng đơn giản có thể được tìm thấy tại http://www.fharrell.com/2017/10/continupt-learning-from-data-no.
Chúng tôi xem xét một nhà nghiên cứu thu thập một mẫu có kích thước , , để kiểm tra một số giả thuyết . Ông từ chối nếu một phù hợp kiểm tra thống kê vượt level- nó quan trọng giá trị . Nếu không, anh ta thu thập một mẫu khác có kích thước , và từ chối nếu thử nghiệm từ chối cho mẫu kết hợp . Nếu anh ta vẫn không bị từ chối, anh ta tiến hành theo cách này, tổng cộng lên tới lần.x 1 θ = θ 0 t α c n x 2 ( x 1 , x 2 ) K
Vấn đề này dường như đã được giải quyết bởi P. Armitage, CK McPherson và BC Rowe (1969), Tạp chí của Hiệp hội Thống kê Hoàng gia. Sê-ri A (132), 2, 235-244: "Các thử nghiệm quan trọng lặp lại trên dữ liệu tích lũy" .
Quan điểm của Bayes về vấn đề này, cũng được thảo luận ở đây, nhân tiện, được thảo luận trong Berger và Wolpert (1988), "Nguyên tắc khả năng sống" , Phần 4.2.
Đây là một bản sao một phần của Armitage et al của kết quả (mã dưới đây), trong đó cho thấy cách mức ý nghĩa thổi phồng khi , cũng như các yếu tố chỉnh thể khôi phục level- giá trị quan trọng. Lưu ý tìm kiếm lưới mất một lúc để chạy --- việc triển khai có thể không hiệu quả.α
Kích thước của quy tắc từ chối tiêu chuẩn là một hàm của số lần thử
Kích thước như một hàm tăng giá trị tới hạn cho khác nhau
Điều chỉnh các giá trị tới hạn để khôi phục 5% kiểm tra dưới dạng hàm của
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")