tl; dr: শূন্যের নীচে উত্পন্ন ডেটাসেট দিয়ে শুরু করে আমি প্রতিস্থাপনের সাথে কেসগুলি পুনরায় প্রতিস্থাপন করেছি এবং প্রতিটি পুনরায় মডেল করা ডেটাসেটের জন্য হাইপোথিসিস পরীক্ষা চালিয়েছি। এই অনুমান পরীক্ষাগুলি নালটিকে সময়ের 5% এরও বেশি প্রত্যাখ্যান করে।
নীচে, খুব সাধারণ সিমুলেশনটিতে, আমি দিয়ে ডেটাসেট তৈরি করি এবং আমি প্রত্যেকের কাছে একটি সাধারণ ওএলএস মডেল ফিট করি। তারপরে, প্রতিটি ডেটাসেটের জন্য, আমি প্রতিস্থাপনের সাথে মূল ডেটাসেটের সারিগুলিকে পুনরায় মডেল করে 1000 টি নতুন ডেটাসেট তৈরি করি (ল্যাভিনির্ভরতার জন্য উপযুক্ত হিসাবে ডেভিসন এবং হিঙ্কলির ক্লাসিক পাঠ্যে বিশেষত বর্ণিত একটি অ্যালগরিদম)। তাদের প্রত্যেকের জন্য, আমি একই ওএলএস মডেল ফিট করি। শেষ পর্যন্ত, বুটস্ট্র্যাপের নমুনাগুলির মধ্যে প্রায় 16% হাইপোথিসিস পরীক্ষাগুলি নালটিকে প্রত্যাখ্যান করে , যেখানে আমাদের 5% পাওয়া উচিত (যেমন আমরা মূল ডেটাসেটগুলিতে করি)।
আমার সন্দেহ হয়েছিল যে এটি বারবার পর্যবেক্ষণগুলির সাথে স্ফীত সংঘবদ্ধতাগুলির সাথে কিছু করার আছে, তাই তুলনা করার জন্য, আমি নীচের কোডটিতে অন্য দুটি পদ্ধতির চেষ্টা করেছি (মন্তব্য করেছেন)। পদ্ধতি 2, আমি ঠিক , তারপর প্রতিস্থাপন মূল ডেটা সেটটি উপর OLS ঔজ্জ্বল্যের প্রেক্ষাপটে মডেল থেকে resampled অবশিষ্টাংশ সঙ্গে। পদ্ধতি 3 এ, আমি প্রতিস্থাপন ছাড়াই একটি এলোমেলো সাবমেল আঁকছি। এই দুটি বিকল্পই কাজ করে, অর্থাত্ তাদের অনুমান পরীক্ষাগুলি নাল 5% সময়কে প্রত্যাখ্যান করে।ওয়াই
আমার প্রশ্ন: আমি কি ঠিক বলেছি যে বারবার পর্যবেক্ষণগুলি অপরাধী? যদি তাই হয় তবে বুটস্ট্র্যাপিংয়ের ক্ষেত্রে এটি একটি স্ট্যান্ডার্ড পদ্ধতি, আমরা যেখানে স্ট্যান্ডার্ড বুটস্ট্র্যাপ তত্ত্বটি লঙ্ঘন করছি?
আপডেট # 1: আরও সিমুলেশন
আমি আরও সহজ দৃশ্যের চেষ্টা করেছি, জন্য একটি ইন্টারসেপ্ট-কেবলমাত্র রিগ্রেশন মডেল । একই সমস্যা দেখা দেয়।
# 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: উত্তর
মন্তব্য এবং উত্তরগুলিতে বেশ কয়েকটি সম্ভাবনার প্রস্তাব দেওয়া হয়েছিল এবং আমি সেগুলি পরীক্ষামূলকভাবে পরীক্ষা করার জন্য আরও সিমুলেশন করেছি। দেখা যাচ্ছে যে জেওয়ালকার সঠিক যে সমস্যাটি হ'ল অধীনে সঠিক নমুনা বিতরণ পেতে আমাদের মূল ডেটা অনুমানের মাধ্যমে বুটস্ট্র্যাপের পরিসংখ্যানকে কেন্দ্র করে নেওয়া । তবে আমি এটিও মনে করি যে প্যারামেট্রিক পরীক্ষার অনুমান লঙ্ঘন সম্পর্কে ভুবার মন্তব্যটিও সঠিক, যদিও জেওয়ালকারের সমস্যাটি সমাধান করার পরে আমরা বাস্তবে নামমাত্র ভ্রান্ত ধনাত্মকতা পাই।
ids
ids <- unique(ids)