Mengapa tes hipotesis pada dataset yang resampled terlalu sering menolak null?

10

tl; dr: Dimulai dengan dataset yang dihasilkan di bawah nol, saya melakukan resampled case dengan penggantian dan melakukan tes hipotesis pada setiap dataset yang di-resampled. Tes hipotesis ini menolak nol lebih dari 5% dari waktu.

Di bawah ini, simulasi yang sangat sederhana, saya menghasilkan dataset dengan , dan saya memasangkan model OLS sederhana untuk masing-masingnya. Kemudian, untuk setiap dataset, saya menghasilkan 1000 dataset baru dengan resampling baris dataset asli dengan penggantian (suatu algoritma yang secara khusus dijelaskan dalam teks klasik Davison & Hinkley sebagai yang sesuai untuk regresi linier). Untuk masing-masing, saya cocok dengan model OLS yang sama. Pada akhirnya, sekitar 16% dari tes hipotesis dalam sampel bootstrap menolak nol , sedangkan kita harus mendapatkan 5% (seperti yang kita lakukan dalam dataset asli).XN(0,1)⨿YN(0,1)

Saya menduga itu ada hubungannya dengan pengamatan berulang yang menyebabkan asosiasi meningkat, jadi untuk perbandingan, saya mencoba dua pendekatan lain dalam kode di bawah ini (berkomentar). Dalam Metode 2, saya memperbaiki , kemudian mengganti dengan residu resampled dari model OLS pada dataset asli. Dalam Metode 3, saya menggambar subsampel acak tanpa penggantian. Kedua alternatif ini bekerja, yaitu, tes hipotesis mereka menolak nol 5% dari waktu.YXY

Pertanyaan saya: Apakah saya benar bahwa pengamatan berulang adalah pelakunya? Jika demikian, mengingat bahwa ini adalah pendekatan standar untuk bootstrap, di mana tepatnya kita melanggar teori bootstrap standar?

Pembaruan # 1: Lebih banyak simulasi

Aku mencoba skenario yang lebih sederhana, model regresi intercept-hanya untuk . Masalah yang sama terjadi.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)

Pembaruan # 2: Jawabannya

Beberapa kemungkinan diajukan dalam komentar dan jawaban, dan saya melakukan lebih banyak simulasi untuk mengujinya secara empiris. Ternyata JWalker benar bahwa masalahnya adalah kami harus memusatkan statistik bootstrap dengan perkiraan data asli untuk mendapatkan distribusi sampel yang benar di bawah . Namun, saya juga berpikir bahwa komentar Whuber tentang melanggar asumsi tes parametrik juga benar, meskipun dalam kasus ini kita benar-benar mendapatkan positif palsu nominal ketika kita memperbaiki masalah JWalker.H0

setengah lulus
sumber
1
Dalam bootstrap standar, Anda hanya akan mempertimbangkan distribusi bootstrap dari koefisien X1, bukan nilai p yang terkait. Jadi itu bukan masalah bootstrap. Namun demikian pengamatan Anda menarik dan tidak intuitif.
Michael M
1
@MichaelM, itu benar. Tetapi karena CDF gabungan dari data dalam sampel harus konvergen dalam n dan jumlah bootstrap iterates ke CDF sebenarnya yang menghasilkan data asli, saya tidak akan mengharapkan nilai-p berbeda juga.
setengah jalan
Baik. Saya cukup yakin efeknya berasal dari pengamatan yang tidak independen (seperti yang Anda katakan), menghasilkan kesalahan standar terlalu optimis. Dalam simulasi Anda, itu tampaknya menjadi satu-satunya asumsi yang dilanggar dari model linear normal. Mungkin kita bahkan dapat menurunkan faktor deflasi yang sesuai.
Michael M
2
Satu hal yang jelas dalam Metode 1 adalah pelanggaran asumsi kesalahan iid: ketika melakukan resampling dengan penggantian, residu untuk setiap nilai diberikan berkorelasi sempurna daripada independen! Jadi Anda tidak bootstrap dengan benar, itu saja. Sebagai demonstrasi, setelah komputasi ganti dengan tetapi lanjutkan persis seperti sebelumnya. Itu benar menangani duplikat (meskipun menghasilkan sampel yang lebih kecil). Anda akan mendapatkan distribusi nilai-p yang seragam. xidsids <- unique(ids)
whuber
2
@whuber. Saya melihat. Dan itu akan menjelaskan mengapa resampling residu dengan pekerjaan pengganti meskipun pengamatan berulang: residual dari model itu sekali lagi independen dari X. Jika Anda ingin membuat ini menjadi jawaban, saya akan dengan senang hati menerima.
setengah lulus

