फिर से तैयार किए गए डेटासेट पर परिकल्पना परीक्षण क्यों नल को अक्सर अस्वीकार करते हैं?


10

tl; dr: null के तहत जनरेट किए गए डेटासेट के साथ शुरू करके, मैंने मामलों को प्रतिस्थापन के साथ बदल दिया और प्रत्येक resamped डाटासेट पर एक परिकल्पना परीक्षण किया। ये परिकल्पना परीक्षण समय के 5% से अधिक को अस्वीकार करते हैं।

नीचे, बहुत सरल सिमुलेशन में, मैं साथ डेटासेट उत्पन्न करता हूं , और मैं प्रत्येक के लिए एक साधारण OLS मॉडल फिट करता हूं। फिर, प्रत्येक डाटासेट के लिए, मैं प्रतिस्थापन के साथ मूल डेटासेट की पंक्तियों को फिर से जमा करके 1000 नए डेटासेट उत्पन्न करता हूं (एक एल्गोरिथ्म जो विशेष रूप से डेविसन और हिंकले के क्लासिक पाठ में रैखिक प्रतिगमन के लिए उपयुक्त होने के रूप में वर्णित है)। उनमें से प्रत्येक के लिए, मैं एक ही ओएलएस मॉडल फिट करता हूं। अंत में, बूटस्ट्रैप नमूनों के भीतर लगभग 16% परिकल्पना परीक्षण अशक्त को अस्वीकार करते हैं , जबकि हमें 5% (जैसा कि हम मूल डेटासेट में करते हैं) मिलना चाहिए।XN(0,1)⨿YN(0,1)

मुझे संदेह था कि फुलाए गए संघों के कारण बार-बार टिप्पणियों के साथ कुछ करना है, इसलिए तुलना के लिए, मैंने नीचे दिए गए कोड में दो अन्य तरीकों की कोशिश की (टिप्पणी की)। विधि 2 में, मैं ठीक करता हूं , फिर मूल डेटासेट पर OLS मॉडल से resampled अवशिष्ट के साथ को प्रतिस्थापित करता हूं । विधि 3 में, मैं प्रतिस्थापन के बिना एक यादृच्छिक सदस्यता को आकर्षित करता हूं। ये दोनों विकल्प काम करते हैं, यानी, उनकी परिकल्पना परीक्षण समय के शून्य 5% को अस्वीकार करते हैं।वाईXY

मेरा प्रश्न: क्या मैं सही हूं कि बार-बार अवलोकनीय अपराधी हैं? यदि हां, तो यह देखते हुए कि यह बूटस्ट्रैपिंग के लिए एक मानक दृष्टिकोण है, जहां वास्तव में हम मानक बूटस्ट्रैप सिद्धांत का उल्लंघन कर रहे हैं?

अपडेट # 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 सही है कि समस्या यह है कि हमें तहत सही नमूना वितरण प्राप्त करने के लिए मूल डेटा के अनुमान से बूटस्ट्रैप आँकड़ों को केन्द्रित करने की आवश्यकता है । हालांकि, मुझे यह भी लगता है कि पैरामीट्रिक परीक्षण मान्यताओं का उल्लंघन करने के बारे में व्हिबर की टिप्पणी भी सही है, हालांकि इस मामले में हम वास्तव में नाममात्र की झूठी सकारात्मकता प्राप्त करते हैं जब हम जॉल्कर की समस्या को ठीक करते हैं।H0


1
मानक बूटस्ट्रैप में, आप केवल X1 के गुणांक के बूटस्ट्रैप वितरण पर विचार करेंगे, न कि इसके संबद्ध p मानों पर। इस प्रकार यह बूटस्ट्रैप की समस्या नहीं है। फिर भी आपका अवलोकन दिलचस्प और अचूक है।
माइकल एम

1
@ मायकिलम, यह सच है। लेकिन चूंकि resamples में डेटा के संयुक्त CDF को n में कनवर्ट करना चाहिए और बूटस्ट्रैप की संख्या सही CDF को पुनरावृत्त करती है, जो मूल डेटा उत्पन्न करता है, मैं पी-मानों के अलग-अलग होने की उम्मीद नहीं करूंगा।
अर्ध-पास

सही। मैं काफी निश्चित हूं कि प्रभाव गैर-स्वतंत्र होने के रूप में टिप्पणियों से आता है (जैसा कि आपने कहा), बहुत अधिक आशावादी मानक त्रुटियों की उपज। आपके अनुकरण में, यह सामान्य रैखिक मॉडल का एकमात्र उल्लंघन माना जाता है। हो सकता है कि हम संगत विचलन कारक को भी व्युत्पन्न कर सकें।
माइकल एम

