दो साधनों के अंतर के लिए एक परीक्षण करने के लिए H0 के तहत बूटस्ट्रैप का उपयोग करना: समूहों में या पूल किए गए नमूने के भीतर प्रतिस्थापन


18

मान लीजिए कि मेरे पास दो स्वतंत्र समूहों के साथ एक डेटा है:

g1.lengths <- c (112.64, 97.10, 84.18, 106.96, 98.42, 101.66)

g2.lengths <- c (84.44, 82.10, 83.26, 81.02, 81.86, 86.80, 
                     85.84, 97.08, 79.64, 83.32, 91.04, 85.92,
                     73.52, 85.58, 97.70, 89.72, 88.92, 103.72,
                     105.02, 99.48, 89.50, 81.74)

group = rep (c ("g1", "g2"), c (length (g1.lengths), length (g2.lengths)))

lengths = data.frame( lengths = c(g1.lengths, g2.lengths), group)

यह स्पष्ट है कि प्रति समूह का नमूना आकार पक्षपाती है जहां जी 1 में 6 अवलोकन हैं और जी 2 में 22 हैं । पारंपरिक एनोवा का सुझाव है कि समूहों के अलग-अलग साधन हैं जब महत्वपूर्ण मान 0.05 पर सेट है (पी मान 0.0044 है )।

summary (aov (lengths~group, data = lengths))  

यह देखते हुए कि मेरा उद्देश्य अंतर अंतर की तुलना करना है, इस तरह के असंतुलित और छोटे नमूना डेटा पारंपरिक दृष्टिकोण के साथ अनुचित परिणाम दे सकते हैं। इसलिए, मैं क्रमपरिवर्तन परीक्षण और बूटस्ट्रैप करना चाहता हूं।

सत्यापन परीक्षण

नल की परिकल्पना (H0) बताती है कि समूह के साधन समान हैं। क्रमपरिवर्तन परीक्षण में यह धारणा समूहों को एक नमूने में रखना उचित है। यह सुनिश्चित करता है कि समान वितरण से दो समूहों के नमूने लिए गए थे। पूल किए गए डेटा से बार-बार नमूना (या अधिक सटीक रूप से फेरबदल) करके, नए तरीकों से नमूनों को वास्तविक रूप से फेरबदल (फेरबदल) किया जाता है, और परीक्षण आँकड़ों की गणना की जाती है। इस n समय को निष्पादित करते हुए, परीक्षण के आँकड़ों का नमूना वितरण उस धारणा के तहत किया जाएगा जहाँ H0 TRUE है। अंत में, H0 के तहत, p मान प्रायिकता है कि परीक्षण आँकड़ा बराबर है या देखे गए मान से अधिक है।

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.p <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.p <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool))

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.p[i] = mean (g1.perm) - mean (g2.perm) 
}
p.permute <- (sum (abs (sampl.dist.p) >= abs(obs.diff.p)) + 1)/ (iterations+1)

क्रमोन्नत परीक्षण का रिपोर्ट किया गया मान 0.0053 है । ठीक है, अगर मैंने इसे सही तरीके से किया, तो क्रमपरिवर्तन और पैरामीट्रिक एनोवा लगभग समान परिणाम देते हैं।

बूटस्ट्रैप

सबसे पहले, मुझे पता है कि नमूना आकार बहुत छोटा होने पर बूटस्ट्रैप मदद नहीं कर सकता है। इस पोस्ट से पता चला कि यह और भी बुरा और भ्रामक हो सकता है । इसके अलावा, दूसरे ने कहा कि परिकल्पना परीक्षण आम तौर पर बूटस्ट्रैप से बेहतर होता है जब परिकल्पना परीक्षण मुख्य उद्देश्य होता है। बहरहाल, यह महान पोस्ट कंप्यूटर-गहन तरीकों के बीच महत्वपूर्ण अंतर को संबोधित करता है। हालांकि, यहां मैं एक अलग सवाल उठाना चाहता हूं (मेरा मानना ​​है)।

मुझे सबसे पहले बूटस्ट्रैप दृष्टिकोण से परिचित कराएं (बूटस्ट्रैप 1: पूल किए गए नमूने के भीतर फिर से खोलना ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b1 <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.b1 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool), replace = TRUE) 
        # "replace = TRUE" is the only difference between bootstrap and permutations

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.b1[i] = mean (g1.perm) - mean (g2.perm) 
}
p.boot1 <- (sum (abs (sampl.dist.b1) >= obs.diff.b1) + 1)/ (iterations+1)

इस तरह से बूटस्ट्रैप का P मान 0.005 है । यहां तक ​​कि यह उचित और लगभग पैरामीट्रिक एनोवा और क्रमपरिवर्तन परीक्षण के समान लगता है, क्या इस बूटस्ट्रैप में H0 को इस आधार पर सही ठहराना उचित है कि हम केवल नमूनों को जमा करते हैं जिससे हमने बाद के नमूने खींचे हैं?

