リサンプリングされたデータセットの仮説検定でnullが頻繁に拒否されるのはなぜですか?


10

tl; dr:nullの下で生成されたデータセットから始めて、置換でケースをリサンプリングし、リサンプリングされた各データセットに対して仮説検定を行いました。これらの仮説検定は、ヌルを5%以上の確率で拒否します。

以下の非常に単純なシミュレーションでは、でデータセットを生成し、それぞれに単純なOLSモデルを当てはめます。次に、各データセットについて、元のデータセットの行を置換して再サンプリングすることにより、1000個の新しいデータセットを生成します(Davison&Hinkleyの古典的なテキストで線形回帰に適していると特に説明されているアルゴリズム)。それらのそれぞれについて、私は同じOLSモデルを適合させました。最終的に、ブートストラップサンプル内の仮説テストの約16%がnullを拒否しますが、5%を取得する必要があります(元のデータセットで行うように)。XN(0,1)⨿YN(0,1)

私はそれが膨張した関連を引き起こす繰り返しの観察に関係しているのではないかと思ったので、比較のために、以下のコードで他の2つのアプローチを試しました(コメントアウト)。方法2では、を修正してから、を元のデータセットのOLSモデルからのリサンプリングされた残差で置き換えます。方法3では、置換せずにランダムなサブサンプルを描画します。これらの選択肢はどちらも機能します。つまり、それらの仮説テストでは、ヌルが5%の確率で拒否されます。YXY

私の質問:繰り返しの観察が原因だと思いますか?もしそうなら、これがブートストラップへの標準的なアプローチであるとすれば、どこで標準的なブートストラップ理論に正確に違反しているのでしょうか?

アップデート#1:より多くのシミュレーション

さらに単純なシナリオである切片のみの回帰モデルを試しました。同じ問題が発生します。Y

# note: simulation takes 5-10 min on my laptop; can reduce boot.reps
#  and n.sims.run if wanted
# set the number of cores: can change this to match your machine
library(doParallel)
registerDoParallel(cores=8)
boot.reps = 1000
n.sims.run = 1000

for ( j in 1:n.sims.run ) {

  # make initial dataset from which to bootstrap
  # generate under null
  d = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

  # fit OLS to original data
  mod.orig = lm( Y1 ~ X1, data = d )
  bhat = coef( mod.orig )[["X1"]]
  se = coef(summary(mod.orig))["X1",2]
  rej = coef(summary(mod.orig))["X1",4] < 0.05

  # run all bootstrap iterates
  parallel.time = system.time( {
    r = foreach( icount( boot.reps ), .combine=rbind ) %dopar% {

      # Algorithm 6.2: Resample entire cases - FAILS
      # residuals of this model are repeated, so not normal?
      ids = sample( 1:nrow(d), replace=TRUE )
      b = d[ ids, ]

      # # Method 2: Resample just the residuals themselves - WORKS
      # b = data.frame( X1 = d$X1, Y1 = sample(mod.orig$residuals, replace = TRUE) )

      # # Method 3: Subsampling without replacement - WORKS
      # ids = sample( 1:nrow(d), size = 500, replace=FALSE )
      # b = d[ ids, ]

      # save stats from bootstrap sample
      mod = lm( Y1 ~ X1, data = b ) 
      data.frame( bhat = coef( mod )[["X1"]],
                  se = coef(summary(mod))["X1",2],
                  rej = coef(summary(mod))["X1",4] < 0.05 )

    }
  } )[3]


  ###### Results for This Simulation Rep #####
  r = data.frame(r)
  names(r) = c( "bhat.bt", "se.bt", "rej.bt" )

  # return results of each bootstrap iterate
  new.rows = data.frame( bt.iterate = 1:boot.reps,
                         bhat.bt = r$bhat.bt,
                         se.bt = r$se.bt,
                         rej.bt = r$rej.bt )
  # along with results from original sample
  new.rows$bhat = bhat
  new.rows$se = se
  new.rows$rej = rej

  # add row to output file
  if ( j == 1 ) res = new.rows
  else res = rbind( res, new.rows )
  # res should have boot.reps rows per "j" in the for-loop

  # simulation rep counter
  d$sim.rep = j

}  # end loop over j simulation reps



##### Analyze results #####

# dataset with only one row per simulation
s = res[ res$bt.iterate == 1, ]

# prob of rejecting within each resample
# should be 0.05
mean(res$rej.bt); mean(s$rej)

アップデート#2:答え

コメントと回答でいくつかの可能性が提案され、私はそれらを経験的にテストするためにさらにシミュレーションを行いました。JWalkerは正しいことがわかりました。問題は、正しいサンプリング分布を取得するために、元のデータの推定値によってブートストラップ統計を中央に配置する必要があったことです。ただし、パラメトリックテストの仮定の違反に関するwhuberのコメントも正しいと思いますが、この場合、JWalkerの問題を修正すると、実際には名目上の誤検出が発生します。H0