2
विधि 1 में स्पष्ट एक बात आईआईडी त्रुटि धारणा का उल्लंघन है: जब प्रतिस्थापन के साथ फिर से जुड़ना, किसी भी दिए गए मान के लिए अवशिष्ट स्वतंत्र के बजाय पूरी तरह से सहसंबद्ध होते हैं ! इस प्रकार आप सही ढंग से बूटस्ट्रैपिंग नहीं कर रहे हैं, बस। एक प्रदर्शन के रूप में, कंप्यूटिंग के बाद उनकी जगह लेते हैं लेकिन पहले की तरह ही आगे बढ़ते हैं। यह सही ढंग से डुप्लिकेट को संभालता है (हालांकि यह एक छोटा नमूना बनाता है)। आपको पी-वैल्यू का एक समान वितरण मिलेगा। xidsids <- unique(ids)
whuber

2
@whuber। समझा। और यह व्याख्या करेगा कि बार-बार किए गए अवलोकनों के बावजूद प्रतिस्थापन कार्यों के साथ अवशेषों को फिर से जोड़ना क्यों: उस मॉडल के अवशेष एक बार फिर से X से स्वतंत्र होते हैं। यदि आप इसे उत्तर में बनाना चाहते हैं, तो मुझे यह स्वीकार करके खुशी होगी।
आधा पारित

जवाबों:


5

जब आप नल को फिर से खोलते हैं, तो प्रतिगमन गुणांक का अपेक्षित मान शून्य होता है। जब आप कुछ प्रेक्षित डेटासेट को फिर से खोलते हैं, तो अपेक्षित मान उस डेटा के लिए गुणांक होता है। यदि आप देखे गए डेटा को फिर से भेजते हैं तो यह एक प्रकार की त्रुटि नहीं है यदि P <= 0.05 है। वास्तव में, यदि आप P> 0.05 है तो यह एक टाइप II त्रुटि है।

आप एब्स (बी) और माध्य (पी) के बीच सहसंबंध की गणना करके कुछ अंतर्ज्ञान प्राप्त कर सकते हैं। यहाँ सरल है कि आपने जो किया है उसे दोहराने के लिए 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)

ग्रैंड_चैट द्वारा उत्तर को अपडेट करने का कारण पी <= 0.05 की आवृत्ति> 0.05 नहीं है। इसका उत्तर बहुत ही सरल है और जो मैंने ऊपर कहा है - प्रत्येक पुनःप्राप्ति के माध्य का अपेक्षित मान मूल, अवलोकित अर्थ है। यह बूटस्ट्रैप का पूरा आधार है, जो एक मनाया मतलब पर मानक त्रुटियों / विश्वास की सीमाओं को उत्पन्न करने के लिए विकसित किया गया था और एक परिकल्पना परीक्षण के रूप में नहीं। चूंकि उम्मीद शून्य नहीं है, निश्चित रूप से "टाइप I त्रुटि" अल्फा से अधिक होगी। और यही कारण है कि गुणांक के परिमाण (शून्य से कितनी दूर) और अल्फा से "टाइप I त्रुटि" के विचलन के परिमाण के बीच संबंध होगा।


Mmmmm। इसलिए हमें साथ परिकल्पना परीक्षण करना चाहिए , न कि मूल । यह समझ में आता है और मौजूदा साहित्य के अनुरूप है। मुझे कोशिश करनी होगी। एच 0 : β = 0H0:β=β^H0:β=0
आधे

एच 0 : β = 0 एच 0 : β = 0H0:β=βˆ तुल्यता के लिए परीक्षण और एक अलग अध्ययन डिजाइन दृष्टिकोण की आवश्यकता है। का उपयोग तब किया जाता है जब महत्वपूर्ण बात यह सुनिश्चित करने के लिए होती है कि आपके द्वारा देखे गए अंतर फ्लूक, समतुल्य नहीं हैं, जब आप यह सुनिश्चित करना चाहते हैं कि आपकी भविष्यवाणी सही है। दुर्भाग्य से इसे अक्सर एक आकार के रूप में देखा जाता है, लेकिन यह आपकी स्थिति में जोखिमों पर निर्भर करता है। प्रारंभिक चरण के शोध में का उपयोग करना विशिष्ट है, जब आप एक वैकल्पिक परिकल्पना को परिभाषित करने के लिए पर्याप्त नहीं जानते हैं, तब जब यह ज्ञात होता है कि आपके ज्ञान की शुद्धता का परीक्षण करने के लिए इसे बदलने का कोई मतलब हो सकता है। H0:β=0H0:β=0
रेनेबट

