मान लीजिए कि मेरे पास दो स्वतंत्र समूहों के साथ एक डेटा है:
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 ने पोस्ट प्रश्न में बूटस्ट्रैप के असामान्य परिणामों के बारे में बताया जहाँ उद्देश्य दो साधनों की तुलना करना था। हालाँकि, उस पोस्ट में यह नहीं दिखाया गया है कि बूटस्ट्रैप कैसे करें जब बूटस्ट्रैप से पहले डेटा को संशोधित किया जाए। दृष्टिकोण जहां डेटा को बूटस्ट्रैप से पहले संशोधित किया गया है वह इस तरह दिखता है:
- H0 बताता है कि दो समूहों के साधन समान हैं
- अगर हम अलग किए गए नमूने के माध्यम से व्यक्तिगत टिप्पणियों को घटाते हैं तो H0 सही है
इस मामले में, डेटा के संशोधन का मतलब समूहों को प्रभावित करना चाहिए, और इसलिए इसका अंतर, लेकिन समूहों के भीतर (और बीच में) भिन्नता नहीं।
- संशोधित डेटा आगे के बूटस्ट्रैप के लिए आधार होगा, जिसमें केवेट्स के साथ नमूनाकरण प्रत्येक समूह के भीतर अलग-अलग किया जाता है ।
- जी 1 और जी 2 के बूटस्ट्रैप्ड माध्य के बीच अंतर की गणना की जाती है और समूहों के बीच मनाया (गैर-संशोधित) अंतर के साथ तुलना की जाती है।
- पुनरावृत्ति की संख्या से विभाजित एक से अधिक या अधिक चरम मूल्यों का अनुपात पी मान देगा।
यहाँ कोड है (बूटस्ट्रैप 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 के स्पष्टीकरण से निपटना होगा , लेकिन मैं यह पता नहीं लगा सकता कि कुंजी कहां है ...
H0 <- pool - mean (pool)
:। इसे बदलने की जरूरत है H0 <- c(g1.lengths - mean(g1.lengths), g2.lengths - mean(g2.lengths))
। फिर आपको 0.0023 का पी-वैल्यू मिलेगा। (यह वही बात है जिसे ज़ीनत ने अपने जवाब में समझाया था।) यह सब कुछ है, कोड में बस एक साधारण बग है। CC to @MichaelChernick