कई वैज्ञानिक पत्रों में मुझे अलग-अलग दृष्टिकोण मिले। विशेष रूप से, मैंने देखा कि बूटस्ट्रैप से पहले H0 को पूरा करने के लिए शोधकर्ताओं ने डेटा को संशोधित किया। आसपास खोज करने पर, मुझे CV में बहुत ही दिलचस्प पोस्ट मिली है जहाँ @ jan.s ने पोस्ट प्रश्न में बूटस्ट्रैप के असामान्य परिणामों के बारे में बताया जहाँ उद्देश्य दो साधनों की तुलना करना था। हालाँकि, उस पोस्ट में यह नहीं दिखाया गया है कि बूटस्ट्रैप कैसे करें जब बूटस्ट्रैप से पहले डेटा को संशोधित किया जाए। दृष्टिकोण जहां डेटा को बूटस्ट्रैप से पहले संशोधित किया गया है वह इस तरह दिखता है:

  1. H0 बताता है कि दो समूहों के साधन समान हैं
  2. अगर हम अलग किए गए नमूने के माध्यम से व्यक्तिगत टिप्पणियों को घटाते हैं तो H0 सही है

इस मामले में, डेटा के संशोधन का मतलब समूहों को प्रभावित करना चाहिए, और इसलिए इसका अंतर, लेकिन समूहों के भीतर (और बीच में) भिन्नता नहीं।

  1. संशोधित डेटा आगे के बूटस्ट्रैप के लिए आधार होगा, जिसमें केवेट्स के साथ नमूनाकरण प्रत्येक समूह के भीतर अलग-अलग किया जाता है ।
  2. जी 1 और जी 2 के बूटस्ट्रैप्ड माध्य के बीच अंतर की गणना की जाती है और समूहों के बीच मनाया (गैर-संशोधित) अंतर के साथ तुलना की जाती है।
  3. पुनरावृत्ति की संख्या से विभाजित एक से अधिक या अधिक चरम मूल्यों का अनुपात पी मान देगा।

यहाँ कोड है (बूटस्ट्रैप 2: H0 TRUE के संशोधन के बाद समूहों के भीतर पुनः साझा करना ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b2 <- mean (g1.lengths) - mean (g2.lengths)

# make H0 to be true (no difference between means of two groups)
H0 <- pool - mean (pool)

# g1 from H0 
g1.H0 <- H0[1:s.size.g1] 

# g2 from H0
g2.H0 <- H0[(s.size.g1+1):length(pool)]

iterations <- 10000
sampl.dist.b2 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        # Sample with replacement in g1
        g1.boot = sample (g1.H0, replace = T)

        # Sample with replacement in g2
        g2.boot = sample (g2.H0, replace = T)

        # bootstrapped difference
        sampl.dist.b2[i] <- mean (g1.boot) - mean (g2.boot)  
}
p.boot2 <- (sum (abs (sampl.dist.b2) >= obs.diff.b2) + 1)/ (iterations+1)

इस तरह का प्रदर्शन बूटस्ट्रैप 0.514 का पी मूल्य देगा जो पिछले परीक्षणों की तुलना में काफी भिन्न है। मेरा मानना ​​है कि इसके लिए @ j.s के स्पष्टीकरण से निपटना होगा , लेकिन मैं यह पता नहीं लगा सकता कि कुंजी कहां है ...


1
दिलचस्प समस्या है और अच्छी तरह से प्रस्तुत किया। बूटस्ट्रैप में समस्याएं हैं जब नमूना आकार केवल बहुत छोटा है, क्योंकि मूल नमूना बहुत अच्छी तरह से आबादी का प्रतिनिधित्व नहीं करने की अधिक संभावना है। बूटस्ट्रैप के काम करने के लिए नमूना का आकार बहुत बड़ा नहीं होना चाहिए। 6 और 22 के आपके नमूने का आकार उतना बुरा नहीं हो सकता है। Efron (1983) के एक पेपर में बूटस्ट्रैप की तुलना सीवी के एक रूप से की गई थी, जिसमें 2 वर्गों के साथ वर्गीकरण समस्याओं में रैखिक विभेदक कार्यों के लिए त्रुटि दर का अनुमान लगाया गया था, जहाँ प्रत्येक प्रशिक्षण नमूना आकार 10. से कम है। मैं इसे अपनी पुस्तक बूटस्ट्रैप मेथड्स में कवर करता हूं ( 2007)।
माइकल आर। चेरनिक

2
मेरी किताब में एक अध्याय भी है जब बूटस्ट्रैप विफल हो जाता है और इसमें छोटे नमूने के आकार के मुद्दे की चर्चा शामिल है।
माइकल आर। चेरनिक