1
標準のブートストラップでは、X1の係数のブートストラップ分布のみを考慮し、それに関連するp値は考慮しません。したがって、ブートストラップの問題ではありません。それにもかかわらず、あなたの観察は興味深く、直感的ではありません。
マイケルM

1
@MichaelM、それは本当です。しかし、リサンプル内のデータの結合CDFはnに収束する必要があり、ブートストラップの数は元のデータを生成した真のCDFまで反復するため、p値も異なるとは思わないでしょう。
ハーフ渡し

正しい。この影響は、観測値が独立しておらず(あなたが言ったように)、楽観的な標準エラーが発生していることに起因すると確信しています。シミュレーションでは、これは通常の線形モデルの唯一の違反された仮定のようです。たぶん、対応する分散収縮係数を導出することもできます。
マイケルM

2
方法1で明らかなことの1つは、iidエラー仮定の違反です。置換を使用してリサンプリングすると、任意の値の残差は独立ではなく完全に相関します。したがって、あなたは正しくブートストラップしていません、それだけです。デモとして、計算後にそれらを置き換えますが、以前とまったく同じように進めます。これは重複を正しく処理します(ただし、生成されるサンプルは小さくなります)。p値の均一な分布が得られます。xidsids <- unique(ids)
whuber

2
@whuber。そうですか。そして、それが、観察の繰り返しにもかかわらず、置換による残差の再サンプリングが機能する理由を説明します。そのモデルの残差は、再びXから独立しています。これを答えにしたい場合は、喜んで受け入れます。
ハーフパス

回答:


5

nullをリサンプルすると、回帰係数の期待値はゼロになります。観測されたデータセットをリサンプリングする場合、期待値はそのデータの観測された係数です。観測データをリサンプリングするときにP <= 0.05であれば、タイプIのエラーではありません。実際、P> 0.05の場合はタイプIIエラーです。

abs(b)とmean(P)の間の相関を計算することにより、直感を得ることができます。これは、あなたが行ったことを複製し、一連のシミュレーションでbと「タイプI」のエラー間の相関を計算するためのより単純なコードです。

boot.reps = 1000
n.sims.run = 10
n <- 1000
b <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
p <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
for(sim_j in 1:n.sims.run){
  x <- rnorm(n)
  y <- rnorm(n)
  inc <- 1:n
  for(boot_i in 1:boot.reps){
    fit <- lm(y[inc] ~ x[inc])
    b[boot_i, sim_j] <- abs(coefficients(summary(fit))['x[inc]', 'Estimate'])
    p[boot_i, sim_j] <- coefficients(summary(fit))['x[inc]', 'Pr(>|t|)']
    inc <- sample(1:n, replace=TRUE)
  }
}
# note this is not really a type I error but whatever
type1 <- apply(p, 2, function(x) sum(x <= 0.05))/boot.reps
# correlation between b and "type I"
cor(b[1, ], type1)

grand_chatによる回答の更新は、P <= 0.05の頻度が> 0.05である理由ではありません。答えは非常にシンプルで、私が上で述べたとおりです。各リサンプルの平均の期待値は、元の観測された平均です。これは、仮説検定としてではなく、観測された平均値に標準誤差/信頼限界を生成するために開発されたブートストラップの根拠です。期待値はゼロではないので、もちろん「タイプIエラー」はアルファよりも大きくなります。そして、これが、係数の大きさ(ゼロからの距離)と「タイプIエラー」のアルファからの偏差の大きさとの間に相関がある理由です。


H0:β=β^H0:β=0

H 0 β = 0 H 0 β = 0H0:β=βˆは等価性をテストし、別の研究設計アプローチを必要とします。は、重要なことは、観察された差異がフルークではないことを確認することであり、予測が正しいことを確認したい場合は同等です。残念ながら、1つのサイズですべてに当てはまると見なされることがよくありますが、状況によってはリスクによって異なります。初期段階の調査でを使用して、代替仮説を定義するのに十分な知識がない場合は、通常、を使用して、知識が正しいことをテストするように切り替えて、それがわかっている場合に切り替えることが理にかなっています。H0:β=0H0:β=0
ReneBt

2

元の通常のサンプルを置き換えてサンプリングした場合、結果のブートストラップサンプルは正常ではありません。ブートストラップサンプルの共同分布は、重複したレコードを含む可能性が非常に高い粗雑な混合分布に従いますが、正規分布からiidサンプルを取得すると、重複した値の確率はゼロになります。

