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).
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.Y
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.
# 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.
sumber
ids
ids <- unique(ids)
Jawaban:
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
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.
sumber
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.thal t
sumber
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
X
danY
independen. Namun, dalam resampling Anda lakukanyang menciptakan korelasi karena Anda mengambil sampel
X
danY
bersama - sama. Sebagai contoh, katakanlah baris pertama datasetd
adalah(x1, y1)
, Dalam dataset yang di-resampledP(Y = y1|X = x1) = 1
,, sedangkan jikaX
danY
independen,P(Y|X = x1)
mengikuti distribusi normal.Jadi cara lain untuk memperbaikinya adalah menggunakan
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
X
tidak tergantung dari yang baruY
).sumber
x's
. Yang saya maksudkan adalah korelasi antaraX
s danY
s.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
Jika kita menyatakan itu dalam bentuk regresi OLS yang dikenal, yaitu
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
sumber