Jawaban:

5

Saat Anda membuat ulang nol, nilai yang diharapkan dari koefisien regresi adalah nol. Saat Anda melakukan pengujian ulang beberapa dataset yang diamati, nilai yang diharapkan adalah koefisien yang diamati untuk data tersebut. Ini bukan kesalahan tipe I jika P <= 0,05 ketika Anda melakukan resample terhadap data yang diamati. Faktanya, ini adalah kesalahan tipe II jika Anda memiliki P> 0,05.

Anda bisa mendapatkan beberapa intuisi dengan menghitung korelasi antara abs (b) dan mean (P). Berikut adalah kode yang lebih sederhana untuk mereplikasi apa yang Anda lakukan plus menghitung korelasi antara b dan "tipe I" kesalahan pada set simulasi

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)

memperbarui jawaban oleh grand_chat bukan alasan frekuensi P <= 0,05 adalah> 0,05. Jawabannya sangat sederhana dan apa yang saya katakan di atas - nilai yang diharapkan dari rata-rata setiap sampel adalah yang asli, yang diamati. Ini adalah dasar keseluruhan dari bootstrap, yang dikembangkan untuk menghasilkan kesalahan standar / batas kepercayaan pada rata-rata yang diamati dan bukan sebagai tes hipotesis. Karena harapannya tidak nol, tentu saja "kesalahan tipe I" akan lebih besar dari alpha. Dan inilah mengapa akan ada korelasi antara besarnya koefisien (seberapa jauh dari nol) dan besarnya penyimpangan "kesalahan tipe I" dari alpha.

JWalker
sumber
H0:β=β^H0:β=0
H 0 : β = 0 H 0 : β = 0H0:β=βˆ menguji kesetaraan dan membutuhkan pendekatan desain penelitian yang berbeda. digunakan ketika yang penting adalah untuk memastikan perbedaan yang Anda amati tidak kebetulan, ekuivalen ketika Anda ingin memastikan prediksi Anda benar. Sayangnya itu sering dilihat sebagai satu ukuran cocok untuk semua, tetapi itu tergantung pada risiko dalam situasi Anda. Biasanya menggunakan dalam penelitian tahap awal untuk menyaring cacing ketika Anda tidak cukup tahu untuk menentukan hipotesis alternatif, maka ketika lebih banyak diketahui mungkin masuk akal untuk berubah untuk menguji kebenaran pengetahuan Anda. H0:β=0H0:β=0
ReneBt
2

Jika Anda sampel dengan penggantian dari sampel normal asli Anda, sampel bootstrap yang dihasilkan tidak normal . Distribusi gabungan dari sampel bootstrap mengikuti distribusi campuran degil yang sangat mungkin berisi catatan duplikat, sedangkan nilai duplikat memiliki probabilitas nol ketika Anda mengambil sampel pertama dari distribusi normal.

Sebagai contoh sederhana, jika sampel asli Anda adalah dua pengamatan dari distribusi normal univariat, maka sampel bootstrap dengan penggantian akan separuh waktu terdiri dari sampel asli, dan separuh waktu akan terdiri dari salah satu nilai asli, digandakan. Jelas bahwa varians sampel dari sampel bootstrap akan rata-rata kurang dari aslinya - pada kenyataannya itu akan menjadi setengah dari aslinya.

Konsekuensi utama adalah bahwa kesimpulan yang Anda lakukan berdasarkan teori normal mengembalikan nilai salah ketika diterapkan pada sampel bootstrap. Secara khusus teori normal menghasilkan aturan keputusan antikonservatif, karena sampel bootstrap Anda akan menghasilkan statistik yang penyebutnya lebih kecil dari yang diharapkan dalam teori normal, karena adanya duplikat. Akibatnya, tes hipotesis teori normal akhirnya menolak hipotesis nol lebih dari yang diharapkan.thalt

grand_chat
sumber
Tetapi jika ini masalahnya, bukankah kita akan memiliki masalah yang sama persis ketika resampling residu dengan penggantian? Namun pada kenyataannya, pendekatan itu menolak dengan probabilitas nominal.
setengah jalan
Juga, uji-t dengan n = 1000 seharusnya tidak memiliki masalah dengan data yang tidak normal.
setengah jalan
0

Saya sangat setuju dengan jawaban @ JWalker.