単純な例として、元のサンプルが1変量正規分布からの2つの観測値である場合、置き換えられたブートストラップサンプルは、半分の時間は元のサンプルで構成され、半分の時間は複製された元の値の1つで構成されます。ブートストラップサンプルのサンプル分散は、平均して元の分散よりも小さいことは明らかです。実際、元の半分になります。

主な結果は、通常の理論に基づいて行っている推論が、ブートストラップサンプルに適用されると、誤った値を返すことです。特に、ブートストラップサンプルは重複が存在するために、分母が通常の理論で予想されるものよりも小さい統計を生成するため、通常の理論では反保守的な決定ルールが生成されます。その結果、通常の理論の仮説検定では、予想よりも帰無仮説が却下されます。tpt


しかし、これが当てはまる場合、置換で残差を再サンプリングするときに、まったく同じ問題が発生するのではないでしょうか。しかし実際には、そのアプローチはわずかな確率で拒否されます。
ハーフ渡し

また、n = 1000のt検定では、通常ではないデータで問題は発生しません。
ハーフ渡し

0

@JWalkerの回答に完全に同意します。

この問題には別の側面があります。それはあなたのリサンプリングプロセスです。独立していると仮定XYて独立しているため、回帰係数はゼロを中心とすることが予想されます。ただし、リサンプリングでは、

ids = sample( 1:nrow(d), replace=TRUE )
  b = d[ ids, ]

サンプリングXYているため、相関関係が作成されます。例えば、データセットの最初の行は言うdある(x1, y1)リサンプリングデータセットにおいて、P(Y = y1|X = x1) = 1もしながら、XそしてY独立しており、P(Y|X = x1)正規分布に従います。

これを修正する別の方法は、使用することです

b = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

dXとYを互いに独立させるために、生成に使用するのと同じコード。

同じ理由が、それが残留リサンプリングで機能する理由を説明しています(X新しいから独立しているためY)。


しばらくの間、私はまた、リサンプリング観測が非依存しないかもしれないと思ったが、多くのことを考える時、私は実際にこれが事実であるとは思わない:stats.stackexchange.com/questions/339237/...
半分

私が上で述べている問題はあなたの投稿とは異なります。あなたが言及したのはの独立ですx's。私が言及したのは、XsとYsの間の相関です。
Tianxia Zhou

-1

ここでの最大の問題は、モデルがノイズに適合しているだけなので、モデルの結果が偽であり、したがって非常に不安定であることです。非常に文字通りの意味で。Y1は、サンプルデータの生成方法により、従属変数ではありません。


コメントに応じて編集します。もう一度私の考えを説明してみましょう。

OLSの一般的な目的は、データの基になる関係を発見して定量化することです。現実のデータでは、通常それらを正確に知ることはできません。

しかし、これは人工的なテスト状況です。私たちは正確なデータ生成メカニズムを知っています。それは、OPによって投稿されたコードの中にあります。

X1 = rnorm(n = 1000)、Y1 = rnorm(n = 1000)

それをOLS回帰の一般的な形式で表現すると、

Y1 =切片+ベータ1 * X1 + Y1に
なるエラー
=平均(X1)+ 0(X1)+エラー

したがって、私の考えでは、これは線形FORMで表現されたモデルですが、傾斜がないため、実際には線形関係/モデルではありません。Beta1 = 0.000000。

1000個のランダムなデータポイントを生成すると、散布図は古典的なショットガン円形スプレーのようになります。生成された1000個のランダムポイントの特定のサンプルでX1とY1の間に何らかの相関関係がある可能性がありますが、そうである場合はランダムな偶然です。OLSが相関関係を見つけた場合、つまり勾配がないという帰無仮説を棄却した場合、これら2つの変数間に実際には関係がないことが明確にわかっているため、OLSは文字通りエラーコンポーネントのパターンを見つけました。私はそれを「ノイズに合わせる」と「偽物」として特徴付けました。

さらに、OLSのstdの仮定/要件の1つは、(+/-)「線形回帰モデルは「パラメーターが線形」であることです。データを考えると、私はその仮定を満たしていないと考えています。したがって、重要性の根底にある検定統計量は不正確です。直線性の仮定の違反が、ブートストラップの非直観的な結果の直接の原因であると私は信じています。

私がこの問題を最初に読んだとき、OPがnull [仮説]の下でテストするつもりだったという点で沈みませんでした。

しかし、データセットが次のように生成された場合、同じ非直感的な結果が発生しますか?

X1 = rnorm(n = 1000)、Y1 = X1 * .4 + rnorm(n = 1000)?


4
Y1Y1

(-1)@whuberが与えたのと同じ理由で。
ハーフ渡す

1
編集の最後の質問への応答:はい、間違いなく。シミュレーションで試してみてください。(ただし、ヌルとは何か、実際の状況は何かを考慮する必要があるため、解釈には注意してください。)
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.