2

यदि आप अपने मूल सामान्य नमूने से प्रतिस्थापन के साथ नमूना करते हैं, तो परिणामस्वरूप बूटस्ट्रैप नमूना सामान्य नहीं है । बूटस्ट्रैप नमूने का संयुक्त वितरण एक ख़तरनाक मिश्रण वितरण का अनुसरण करता है जिसमें डुप्लिकेट रिकॉर्ड शामिल होने की बहुत अधिक संभावना होती है, जबकि सामान्य वितरण से आईआईडी नमूने लेने पर डुप्लिकेट मान शून्य होने की संभावना होती है।

एक सरल उदाहरण के रूप में, यदि आपका मूल नमूना एक अविभाज्य सामान्य वितरण से दो अवलोकन है, तो प्रतिस्थापन के साथ एक बूटस्ट्रैप नमूना मूल नमूना से आधे समय का होगा, और आधा समय मूल मानों में से एक, डुप्लिकेट किया जाएगा। यह स्पष्ट है कि बूटस्ट्रैप के नमूने का नमूना विचलन औसत से कम होगा - वास्तव में यह मूल से आधा होगा।

मुख्य परिणाम यह है कि जब आप सामान्य सिद्धांत पर आधारित होते हैं, तो बूटस्ट्रैप नमूने पर लागू होने पर गलत -values ​​वापस आ जाता है। विशेष रूप से सामान्य सिद्धांत एंटीकोन्सर्वेटिव निर्णय नियमों की पैदावार देता है, क्योंकि आपके बूटस्ट्रैप नमूने में आंकड़े उत्पन्न होंगे जिनके डुप्लिकेटर्स सामान्य सिद्धांत के तहत उम्मीद से छोटे होंगे, डुप्लिकेट की उपस्थिति के कारण। नतीजतन, सामान्य सिद्धांत परिकल्पना परीक्षण समाप्त होने की उम्मीद से अधिक अशक्त परिकल्पना को खारिज करता है।टीpt


लेकिन अगर यह मामला है, तो क्या हमें प्रतिस्थापन के साथ अवशेषों को फिर से जमा करते समय ठीक वैसी ही समस्या नहीं होगी? फिर भी वास्तव में, यह दृष्टिकोण नाममात्र संभावना के साथ अस्वीकार करता है।
आधा

इसके अलावा, n = 1000 के साथ एक टी-टेस्ट को गैर-सामान्य डेटा के साथ कोई समस्या नहीं होनी चाहिए।
आधी

0

मैं पूरी तरह से @ JWalker के जवाब से सहमत हूं।

इस समस्या का एक और पहलू है। यह आपके पुनः आरंभ करने की प्रक्रिया में है। आपको उम्मीद है कि प्रतिगमन गुणांक शून्य के आसपास केंद्रित होगा क्योंकि आप मानते हैं Xऔर Yस्वतंत्र हैं। हालाँकि, आपके resampling में आप करते हैं

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

जो सहसंबंध बनाता है क्योंकि आप नमूना बना रहे हैं Xऔर Yएक साथ हैं। उदाहरण के लिए, मान लें 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)।


कुछ समय के लिए, मैंने यह भी सोचा कि पुनर्निर्धारित अवलोकन गैर-स्वतंत्र हो सकते हैं, लेकिन इसके बारे में बहुत अधिक सोचने पर, मुझे वास्तव में ऐसा नहीं लगता कि यह मामला है: आंकड़े.stackexchange.com/questions/339237/…
आधा -पास

जो समस्या मैं ऊपर बता रहा हूं वह आपकी पोस्ट से अलग है। आपने जिसको संदर्भित किया वह स्वतंत्रता है x's। मैंने जो उल्लेख किया है वह Xs और Ys के बीच संबंध है ।
तियानक्सिया ज़ू

-1

यहां सबसे बड़ा मुद्दा यह है कि मॉडल के परिणाम बहुत ही अस्थिर होते हैं और इसलिए अत्यधिक अस्थिर होते हैं, क्योंकि मॉडल सिर्फ फिटिंग का शोर है। बहुत शाब्दिक अर्थों में। Y1 एक निर्भर चर नहीं है कि नमूना डेटा कैसे उत्पन्न किया गया था।