यह काम करने के लिए आपको अपने बूटस्ट्रैप # 2 दृष्टिकोण में तय करने वाली एकल पंक्ति यह है H0 <- pool - mean (pool):। इसे बदलने की जरूरत है H0 <- c(g1.lengths - mean(g1.lengths), g2.lengths - mean(g2.lengths))। फिर आपको 0.0023 का पी-वैल्यू मिलेगा। (यह वही बात है जिसे ज़ीनत ने अपने जवाब में समझाया था।) यह सब कुछ है, कोड में बस एक साधारण बग है। CC to @MichaelChernick
amoeba का कहना है कि मोनिका

क्या इन तरीकों को लागू किया जा सकता है? मेरा मतलब है कि क्या वे किसी महत्वपूर्ण अंतर का पता लगा सकते हैं, जब समूह बहुत बड़े हैं: पूल> 43k।
एलेक्स अल्वारेज़ पेरेज़

जवाबों:


17

एफ़रोन और टिब्शिरानी के एन इंट्रोडक्शन टू द बूटस्ट्रैप (पृष्ठ 220-224) के अध्याय 16 पर आधारित इस पर मेरा विचार है। इसकी कमी यह है कि आपका दूसरा बूटस्ट्रैप एल्गोरिथ्म गलत तरीके से लागू किया गया था, लेकिन सामान्य विचार सही है।

बूटस्ट्रैप परीक्षण आयोजित करते समय, किसी को यह सुनिश्चित करना होता है कि पुन: नमूनाकरण विधि डेटा उत्पन्न करती है जो अशक्त परिकल्पना से मेल खाती है। मैं इस पोस्ट का वर्णन करने के लिए R में स्लीप डेटा का उपयोग करूँगा। ध्यान दें कि मैं केवल साधन के अंतर के बजाय छात्र परीक्षण सांख्यिकीय का उपयोग कर रहा हूं, जो कि पाठ्यपुस्तक द्वारा अनुशंसित है।

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

x <- sleep$extra[sleep$group==1] y <- sleep$extra[sleep$group==2]
t.test(x,y)
t = -1.8608, df = 17.776, p-value = 0.07939

n1n2

# pooled sample, assumes equal variance
pooled <- c(x,y)
for (i in 1:10000){
  sample.index <- sample(c(1:length(pooled)),replace=TRUE)
  sample.x <- pooled[sample.index][1:length(x)]
  sample.y <- pooled[sample.index][-c(1:length(y))]
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.pooled <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1) 
p.pooled
[1] 0.07929207

H0H0H0z¯

x~i=xix¯+z¯
y~i=yiy¯+z¯

x~/y~z¯H0

# sample from H0 separately, no assumption about equal variance
xt <- x - mean(x) + mean(sleep$extra) #
yt <- y - mean(y) + mean(sleep$extra)

boot.t <- c(1:10000)
for (i in 1:10000){
  sample.x <- sample(xt,replace=TRUE)
  sample.y <- sample(yt,replace=TRUE)
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.h0 <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)  # 
p.h0
[1] 0.08049195

इस बार के आसपास हम तीन दृष्टिकोणों के लिए समान पी-मूल्यों के साथ समाप्त हो गए। उम्मीद है की यह मदद करेगा!


1
क्या आप दयालु होंगे और समझाएँगे कि '1' को निम्नलिखित में क्यों जोड़ा गया: (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)कुछ इस तरह से: mean(abs(boot.t) > abs(t.test(x,y)$statistic))थैंक्यू फॉर यू टाइम।
TG_Montana

+1। क्या यह बूटस्ट्रैप-ऑन-संशोधित-डेटा-टू-सैंपल-से-H0 दृष्टिकोण का एक विशेष नाम है?
अमीबा का कहना है कि

3
@TG_Montana: सामान्य विचार यह है कि आप बूटस्ट्रैप किए गए परीक्षण आँकड़ों के अनुपात की गणना करते हैं (यानी तहत आने वाले लोगH0pvalue=number of times {t>tobs}BB

@amoeba: यदि यह प्रक्रिया एक औपचारिक या सहमति-योग्य नाम है, तो मैं अनिश्चित हूं, लेकिन मुझे लगता है कि इसे वितरण के बजाय साधनों की समानता के लिए बूटस्ट्रैप टेस्ट के रूप में वर्णित किया जा सकता है । पूरी प्रक्रिया दिखाने वाला पृष्ठ Google पुस्तकों पर अनुपलब्ध है , लेकिन इसकी प्रेरणा पृष्ठ 223 पर दिखाई देती है। इसका एक और वर्णन इन नोटों में पाया जा सकता है, पृष्ठ 13 ( galton.uchicago.edu/~eichler/stat24600/Handouts/bootstrap) पर। पीडीएफ )।
जेनिट

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