重要な結果が得られるまでデータを収集すると、タイプIのエラー率が増加するのはなぜですか?


60

重要な結果(例:)が得られるまで(つまり、p-hacking)データを収集すると、タイプIのエラー率が増加するのはなぜだろうか。p<.05

またR、この現象の実証を高く評価します。


6
「ハーキング」とは「結果がわかった後の仮説化」を意味するため、おそらく「p-ハッキング」を意味します。
whuber

2
もう一度、xkcdは写真で良い質問に答えます。 xkcd.com/882
ジェイソン

7
@Jason私はあなたのリンクに反対しなければなりません。それは、データの累積的な収集については言及していません。同じことに関するデータの累積的な収集であり、p値を計算するために必要なすべてのデータを使用することさえ間違っているという事実は、そのxkcdの場合よりもはるかに重要です。p
-JiK

1
@JiK、フェアコール。私は「好きな結果が得られるまで努力し続ける」という側面に焦点を当てましたが、あなたは絶対に正しいです。手元の質問にはもっと多くのことがあります。
ジェイソン

@whuberとuser163778は、このスレッドでは、「A / B(シーケンシャル)テスト」の実質的に同一の場合について説明したように非常によく似た応答を与えた:stats.stackexchange.com/questions/244646/...あり、私たちは家族ワイズエラーの観点から論じ繰り返しテストにおけるp値調整の割合と必要性。実際、この質問は繰り返しテストの問題とみなすことができます!
トムカ

回答:


87

問題は、テストに合格する機会が多すぎることです。これは、このダイアログのファンシーなバージョンです。

誰が夕食の支払いをするかを見るためにあなたをひっくり返します。

OK、私は頭を呼び出します。

ラット、あなたが勝った。3つのうち2つがベストですか?


これをよりよく理解するために、この順次手順の単純化された(しかし現実的な)モデルを検討してください。特定の数の観測値の「試行」から始めますが、未満のp値を取得するために、より長い実験を続けていくと仮定します。帰無仮説は、各観測X iが(独立して)標準正規分布に由来するというものです。別の方法は、X iが平均がゼロでない単位分散正規分布から独立していることです。検定統計量は、全ての平均値となり、n個の観測値、ˉ X、それらの標準誤差で割った、1 / 0.05XiXinX¯。両側検定のために、臨界値は0.0250.975標準正規分布のパーセント・ポイント、Zのα=±1.96を約。1/n0.0250.975Zα=±1.96

これは、サンプルサイズ固定した単一の実験に適したテストです。nが何であっても、帰無仮説を棄却する可能性は正確に5 です。n5%n

のは、代数的に基づいて等価なテストにこれを変換してみましょう全ての値は、S N = X 1 + X 2 + + X N = N ˉ Xn

Sn=X1+X2++Xn=nX¯.

したがって、データは「重要」です

|Zα||X¯1/n|=|Snn/n|=|Sn|/n;

あれは、

(1)|Zα|n|Sn|.

賢明であれば、損失が削減され、が非常に大きくなり、データがまだ重要な領域に入っていない場合はあきらめます。n

これは、ランダムウォーク 表します。式1 ランダムウォークのプロットの周りに、湾曲した放物線「フェンス」またはバリアを正立になるN SのN)、次の場合に結果が「重要」である任意のランダムウォークの点がフェンスに当たりました。Sn(1)(n,Sn)

ランダムウォークのプロパティであるため、十分に長く待つと、ある時点で結果が重要に見える可能性が非常に高くなります。

n=5000n=30(1)

図

n

25%α=5%500025%

4つの「重要な」すべてのケースで、テストを続けると、データいくつかの点で重要に見えなくなることに注意してください。実際には、早期に停止する実験者は、そのような「復帰」を観察する機会を失います。オプションの停止によるこの選択性は、結果にバイアスをかけます。

誠実さの連続テストでは、障壁は線です。これらは、ここに示されている湾曲した障壁よりも速く広がります。

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)

12
nO(n)2/π

10
n=5,000,000α=0.051/4

4
α=0.05n

6
p<0.05n1=10nk+1=10nkpnk+1pnkp<0.0510nkA(nk)BB(nk)

10
@CL。私は数年前にあなたの反対予想していました: 17は私の公開シードです。実際、初期の(はるかに長い)トライアルでは、一貫して20%を大幅に上回る有意の大きな割合を取得していました。最終イメージを作成するためにシードを17に設定しましたが、その効果がそれほど劇的ではないことに失望しました。 C'est la vie。 関連する投稿(要点を示す)はstats.stackexchange.com/a/38067/919にあります。
whuber

18

仮説検定に慣れていない人は、p値が.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の場合、重要な結果が見つかります。そこで停止すると、p値がより大きなサンプルで跳ね返ったという事実を見逃してしまうため、私の調査結果が重要であると信じ込んでしまいます(これは実際のデータで一度起こりました)。私は両方の母集団の平均が0であることを知っているので、これは偽陽性でなければなりません。これは、p <.05までデータを追加する際の問題です。十分なテストを追加すると、pは最終的に.05のしきい値を超え、あらゆるデータセットに大きな効果があることがわかります。

ここに画像の説明を入力してください


1
感謝しますが、Rコードはまったく実行されません。
レザ

3
df最初に作成する必要がある@Reza (できれば最終サイズ)。コードは、行6(答えのテキストに収まる)の含意で書き込みを開始しますので、すでに5行に存在するdfをすでに満たしていることであるかもしれない、このような何かを意図した。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])
Glen_b

@ user263778は非常に有用で適切な回答に焦点を当てていますが、いわゆるp値の解釈についてはあまりにも多くの混乱があります。
サブハッシュC.ダバール