Ada aspek lain dari masalah ini. Itu dalam proses resampling Anda. Anda mengharapkan koefisien regresi berpusat di sekitar nol karena Anda berasumsi Xdan Yindependen. Namun, dalam resampling Anda lakukan

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

yang menciptakan korelasi karena Anda mengambil sampel Xdan Ybersama - sama. Sebagai contoh, katakanlah baris pertama dataset dadalah (x1, y1), Dalam dataset yang di-resampled P(Y = y1|X = x1) = 1,, sedangkan jika Xdan Yindependen, P(Y|X = x1)mengikuti distribusi normal.

Jadi cara lain untuk memperbaikinya adalah menggunakan

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

kode yang sama yang Anda gunakan untuk menghasilkan d, untuk membuat X dan Y saling bebas satu sama lain.

Alasan yang sama menjelaskan mengapa ia bekerja dengan resampling residual (karena Xtidak tergantung dari yang baru Y).

Tianxia Zhou
sumber
Untuk sementara, saya juga berpikir bahwa pengamatan yang dilakukan kembali mungkin tidak independen, tetapi setelah memikirkannya lebih banyak, saya sebenarnya tidak berpikir ini yang terjadi: stats.stackexchange.com/questions/339237/…
setengah -lewati
Masalah yang saya jelaskan di atas berbeda dari posting Anda. Apa yang Anda maksudkan adalah independensi x's. Yang saya maksudkan adalah korelasi antara Xs dan Ys.
Tianxia Zhou
-1

Masalah terbesar di sini adalah bahwa hasil model palsu dan karenanya sangat tidak stabil, karena model ini hanya pas kebisingan. Dalam arti yang sangat harfiah. Y1 bukan variabel dependen karena bagaimana data sampel dihasilkan.


Sunting, sebagai tanggapan atas komentar. Biarkan saya mencoba menjelaskan pemikiran saya.

Dengan OLS, maksud umum adalah untuk menemukan dan mengukur hubungan yang mendasari dalam data. Dengan data dunia nyata, kita biasanya tidak tahu persisnya.

Tapi ini adalah situasi ujian buatan. Kita tahu mekanisme penghasil data EXACT, itu ada di sana dalam kode yang diposting oleh OP

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

Jika kita menyatakan itu dalam bentuk regresi OLS yang dikenal, yaitu

Y1 = mencegat + Beta1 * X1 + Kesalahan
yang menjadi
Y1 = rata-rata (X1) + 0 (X1) + Kesalahan

Jadi dalam pikiran saya, ini adalah model yang dinyatakan dalam FORMULIR linier, tetapi sebenarnya BUKAN hubungan / model linier, karena tidak ada kemiringan. Beta1 = 0,000000.

Saat kami menghasilkan 1000 titik data acak, scatterplot akan terlihat seperti semprotan senapan klasik. Mungkin ada beberapa korelasi antara X1 dan Y1 dalam sampel spesifik 1000 poin acak yang dihasilkan, tetapi jika demikian itu adalah kejadian acak. Jika OLS memang menemukan korelasi, yaitu, menolak hipotesis nol bahwa tidak ada kemiringan, karena kita tahu pasti bahwa sebenarnya tidak ada hubungan antara kedua variabel ini, maka OLS secara harfiah menemukan pola dalam Komponen Kesalahan. Saya mencirikan itu sebagai "menyesuaikan kebisingan" dan "palsu."

Selain itu, salah satu asumsi / persyaratan pertama dari OLS adalah bahwa (+/-) "model regresi linier adalah" parameter linier. " Berdasarkan data, pendapat saya adalah bahwa kita tidak memenuhi asumsi itu. Oleh karena itu statistik uji dasar untuk signifikansi tidak akurat. Keyakinan saya adalah bahwa pelanggaran asumsi linearitas adalah penyebab langsung dari hasil non-intuitif dari bootstrap.

Ketika saya pertama kali membaca masalah ini, tidak tenggelam bahwa OP bermaksud menguji di bawah [hipotesis] nol.

Tetapi apakah hasil non-intuitif yang sama akan terjadi jika dataset dihasilkan

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

Doug Dame
sumber
4
Y1Y1
(-1) untuk alasan yang sama @whuber memberi.
setengah jalan
1
Menanggapi pertanyaan terakhir dalam hasil edit Anda: ya, pasti. Cobalah sendiri dengan simulasi. (Tetapi berhati-hatilah dengan penafsiran, karena Anda harus mempertimbangkan apa itu null dan bagaimana keadaan sebenarnya.)
whuber