टिप्पणियों के जवाब में संपादित करें। मुझे अपनी सोच समझाने की एक और कोशिश करें।

एक ओएलएस के साथ सामान्य आशय डेटा में अंतर्निहित संबंधों की खोज करना और उन्हें निर्धारित करना है। वास्तविक दुनिया के आंकड़ों के साथ, हम आमतौर पर उन लोगों को नहीं जानते हैं।

लेकिन यह एक कृत्रिम परीक्षण की स्थिति है। हम EXACT डेटा जनरेटिंग मैकेनिज्म जानते हैं, यह ओपी इट द्वारा पोस्ट किए गए कोड में है

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

यदि हम उस OLS प्रतिगमन के परिचित रूप में व्यक्त करते हैं, अर्थात

Y1 = इंटरसेप्ट + Beta1 * X1 + एरर
जो
Y1 = mean (X1) + 0 (X1) + एरर बनता है

तो मेरे दिमाग में, यह रैखिक FORM में व्यक्त एक मॉडल है, लेकिन यह वास्तव में रैखिक संबंध / मॉडल नहीं है, क्योंकि कोई ढलान नहीं है। Beta1 = .०,००,०००।

जब हम 1000 यादृच्छिक डेटा बिंदु उत्पन्न करते हैं, तो स्कैल्पलॉट क्लासिक शॉटगन परिपत्र स्प्रे की तरह दिखने वाला है। 1000 यादृच्छिक बिंदुओं के विशिष्ट नमूने में X1 और Y1 के बीच कुछ सहसंबंध हो सकता है जो उत्पन्न हुआ था, लेकिन यदि ऐसा है तो यह यादृच्छिक घटना है। यदि ओएलएस एक सहसंबंध खोजता है, अर्थात, शून्य परिकल्पना को अस्वीकार करता है कि कोई ढलान नहीं है, क्योंकि हम निश्चित रूप से जानते हैं कि इन दो चर के बीच वास्तव में कोई संबंध नहीं है, तो ओएलएस का शाब्दिक रूप से त्रुटि घटक में एक पैटर्न मिला है। मैंने कहा कि "शोर को ढाला" और "सहज"।

इसके अलावा, एक OLS की std मान्यताओं / आवश्यकताओं में से एक यह है कि (+/-) "रैखिक प्रतिगमन मॉडल" मापदंडों में रैखिक है। " आंकड़ों को देखते हुए, मेरा मानना ​​यह है कि हम उस धारणा को पूरा नहीं करते हैं। इसलिए महत्व के लिए अंतर्निहित परीक्षण के आंकड़े गलत हैं। मेरा मानना ​​है कि रैखिकता धारणा का उल्लंघन बूटस्ट्रैप के गैर-सहज परिणामों का प्रत्यक्ष कारण है।

जब मैंने पहली बार इस समस्या को पढ़ा, तो इसमें यह नहीं डूबा था कि ओपी अशक्त [परिकल्पना] के तहत परीक्षण करना चाहता था।

लेकिन वही गैर-सहज परिणाम होगा जो डेटासेट के रूप में उत्पन्न किया गया था

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


4
मुझे लगता है कि यह जवाब हर लिहाज से गलत है। परिणाम न तो "सहज" हैं - जब तक आपको नहीं लगता कि ओएलएस एक बुरा प्रक्रिया है - और न ही वे त्रुटि विचरण से भविष्यवाणी की गई "अस्थिर" हैं। निश्चित रूप से एक आश्रित चर है: सिद्धांत में कहीं भी, कोई आवश्यकता नहीं है, कि का अन्य चर के साथ कुछ कारण संबंध है। वास्तव में, पारंपरिक रूप से सभी प्रतिगमन सॉफ्टवेयर द्वारा परीक्षण किए गए अशक्त परिकल्पना यह है कि यहाँ कोई निर्भरता नहीं है - ठीक उसी तरह जैसे कि नकली है। Y1Y1
whuber

(-1) उन्हीं कारणों से @whuber ने दिया।
आधा पास

1
आपके संपादन में अंतिम प्रश्न का उत्तर: हाँ, निश्चित रूप से। इसे अनुकरण के साथ स्वयं आज़माएँ। (लेकिन व्याख्या के बारे में सावधान रहें, क्योंकि आपको विचार करना है कि अशक्त क्या है और मामलों की वास्तविक स्थिति क्या है।)
व्ह्यूबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.