@ user163778 -あなたも、すべてを初期化するコードが含まれている必要があり
Dason

17

この答えは、最終的に「重要な」結果を得る確率と、@ whuberのモデルの下でのこのイベントへの時間の分布にのみ関係します。

S(t)=X1+X2++XttX1,X2,

(1)S(t+h)|S(t)=s0N(s0,h),
S(t)

TS(t)±zα/2t

変換プロセス考えますY(τ)S(t)tτ=lnt

(2)Y(τ)=S(t(τ))t(τ)=eτ/2S(eτ).
Y(τ+δ)
E(Y(τ+δ)|Y(τ)=y0)=E(e(τ+δ)/2S(eτ+δ)|S(eτ)=y0eτ/2)(3)=y0eδ/2
Var(Y(τ+δ)|Y(τ)=y0)=Var(e(τ+δ)/2S(eτ+δ)|S(eτ)=y0eτ/2)(4)=1eδ,
Y(τ)

ここに画像の説明を入力してください

±zα/2TY(τ)λ±zα/2λ^=0.125α=0.05ατ=0H0T=eT

(5)ET1+(1α)0eτλeλτdτ.
Tλ>1α

TETtt+1t

P(T>t)

ここに画像の説明を入力してください

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)

ありがとう!これらの結果の(標準)参照はありますか?たとえば、なぜYプロセスはOrnstein-Uhlenbeckであり、通過時間の結果はどこで確認できますか?
グラッシー

1
Tτ=0Y(0)


Y(0)

5

上記の議論は、多重度が存在する効果を与える可能性からではなく、データを与える可能性がより極端であることに起因する多頻度主義の世界観であると言う必要があります。問題の根本的な原因は、p値ということであり、私にエラーを入力し、「あなたがここに来たか」が重要になりれ、下位の時間下位情報の流れ調整を使用して、どのような可能性が代わりに起こりました。一方、ベイジアンパラダイムは、データではなく、パラメーター自体への影響に関する懐疑論をコード化します。これにより、5分前に効果の別の事後確率を計算したかどうかにかかわらず、各事後確率が同じように解釈されます。詳細と簡単なシミュレーションは、http://www.fharrell.com/2017/10/continuous-learning-from-data-noにあります。


1
敬devなベイジアンであるB博士が率いる研究室を想像してみましょう。この研究室ではソーシャルプライミングを研究しており、ベイズ因子BF> 10でサポートされるたびに、プライミングのさまざまな効果を示す論文の安定した流れを生み出しています。彼らがシーケンシャルテストを一度も行わなければ、かなり説得力があるように見えます。しかし、私は彼らが常にシーケンシャルテストを行い、プライミング効果を支持して BF> 10を得るまで新しい被験者を取得し続けることを学びましょう。そして、明らかにこの仕事全体は価値がない。BFのp値に基づいていても、順次テストと選択を行うという事実は大きな違いをもたらします。
アメーバは、モニカを復活させる

1
0.95

1
私はあなたのブログ投稿を読み、引用に気づき、他の誰かが別の回答へのコメントでリンクした同様のペーパー(オプションの停止:ベイジアンにとっては問題ありません)を見ました。まだわかりません。「null」(プライミング効果なし)がtrueの場合、B博士が十分に長くサンプリングを行うと、実験を実行するたびに事後確率> 0.95を取得できます(F博士ができるように)毎回p <0.05を取得します)。これが「絶対に悪いことではない」場合、何であるかわかりません。
アメーバは、モニカを復活させる

2
まあ、私はこの「大きなポイント」に異議を唱えます。私はこれが真実だとは思わない。私が繰り返し続けると、ゼロのゼロ効果の下で、与えられた事前分布(たとえば、ゼロを中心とした幅広い連続事前分布)で、繰り返しサンプリングは遅かれ早かれ、常にゼロより上に集中する> 0.98事後確率をもたらします。これが発生するまでサンプリングする(つまり、この停止ルールを適用する)人は、毎回間違っています。この人が0.02の時間だけ間違っているとどのように言えますか?分かりません。これらの特定の状況下で、彼はそうしません、彼は常に間違っています。
アメーバは、モニカを復活させる

2
私はそうは思いません。私のより大きなポイントは、シーケンシャルテストに苦しんでいるために頻繁な手順を同時に非難し、シーケンシャルテストの影響を受けないベイジアン手順を守ることは不公平で一貫性がないということです。私のポイント(数学的事実)は、両者がまったく同じように影響を受けるということです。つまり、シーケンシャルテストでは、ベイズのタイプIエラーを100%まで増やすことができます。もちろん、原則として、タイプIのエラー率に興味がないと言うのであれば、それは無関係です。しかし、それから頻繁な手続きも非難されるべきではありません。
アメーバは、モニカを復活させる

3

nx1θ=θ0tαcnx2(x1,x2)K

この問題は、P。アーミテージ、CKマクファーソンおよびBCロウ(1969年)、Journal of the Royal Statistical Societyによってすでに対処されているようです。シリーズA(132)、2、235-244:「累積データの反復有意性テスト」

ここで議論されているこの問題に関するベイジアンの視点は、ところで、Berger and Wolpert(1988)、「The Likelihood Principle」、セクション4.2 で議論されています。

K>1α

試行回数関数としての標準拒否ルールのサイズK

ここに画像の説明を入力してください

異なる増加する臨界値の関数としてのサイズK

ここに画像の説明を入力してください

関数として5%のテストを復元するように調整されたクリティカル値K

ここに画像の説明を入力してください

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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.