मैं वास्तव में सोच रहा था कि एक महत्वपूर्ण परिणाम (जैसे, ) प्राप्त होने तक डेटा क्यों एकत्र किया जाता है (यानी, पी-हैकिंग) टाइप I त्रुटि दर को बढ़ाता है?
मैं R
इस घटना के प्रदर्शन की भी बहुत सराहना करूंगा ।
मैं वास्तव में सोच रहा था कि एक महत्वपूर्ण परिणाम (जैसे, ) प्राप्त होने तक डेटा क्यों एकत्र किया जाता है (यानी, पी-हैकिंग) टाइप I त्रुटि दर को बढ़ाता है?
मैं R
इस घटना के प्रदर्शन की भी बहुत सराहना करूंगा ।
जवाबों:
समस्या यह है कि आप अपने आप को परीक्षा पास करने के लिए बहुत सारे मौके दे रहे हैं। यह इस संवाद का सिर्फ एक फैंसी संस्करण है:
मैं आपको देखने के लिए फ्लिप करूंगा कि रात के खाने के लिए कौन भुगतान करता है।
ठीक है, मैं सिर कहता हूं।
चूहों, तुम जीत गए। तीन में से सर्वश्रेष्ठ दो?
इसे बेहतर समझने के लिए, इस क्रमिक प्रक्रिया के एक सरलीकृत लेकिन यथार्थवादी - मॉडल पर विचार करें । मान लीजिए कि आप एक निश्चित संख्या में टिप्पणियों के "ट्रायल रन" के साथ शुरू करेंगे, लेकिन से कम पी-मूल्य प्राप्त करने के लिए लंबे समय तक प्रयोग जारी रखने के लिए तैयार हैं । अशक्त परिकल्पना यह है कि प्रत्येक अवलोकन एक मानक सामान्य वितरण से (स्वतंत्र रूप से) आता है। विकल्प यह है कि स्वतंत्र रूप से एक यूनिट- सामान्य वितरण से एक आता है। परीक्षण आँकड़ा सभी अवलोकनों का माध्यम होगा, , उनकी मानक त्रुटि, द्वारा विभाजित । दो तरफा परीक्षण के लिए, महत्वपूर्ण मूल्य हैंएक्स मैं एक्स मैं n ˉ एक्स 1 / √ 0.0250.975जेडα=±1.96मानक सामान्य वितरण के और प्रतिशत अंक, लगभग।
यह एक अच्छा परीक्षण है - निश्चित नमूना आकार साथ एक एकल प्रयोग । यह वास्तव में एक है शून्य परिकल्पना को खारिज, कोई बात नहीं क्या की संभावना हो सकता है।5 % एन
आइए बीजगणितीय रूप से इसे सभी मानों, के योग के आधार पर समतुल्य परीक्षण मेंएस एन = एक्स 1 + एक्स 2 + ⋯ + एक्स n = n ˉ एक्स ।
इस प्रकार, जब डेटा "महत्वपूर्ण" होता है
अर्थात्,
अगर हम होशियार हैं, तो हम अपने नुकसान में कटौती करेंगे और एक बार बड़ा हो जाएगा और डेटा अभी भी महत्वपूर्ण क्षेत्र में प्रवेश नहीं किया है।
यह एक यादृच्छिक चलना वर्णन करता है । रैंडम वॉक के प्लॉट के चारों ओर एक घुमावदार परवलयिक "बाड़", या बैरियर को खड़ा करने के लिए सूत्र मात्रा है : यदि रैंडम वॉक के किसी भी बिंदु से बाड़ हिट होती है, तो परिणाम "महत्वपूर्ण" है । ( 1 ) ( एन , एस एन )
यह यादृच्छिक चलता की एक संपत्ति है कि अगर हम लंबे समय तक इंतजार करते हैं, तो यह बहुत संभावना है कि कुछ बिंदु पर परिणाम महत्वपूर्ण दिखाई देगा।
यहाँ नमूनों की सीमा तक 20 स्वतंत्र सिमुलेशन हैं। वे सभी नमूनों पर परीक्षण करना शुरू करते हैं, जिस बिंदु पर हम जांचते हैं कि क्या प्रत्येक बिंदु सूत्र अनुसार खींची गई बाधाओं के बाहर है । जिस बिंदु पर सांख्यिकीय परीक्षण पहले "महत्वपूर्ण" है, नकली डेटा लाल रंग का है।n = 30 ( 1 )
आप देख सकते हैं कि क्या चल रहा है: रैंडम वॉक ऊपर और नीचे बढ़ता है और बढ़ जाता है। बाधाओं को एक ही दर से अलग-अलग फैलाया जा रहा है - लेकिन इतनी तेजी से नहीं कि हमेशा यादृच्छिक चलने से बचें।
इन सिमुलेशन के 20% में, एक "महत्वपूर्ण" अंतर पाया गया - आमतौर पर काफी जल्दी - भले ही उनमें से हर एक में परिकल्पना बिल्कुल सही है! इस प्रकार के अधिक सिमुलेशन चलाने से संकेत मिलता है कि असली परीक्षण आकार के इच्छित मूल्य के बजाय करीब है : अर्थात, नमूने के आकार तक "महत्व" की तलाश में रहने की आपकी इच्छा नल के सत्य होने पर भी आपको शून्य को अस्वीकार करने का मौका देता है।α = 5 % 5000 25 %
ध्यान दें कि सभी चार "महत्वपूर्ण" मामलों में, जैसा कि परीक्षण जारी रहा, कुछ बिंदुओं पर डेटा महत्वपूर्ण दिखना बंद हो गया । वास्तविक जीवन में, एक प्रयोगकर्ता जो जल्दी रुक जाता है, ऐसे "उलटफेर" का निरीक्षण करने का मौका खो रहा है। वैकल्पिक रोक के माध्यम से यह चयनात्मकता परिणामों को पूर्वाग्रहित करती है।
ईमानदार-से-अच्छाता अनुक्रमिक परीक्षणों में, बाधाएं लाइनें हैं। वे यहां दिखाए गए घुमावदार बाधाओं की तुलना में तेजी से फैलते हैं।
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)
जो लोग परिकल्पना परीक्षण के लिए नए हैं, वे सोचते हैं कि एक बार एपी मान .05 से नीचे चला जाता है, अधिक प्रतिभागियों को जोड़ने से केवल पी मूल्य में और कमी आएगी। लेकिन यह सच नहीं है। अशक्त परिकल्पना के तहत, एपी मान 0 और 1 के बीच समान रूप से वितरित किया जाता है और उस सीमा में लगभग थोड़ा सा उछल सकता है।
मैंने R में कुछ डेटा का अनुकरण किया है (मेरे आर कौशल काफी बुनियादी हैं)। इस सिमुलेशन में, मैं 5 डेटा अंक एकत्र करता हूं - प्रत्येक एक यादृच्छिक चयनित समूह सदस्यता (0 या 1) के साथ और प्रत्येक एक यादृच्छिक रूप से चयनित परिणाम माप ~ एन (0,1) के साथ। प्रतिभागी 6 पर शुरू करते हुए, मैं हर पुनरावृत्ति पर एक टी-टेस्ट आयोजित करता हूं।
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 तक डेटा जोड़ने के साथ समस्या है। यदि आप पर्याप्त परीक्षण करते हैं, तो पी अंततः अंततः .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])
यह उत्तर केवल अंततः "महत्वपूर्ण" परिणाम प्राप्त करने की संभावना और @ व्ह्यूबर मॉडल के तहत इस घटना को समय के वितरण की चिंता करता है।
आर कोड:
# 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)
यह कहने की जरूरत है कि उपरोक्त चर्चा एक निरंतर विश्व दृष्टिकोण के लिए है, जिसके लिए बहुलता उन अवसरों से आती है जो आप डेटा को अधिक चरम देते हैं, न कि उन अवसरों से जब आप मौजूद होने के लिए एक प्रभाव देते हैं। समस्या का मूल कारण यह है कि पी-वैल्यूज़ और टाइप I एरर्स बैकवर्ड-टाइम बैकवर्ड-इंफॉर्मेशन फ्लो कंडीशनिंग का उपयोग करते हैं, जो इसे "आप यहाँ कैसे मिला" महत्वपूर्ण बनाता है और इसके बजाय क्या हो सकता है। दूसरी ओर, बायेसियन प्रतिमान पैरामीटर पर प्रभाव के बारे में संदेह व्यक्त करता है, न कि डेटा पर। इससे प्रत्येक पश्च-संभाव्यता की व्याख्या उसी रूप में की जा सकती है, जब आपने 5 मिनट पहले प्रभाव की एक और बाद की संभावना की गणना की थी या नहीं। अधिक विवरण और एक सरल सिमुलेशन http://www.fharrell.com/2017/10/continuous-learning-from-data-no पर पाया जा सकता है ।
इस समस्या के बारे में पहले से ही पता चला है । पी। अर्मेटेज, सीके मैकफर्सन और बीसी रोवे (1969), जर्नल ऑफ द रॉयल स्टैटिस्टिकल सोसाइटी द्वारा संबोधित किया गया है । सीरीज़ ए (132), 2, 235-244: "संचित डेटा पर दोहराए गए महत्वपूर्ण परीक्षण" ।
इस मुद्दे पर बेयसियन दृष्टिकोण, यहां भी चर्चा की गई है, जिस तरह से, बर्जर और वोल्पर (1988), "द लिक्लिएलहुड सिद्धांत" , धारा 4.2 में चर्चा की गई है ।
के प्रयासों की संख्या के फलस्वरूप मानक अस्वीकृति नियम का आकार
विभिन्न लिए महत्वपूर्ण मूल्यों को बढ़ाने के एक समारोह के रूप में आकार
एक फ़ंक्शन के रूप में 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")