Saya bertanya-tanya persis mengapa mengumpulkan data sampai hasil yang signifikan (misalnya, ) diperoleh (yaitu, p-hacking) meningkatkan tingkat kesalahan Tipe I?
Saya juga akan sangat menghargai R
demonstrasi fenomena ini.
Saya bertanya-tanya persis mengapa mengumpulkan data sampai hasil yang signifikan (misalnya, ) diperoleh (yaitu, p-hacking) meningkatkan tingkat kesalahan Tipe I?
Saya juga akan sangat menghargai R
demonstrasi fenomena ini.
Jawaban:
Masalahnya adalah Anda memberi diri Anda terlalu banyak peluang untuk lulus ujian. Ini hanya versi mewah dari dialog ini:
Saya akan membalik Anda untuk melihat siapa yang membayar makan malam.
OK, saya memanggil kepala.
Tikus, kamu menang. Dua terbaik dari tiga?
Untuk memahami ini lebih baik, pertimbangkan model prosedur sekuensial yang disederhanakan - tetapi realistis - ini . Misalkan Anda akan mulai dengan "percobaan" dari sejumlah pengamatan, tetapi bersedia untuk terus bereksperimen lebih lama untuk mendapatkan nilai p kurang dari . Hipotesis nol adalah bahwa setiap pengamatan berasal (secara independen) dari distribusi Normal standar. Alternatifnya adalah bahwa datang secara independen dari distribusi normal unit-variance dengan rata-rata bukan nol. Uji statistik akan menjadi mean dari semua pengamatan, , dibagi dengan standard error mereka, . Untuk tes dua sisi, nilai kritisnya adalahX i X i n ˉ X 1 / √ 0,0250,975Zα=±1,96 dan poin persentase dari distribusi Normal standar, sekitar .
Ini adalah tes yang baik - untuk percobaan tunggal dengan ukuran sampel tetap . Persis memiliki peluang untuk menolak hipotesis nol, tidak peduli apa pun .5 % n
Mari kita aljabar mengonversikan ini menjadi tes yang setara berdasarkan jumlah semua nilai ,S n = X 1 + X 2 + ⋯ + X n = n ˉ X .
Dengan demikian, data "signifikan" ketika
itu adalah,
Jika kita pintar, kita akan memotong kerugian kita dan menyerah begitu tumbuh sangat besar dan data masih belum memasuki wilayah kritis.
Ini menggambarkan jalan acak . Rumus sama dengan mendirikan "pagar" parabola yang melengkung atau penghalang, di sekitar alur jalan acak : hasilnya "signifikan" jika ada titik jalan acak yang mengenai pagar. ( 1 ) ( n , S n )
Merupakan sifat berjalan acak bahwa jika kita menunggu cukup lama, sangat mungkin bahwa pada titik tertentu hasilnya akan terlihat signifikan.
Berikut adalah 20 simulasi independen hingga batas sampel. Mereka semua mulai menguji pada sampel, pada titik mana kami memeriksa apakah setiap titik berada di luar hambatan yang telah ditarik sesuai dengan rumus . Dari titik di mana tes statistik pertama "signifikan," data yang disimulasikan berwarna merah.n = 30 ( 1 )
Anda dapat melihat apa yang terjadi: jalan acak semakin naik dan turun seiring bertambahnya . Hambatan menyebar terpisah pada tingkat yang sama - tetapi tidak cukup cepat selalu untuk menghindari jalan acak.
Dalam 20% dari simulasi ini, perbedaan "signifikan" ditemukan - biasanya cukup awal - meskipun dalam setiap dari mereka hipotesis nol benar-benar benar! Menjalankan lebih banyak simulasi jenis ini menunjukkan bahwa ukuran pengujian sebenarnya mendekati daripada nilai yang dimaksudkan dari : yaitu, kesediaan Anda untuk terus mencari "signifikansi" hingga ukuran sampel memberi Anda peluang untuk menolak nol bahkan ketika nol benar.
Perhatikan bahwa dalam keempat kasus "signifikan", saat pengujian berlanjut, data berhenti tampak signifikan di beberapa titik. Dalam kehidupan nyata, seorang eksperimen yang berhenti lebih awal kehilangan kesempatan untuk mengamati "pembalikan" tersebut. Selektivitas ini melalui penghentian opsional bias hasilnya.
Dalam tes sekuensial jujur-untuk-kebaikan, hambatannya adalah garis. Mereka menyebar lebih cepat daripada hambatan lengkung yang ditunjukkan di sini.
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)
Orang yang baru dalam pengujian hipotesis cenderung berpikir bahwa begitu nilai p turun di bawah 0,05, menambahkan lebih banyak peserta hanya akan menurunkan nilai p lebih lanjut. Tetapi ini tidak benar. Di bawah hipotesis nol, nilai ap terdistribusi secara seragam antara 0 dan 1 dan dapat memantul sedikit di kisaran itu.
Saya telah mensimulasikan beberapa data dalam R (keterampilan R saya cukup mendasar). Dalam simulasi ini, saya mengumpulkan 5 poin data - masing-masing dengan keanggotaan grup yang dipilih secara acak (0 atau 1) dan masing-masing dengan ukuran hasil yang dipilih secara acak ~ N (0,1). Mulai dari peserta 6, saya melakukan uji-t di setiap iterasi.
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
}
Nilai p ada dalam gambar ini. Perhatikan bahwa saya menemukan hasil yang signifikan ketika ukuran sampel sekitar 70-75. Jika saya berhenti di situ, saya akan akhirnya percaya bahwa temuan saya signifikan karena saya akan kehilangan fakta bahwa nilai p saya melonjak kembali dengan sampel yang lebih besar (ini benar-benar terjadi pada saya sekali dengan data nyata). Karena saya tahu kedua populasi memiliki rata-rata 0, ini pasti positif palsu. Ini adalah masalah dengan menambahkan data sampai p <.05. Jika Anda menambahkan cukup melakukan tes, p akhirnya akan melewati ambang 0,05 dan Anda dapat menemukan efek signifikan adalah kumpulan data apa pun.
R
kode Anda tidak berjalan sama sekali.
df
dulu (lebih disukai pada ukuran akhirnya). Karena kode mulai menulis pada baris 6 implikasinya (yang sesuai dengan teks jawaban) adalah bahwa df sudah ada dengan 5 baris yang sudah diisi. Mungkin sesuatu seperti ini dimaksudkan: 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)
(lalu jalankan kode di atas) maka mungkin: plot(df$pv[6:150])
Jawaban ini hanya menyangkut kemungkinan akhirnya mendapatkan hasil "signifikan" dan distribusi waktu ke acara ini di bawah model @ whuber.
Seperti dalam model @whuber, misalkan menunjukkan nilai statistik uji setelah observasi dikumpulkan dan menganggap bahwa pengamatan adalah standar normal iid . Kemudian sedemikian rupa sehingga berperilaku seperti gerakan Brown standar waktu terus-menerus, jika saat ini kita mengabaikannya fakta bahwa kami memiliki proses waktu diskrit (plot kiri di bawah).
Misalkan menunjukkan waktu bagian pertama melintasi hambatan tergantung (jumlah pengamatan yang diperlukan sebelum tes menjadi signifikan).
Pertimbangkan proses transformasi diperoleh dengan penskalaan dengan deviasi standarnya pada waktu dan dengan membiarkan skala waktu baru sedemikian sehingga Dari (1) dan (2) berikut bahwa secara normal didistribusikan dengan dan
Untuk model yang ditransformasikan, hambatannya menjadi konstanta bebas-waktu yang sama dengan . Kemudian diketahui ( Nobile et. Al. 1985 ; Ricciardi & Sato, 1988 ) bahwa bagian-waktu pertama dari proses OU melintasi hambatan-hambatan ini kira-kira didistribusikan secara eksponensial dengan beberapa parameter (tergantung pada hambatan pada ) (diperkirakan untuk bawah). Ada juga titik massa tambahan dalam ukuran in . "Penolakan" dariakhirnya terjadi dengan probabilitas 1. Oleh karena itu, (jumlah pengamatan yang perlu dikumpulkan sebelum mendapatkan hasil "signifikan") kira-kira mengikuti distribusi log eksponensial dengan nilai yang diharapkan Dengan demikian, memiliki ekspektasi terbatas hanya jika (untuk cukup tingkat signifikansi yang besar ).
Di atas mengabaikan fakta bahwa untuk model nyata adalah diskrit dan bahwa proses nyata adalah diskrit - bukan waktu kontinu. Oleh karena itu, model di atas melebih-lebihkan probabilitas bahwa penghalang telah dilintasi (dan meremehkan ) karena jalur sampel waktu kontinu dapat melintasi penghalang hanya sementara di antara dua titik waktu diskrit berdekatan dan . Tetapi kejadian seperti itu harus memiliki probabilitas yang dapat diabaikan untuk besar . E T t t + 1 t
Gambar berikut menunjukkan estimasi Kaplan-Meier dari pada skala log-log bersama dengan kurva survival untuk perkiraan waktu kontinu eksponensial (garis merah).
Kode 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)
Perlu dikatakan bahwa diskusi di atas adalah untuk pandangan dunia yang sering muncul yang mana multiplisitas berasal dari peluang Anda memberikan data menjadi lebih ekstrem, bukan dari peluang Anda memberi efek untuk eksis. Akar penyebab masalahnya adalah bahwa kesalahan nilai-p dan tipe I menggunakan pengkondisian aliran mundur-waktu mundur-informasi, yang menjadikannya penting "bagaimana Anda sampai di sini" dan apa yang bisa terjadi sebagai gantinya. Di sisi lain, paradigma Bayes menyandikan skeptisisme tentang efek pada parameter itu sendiri, bukan pada data. Itu membuat setiap probabilitas posterior diinterpretasikan sama apakah Anda menghitung probabilitas posterior lain dari efek 5 menit yang lalu atau tidak. Rincian lebih lanjut dan simulasi sederhana dapat ditemukan di http://www.fharrell.com/2017/10/continuous-learning-from-data-no.
Kami menganggap seorang peneliti mengumpulkan sampel berukuran , , untuk menguji beberapa hipotesis . Dia menolak jika statistik uji yang cocok melebihi nilai kritis level- . Jika tidak, ia mengumpulkan sampel lain berukuran , , dan menolak jika tes menolak untuk sampel gabungan . Jika ia masih tidak mendapatkan penolakan, ia melanjutkan dengan cara ini, hingga total kali.x 1 θ = θ 0 t α c n x 2 ( x 1 , x 2 ) K
Masalah ini tampaknya sudah diatasi oleh P. Armitage, CK McPherson dan BC Rowe (1969), Jurnal Masyarakat Statistik Kerajaan. Seri A (132), 2, 235-244: "Tes Signifikansi Berulang pada Data Akumulasi" .
Sudut pandang Bayesian tentang masalah ini, juga dibahas di sini, adalah, omong-omong, dibahas dalam Berger dan Wolpert (1988), "The Likelihood Principle" , Bagian 4.2.
Berikut adalah replikasi parsial hasil Armitage et al (kode di bawah), yang menunjukkan bagaimana tingkat signifikansi mengembang ketika , serta kemungkinan faktor koreksi untuk mengembalikan nilai kritis level- . Catatan pencarian grid membutuhkan waktu untuk berjalan --- implementasi mungkin agak tidak efisien.α
Ukuran aturan penolakan standar sebagai fungsi dari jumlah upaya
Ukuran sebagai fungsi meningkatkan nilai kritis untuk berbeda
Nilai kritis yang disesuaikan untuk mengembalikan tes 5% sebagai fungsi dari
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")