সমাধান — অধ্যায় ৪.৯ · The Bootstrap, Jackknife & Resampling¶
অধ্যায় ফাইল:
part-4-inference/04-09-bootstrap-jackknife-resampling.md(§৭ অনুশীলনী)। সংখ্যাগত উত্তরnumpy/scipyদিয়ে যাচাইযোগ্য (seed উল্লেখ থাকলে reproducible)। মূল বস্তু — bootstrap = মূল নমুনাকে population ধরে replacement-সহ \(n\)বার টানা (\(X^*\)), \(B\)টা replicate \(\hat\theta^*_b\), \(\widehat{\mathrm{se}}_{\text{boot}}=\sqrt{\frac{1}{B-1}\sum_b(\hat\theta^*_b-\bar\theta^*)^2}\); percentile CI \(=[\hat\theta^*_{(\alpha/2)},\hat\theta^*_{(1-\alpha/2)}]\); jackknife \(\hat\theta_{(i)}\) = leave-one-out, \(\widehat{\mathrm{se}}_{\text{jack}}=\sqrt{\frac{n-1}{n}\sum_i(\hat\theta_{(i)}-\bar\theta_{(\cdot)})^2}\), bias\(_{\text{jack}}=(n-1)(\bar\theta_{(\cdot)}-\hat\theta)\); permutation test = label এলোমেলো, p-value = লেজের ভগ্নাংশ। চলমান উদাহরণ: E1 bootstrap SE of mean; E2 bootstrap CI for median; E3 jackknife; E4 permutation test।
ক · ধারণাগত (conceptual)¶
সমাধান ১ (★)¶
- bootstrap — একটা resampling পদ্ধতি যা একটা statistic \(\hat\theta\)-এর sampling distribution (ও তা থেকে SE, CI ইত্যাদি) আঁচ করে, যখন তত্ত্বের সূত্র জানা নেই বা কঠিন। সমস্যা: sampling distribution জানতে population থেকে অনেক নমুনা লাগত, কিন্তু হাতে একটাই নমুনা। সমাধান: মূল নমুনাকেই (তার empirical distribution \(\hat F_n\), যেখানে প্রতিটা পর্যবেক্ষণে ভর \(1/n\)) "population" ধরে নাও।
- resampling with replacement — মূল \(n\)টা মান থেকে এলোমেলোভাবে একটা টানো, ফেরত রেখে দাও, আবার টানো — মোট \(n\)বার। এই \(n\)টা মিলে একটা bootstrap resample \(X^*\)।
- একই মান একাধিকবার কেন — ফেরত রাখা হয় বলে প্রতিটা টানে সব \(n\)টা মূল মানই সমান সম্ভাবনায় (\(1/n\)) আসতে পারে; তাই একটা মান \(2\)–\(3\)বারও আসতে পারে, আর কিছু মান একবারও না (out-of-bag, §Q10)। এই পুনরাবৃত্তি ও বাদ-পড়াই resample-গুলোর মধ্যে variation আনে — তা না হলে প্রতিটা \(X^*\) মূল নমুনারই হুবহু কপি হতো।
- মূল নমুনাকে population ধরা কেন — কারণ আমাদের কাছে সত্যিকারের population নেই; \(\hat F_n\) হলো population-এর সবচেয়ে ভালো (nonparametric) আঁচ। plug-in principle: সত্য \(F\)-এর জায়গায় \(\hat F_n\) বসিয়ে দিলে "\(\hat\theta\)-এর sampling distribution under \(F\)" → "\(\hat\theta^*\)-এর distribution under \(\hat F_n\)", যেটা আমরা সিমুলেশনে বের করতে পারি। Figure 1-এর প্রতিটা bar একটা \(\hat\theta^*_b\)।
সমাধান ২ (★★) — [bootstrap distribution-এর কেন্দ্র বনাম বিস্তার]¶
কেন্দ্র = \(\hat\theta\) (মূল নমুনার estimate)। Figure 1-এ লাল রেখা \(\hat\theta=6.41\) ঠিক histogram-এর কেন্দ্রে, আর bootstrap গড়গুলোর গড় (\(6.40\), সবুজ) তার গায়ে। কারণ bootstrap মূল নমুনাকে population ধরে — তাই সব \(\hat\theta^*_b\) ঘোরে \(\hat\theta\)-র চারপাশে, অজানা সত্য \(\theta\)-র চারপাশে নয় (সত্য \(\theta\) bootstrap-এর কাছে অদৃশ্য)।
ফলে কেন্দ্র নতুন কিছু বলে না, বিস্তার বলে। bootstrap distribution-এর কেন্দ্র শুধু \(\hat\theta\)-কেই ফিরিয়ে দেয় (যা আগে থেকেই জানি)। কিন্তু এর বিস্তার ঠিক নকল করে \(\hat\theta\) নমুনা-থেকে-নমুনায় কতটা দুলত — অর্থাৎ: $\(\widehat{\mathrm{se}}_{\text{boot}}=\sqrt{\frac{1}{B-1}\sum_{b=1}^{B}\big(\hat\theta^*_b-\bar\theta^*\big)^2}=\text{(bootstrap replicate-গুলোর standard deviation)}.\)$ এটাই \(\widehat{\mathrm{se}}_{\text{boot}}\) — bootstrap বণ্টনের spread। Figure 1-এ সোনালি তীর \(\pm0.79\), বাক্সে \(\widehat{\mathrm{se}}_{\text{boot}}=0.786\)। (অতএব মূলনীতি: center = recovery of \(\hat\theta\); spread = standard error।)
সমাধান ৩ (★★)¶
percentile CI বানানো (Figure 2): \(B\)টা bootstrap replicate \(\hat\theta^*_b\) ছোট থেকে বড় সাজাও; নিচের \(\alpha/2\) ও ওপরের \(\alpha/2\) অংশ ছেঁটে ফেলো; যা থাকে তার দুই প্রান্তই interval: $\(\text{percentile CI}=\big[\hat\theta^*_{(\alpha/2)},\ \hat\theta^*_{(1-\alpha/2)}\big].\)$ \(95\%\) CI-র দুই percentile: \(\alpha=0.05\), তাই \(2.5\%\) ও \(97.5\%\) quantile (Figure 2-এ \(4.49\) ও \(7.15\))।
skew থাকলে percentile CI ভালো কেন: - সূত্র-ভিত্তিক \(\hat\theta\pm z\,\widehat{\mathrm{se}}\) সবসময় প্রতিসম (দুই বাহু সমান দৈর্ঘ্য) এবং normality ধরে নেয়। sampling distribution আঁকাবাঁকা হলে এটা ভুল দিকে বেশি/কম ঢেকে coverage নষ্ট করে। - percentile CI bootstrap বণ্টনের প্রকৃত আকৃতি থেকে quantile নেয়, তাই বণ্টন ডান/বাঁ-দিকে হেলানো হলে interval-ও অসম হয় (Figure 2-এ \(\hat\theta=6.47\)-এর বাঁ বাহু \(1.98\), ডান বাহু \(0.68\))। আকৃতি data নিজেই ঠিক করে, কোনো normality চাপানো হয় না।
(সতর্কতা: percentile method সহজ কিন্তু সবচেয়ে নির্ভুল নয়; bias/skew বেশি হলে BCa বা bootstrap-\(t\) ভালো coverage দেয়।)
সমাধান ৪ (★★) — [তিন resampling পদ্ধতির তুলনা]¶
| পদ্ধতি | resample কীভাবে | random/det. | কী মাপে |
|---|---|---|---|
| bootstrap | with replacement, \(n\)টা টানা | random | \(\hat\theta\)-এর অনিশ্চয়তা — SE, CI |
| jackknife | একটা একটা করে বাদ (leave-one-out) | deterministic | SE ও bias (Figure 3) |
| permutation | দুই দলের label এলোমেলো (shuffle, without replacement) | random | null hypothesis-এর p-value (Figure 4) |
- অনিশ্চয়তা নিয়ে কাজ: bootstrap (Figure 1–2) ও jackknife (Figure 3) — দুটোই একটা একক নমুনার estimate কতটা অনিশ্চিত তা মাপে ("কত নিশ্চিত")। jackknife উপরন্তু bias ধরে।
- null hypothesis নিয়ে কাজ: permutation test (Figure 4) — দুই দলের পার্থক্য কতটা আশ্চর্যজনক তা মাপে (\(H_0\): label অর্থহীন)। উত্তর একটা p-value, SE নয়।
- এক লাইনে: bootstrap/jackknife = "কত নিশ্চিত", permutation = "কতটা আশ্চর্যজনক"।
খ · গাণনিক (computational)¶
সমাধান ৫ (★) — E1 (bootstrap SE of mean)¶
তিনটা resample-এর গড় (\(\hat\theta^*_b\)): $\(\hat\theta^*_1=\tfrac{4+4+6+9+2}{5}=\tfrac{25}{5}=5.0,\quad \hat\theta^*_2=\tfrac{6+6+4+2+4}{5}=\tfrac{22}{5}=4.4,\quad \hat\theta^*_3=\tfrac{9+9+6+6+4}{5}=\tfrac{34}{5}=6.8.\)$ এই তিনটা মানের গড় \(\bar\theta^*=\frac{5.0+4.4+6.8}{3}=\frac{16.2}{3}=5.4\)। sample SD (ddof=1): $\(\widehat{\mathrm{se}}_{\text{boot}}=\sqrt{\frac{(5.0-5.4)^2+(4.4-5.4)^2+(6.8-5.4)^2}{3-1}} =\sqrt{\frac{0.16+1.00+1.96}{2}}=\sqrt{\frac{3.12}{2}}=\sqrt{1.56}\approx 1.25.\)$
সিদ্ধান্ত: \(\widehat{\mathrm{se}}_{\text{boot}}\approx 1.25\)। (সাবধান: \(B=3\) নিতান্তই demonstration — বাস্তবে \(B\ge 1000\)–\(10000\) নিয়ে এই আঁচ স্থিতিশীল হয়; এখানে শুধু "প্রতিটা resample → একটা \(\hat\theta^*_b\) → তাদের SD = \(\widehat{\mathrm{se}}_{\text{boot}}\)" যন্ত্রটা দেখানো।)
সমাধান ৬ (★★) — E2 (percentile CI)¶
\(95\%\) ⇒ \(\alpha=0.05\), প্রতি প্রান্তে \(\alpha/2=0.025\)। - নিচের কাট: \(0.025\times B=0.025\times 1000=25\) ⇒ \(25\)তম ক্ষুদ্রতম replicate \(=4.5\)। - ওপরের কাট: \((1-0.025)\times B=0.975\times 1000=975\) ⇒ \(\approx 975\)–\(976\)তম replicate \(=7.1\)।
\(95\%\) percentile CI \(=[4.5,\ 7.1]\)।
কেন ঠিক এই অবস্থান: percentile method-এ interval-এর দুই প্রান্ত হলো bootstrap বণ্টনের \(2.5\%\) ও \(97.5\%\) quantile; \(B=1000\)টা সাজানো মানে \(i\)তম মান \(\approx \frac{i}{B}\) quantile-এ — তাই \(2.5\%\to 25\)তম, \(97.5\%\to 975\)তম। মাঝের \(95\%\) replicate-ই CI ঢাকে (Figure 2-এর একই রেসিপি, ভিন্ন সংখ্যা)।
সমাধান ৭ (★★) — E3 (jackknife)¶
নমুনা \(\{3,5,7,9,16\}\), \(n=5\), \(\hat\theta=\bar X=\frac{3+5+7+9+16}{5}=\frac{40}{5}=8.0\)।
leave-one-out গড় \(\hat\theta_{(i)}=\frac{40-X_i}{4}\): | বাদ \(X_i\) | \(\hat\theta_{(i)}=\frac{40-X_i}{4}\) | |---|---| | \(3\) | \(37/4=9.25\) | | \(5\) | \(35/4=8.75\) | | \(7\) | \(33/4=8.25\) | | \(9\) | \(31/4=7.75\) | | \(16\) | \(24/4=6.00\) |
\(\bar\theta_{(\cdot)}=\frac{9.25+8.75+8.25+7.75+6.00}{5}=\frac{40.0}{5}=8.0\)। jackknife bias \(=(n-1)(\bar\theta_{(\cdot)}-\hat\theta)=4\times(8.0-8.0)=\boxed{0}\) — গড় linear, তাই jackknife-bias ঠিক শূন্য (§Q9-এর সাধারণ ফল)।
সবচেয়ে বেশি বদলায় — \(X=16\) বাদ দিলে (\(\hat\theta_{(i)}=6.0\), বাকিদের থেকে দূরতম)। কারণ \(16\) একটা outlier; বড় মান বলে গড়ের ওপর তার টান (influence) সর্বোচ্চ, তাই বাদ দিলে গড় সবচেয়ে নামে (Figure 3-এর "drop x=12.5"-এর সমান্তরাল)।
(বোনাস: jackknife SE \(=\sqrt{\frac{4}{5}\sum(\hat\theta_{(i)}-8)^2}\); \(\sum(\hat\theta_{(i)}-8)^2=1.25^2+0.75^2+0.25^2+0.25^2+2^2=1.5625+0.5625+0.0625+0.0625+4=6.25\); SE \(=\sqrt{0.8\times6.25}=\sqrt5\approx2.236=s/\sqrt5\), কারণ \(s=\sqrt{\frac{1}{4}\sum(X_i-8)^2}=\sqrt{\frac{25+9+1+1+64}{4}}=\sqrt{25}=5\), \(5/\sqrt5=\sqrt5\) ✓।)
সমাধান ৮ (★★) — E4 (permutation test)¶
A \(=\{8,10,12\}\) (\(n_A=3\)), B \(=\{5,7\}\) (\(n_B=2\)); observed \(\bar A-\bar B=10-6=4\)। মোট ৫টা মান \(\{5,7,8,10,12\}\) থেকে "দল A-তে কোন \(3\)টা" বাছার উপায় \(\binom{5}{3}=10\) — প্রতিটা \(H_0\)-র অধীনে সমসম্ভাব্য।
সব \(\binom{5}{3}=10\) ভাগে \(\bar A-\bar B\) (A = বাছা ৩টা, B = বাকি ২টা): | A (৩টা) | \(\bar A\) | B (২টা) | \(\bar B\) | \(\bar A-\bar B\) | |---|---|---|---|---| | 8,10,12 | 10.00 | 5,7 | 6.0 | 4.00 ← observed | | 7,10,12 | 9.67 | 5,8 | 6.5 | 3.17 | | 7,8,12 | 9.00 | 5,10 | 7.5 | 1.50 | | 5,10,12 | 9.00 | 7,8 | 7.5 | 1.50 | | 7,8,10 | 8.33 | 5,12 | 8.5 | −0.17 | | 5,8,12 | 8.33 | 7,10 | 8.5 | −0.17 | | 5,7,12 | 8.00 | 8,10 | 9.0 | −1.00 | | 5,8,10 | 7.67 | 7,12 | 9.5 | −1.83 | | 5,7,10 | 7.33 | 8,12 | 10.0 | −2.67 | | 5,7,8 | 6.67 | 10,12 | 11.0 | −4.33 |
এক-পুচ্ছ (\(\ge 4\)) p-value: observed \(4.00\) সর্বোচ্চ সম্ভাব্য তফাত (A = তিন বৃহত্তম মান); \(\ge 4\) এমন ভাগ মাত্র \(1\)টা (observed নিজেই)। তাই $\(p_{\text{one-sided}}=\frac{\#\{\bar A-\bar B\ge 4\}}{\binom{5}{3}}=\frac{1}{10}=0.10.\)$ (দুই-পুচ্ছ হলে \(\lvert \cdot\rvert\ge 4\): \(\{4.00,-4.33\}\) ⇒ \(2/10=0.20\)।) এটা exact permutation test — সব বিন্যাস গোনা গেছে; বড় নমুনায় এত বিন্যাস গোনা অসম্ভব বলে \(10{,}000\) random shuffle দিয়ে p আঁচ করা হয় (Figure 4)। ছোট \(n\)-এ p বড় হওয়াই স্বাভাবিক (resolution মোটে \(1/10\))।
গ · প্রমাণভিত্তিক (proof-based)¶
সমাধান ৯ (★★) — jackknife SE = \(s/\sqrt n\) গড়ের ক্ষেত্রে¶
statistic \(\hat\theta=\bar X=\frac1n\sum_j X_j\)। leave-one-out গড়: $\(\hat\theta_{(i)}=\frac{1}{n-1}\sum_{j\ne i}X_j=\frac{n\bar X-X_i}{n-1}.\)$ এর থেকে \(\hat\theta\)-এর সাপেক্ষে বিচ্যুতি: $\(\hat\theta_{(i)}-\bar X=\frac{n\bar X-X_i}{n-1}-\bar X=\frac{n\bar X-X_i-(n-1)\bar X}{n-1}=\frac{\bar X-X_i}{n-1}.\)$ leave-one-out গড়গুলোর গড়: $\(\bar\theta_{(\cdot)}=\frac1n\sum_i\hat\theta_{(i)}=\frac1n\sum_i\frac{n\bar X-X_i}{n-1}=\frac{n\cdot n\bar X-\sum_i X_i}{n(n-1)}=\frac{n^2\bar X-n\bar X}{n(n-1)}=\frac{n\bar X(n-1)}{n(n-1)}=\bar X.\)$ সুতরাং \(\bar\theta_{(\cdot)}=\bar X\), এবং \(\hat\theta_{(i)}-\bar\theta_{(\cdot)}=\dfrac{\bar X-X_i}{n-1}\)। এখন jackknife SE-র ভেতরের যোগফল: $\(\sum_i\big(\hat\theta_{(i)}-\bar\theta_{(\cdot)}\big)^2=\sum_i\frac{(\bar X-X_i)^2}{(n-1)^2}=\frac{1}{(n-1)^2}\sum_i(X_i-\bar X)^2=\frac{(n-1)s^2}{(n-1)^2}=\frac{s^2}{n-1},\)$ যেখানে \(\sum_i(X_i-\bar X)^2=(n-1)s^2\)। অতএব $\(\widehat{\mathrm{se}}_{\text{jack}}^2=\frac{n-1}{n}\sum_i\big(\hat\theta_{(i)}-\bar\theta_{(\cdot)}\big)^2=\frac{n-1}{n}\cdot\frac{s^2}{n-1}=\frac{s^2}{n}\ \Longrightarrow\ \boxed{\widehat{\mathrm{se}}_{\text{jack}}=\frac{s}{\sqrt n}}.\)$ এটাই Figure 3-এর সংখ্যাগত মিল (\(0.803=0.803\))-এর সাধারণ ব্যাখ্যা: গড়ের ক্ষেত্রে jackknife পুরোনো \(s/\sqrt n\) সূত্রকেই পুনরুৎপাদন করে। (একই কারণে bootstrap-ও গড়ে \(\approx s/\sqrt n\) দেয় — তিন পথ এক গন্তব্য।)
সমাধান ১০ (★★) — bootstrap-এ একটা বিন্দু বাদ পড়ার সম্ভাবনা¶
একটা bootstrap resample = \(n\)টা স্বাধীন টান, প্রতিবার \(n\)টা মূল বিন্দু থেকে সমসম্ভাবনায় (\(1/n\))। নির্দিষ্ট একটা \(X_i\): - এক টানে \(X_i\) না-আসার সম্ভাবনা \(=1-\frac1n\)। - \(n\)টা স্বাধীন টানে একবারও না-আসা \(=\big(1-\frac1n\big)^n\)।
সীমা: পরিচিত সীমা \(\lim_{n\to\infty}\big(1+\frac{x}{n}\big)^n=e^x\) থেকে (\(x=-1\)): $\(\lim_{n\to\infty}\Big(1-\frac1n\Big)^n=e^{-1}\approx 0.3679.\)$ অতএব বড় \(n\)-এ প্রতিটা resample-এ একটা নির্দিষ্ট বিন্দুর বাদ পড়ার সম্ভাবনা \(\approx 0.368\), আর থাকার (in-bag) সম্ভাবনা \(1-e^{-1}\approx 0.632\)। গড়ে তাই প্রতিটা bootstrap resample মূল data-র প্রায় \(63.2\%\) স্বতন্ত্র বিন্দু ধারণ করে; বাকি \(\approx36.8\%\) "out-of-bag" — এই out-of-bag ভাগটাই পরে random forest-এ out-of-bag error estimate-এ ব্যবহৃত হয়। (ছোট \(n\)-এও কাছাকাছি: \(n=5\) ⇒ \((0.8)^5=0.328\); \(n=30\) ⇒ \(0.362\); দ্রুত \(0.368\)-এ মেলে।)
সমাধান ১১ (★★★) — permutation test exactly valid কেন (exchangeability)¶
সেটআপ. মোট \(n=n_A+n_B\)টা মান; \(H_0\): দুই দল একই বণ্টন থেকে (label অর্থহীন)। একটা statistic \(T\) (যেমন \(\bar A-\bar B\)) যা কোন \(n_A\)টা মান "A" তার ওপর নির্ভর করে।
exchangeability. \(H_0\)-র অধীনে \((X_1,\dots,X_n)\) exchangeable — অর্থাৎ যেকোনো permutation \(\pi\)-এর জন্য \((X_{\pi(1)},\dots,X_{\pi(n)})\)-এর যৌথ বণ্টন মূল-এর সমান। (iid হলে এটা স্বয়ংক্রিয়; আরও সাধারণভাবে symmetric যৌথ বণ্টন যথেষ্ট।) ফলে কোন \(n_A\)টা সূচক "দল A" হিসেবে চিহ্নিত হলো সেটা data সম্পর্কে কোনো তথ্য বহন করে না — সব সম্ভাব্য চিহ্নিতকরণ পরিসংখ্যানগতভাবে অভিন্ন।
সমসম্ভাব্যতা। \(\{1,\dots,n\}\) থেকে \(n_A\)টা সূচক বাছার উপায় \(\binom{n}{n_A}\)টি। exchangeability-র জন্য \(H_0\)-তে প্রতিটা বাছা সমসম্ভাব্য, সম্ভাবনা \(1/\binom{n}{n_A}\)। তাই \(T\)-এর exact null distribution = এই \(\binom{n}{n_A}\)টি label-বিন্যাসের ওপর \(T\)-এর মানগুলোর (সম-ওজনের) বণ্টন।
p-value. observed value \(t_{\text{obs}}\)-এর exact (এক-পুচ্ছ) p-value: $\(p=\frac{\#\{\pi:\ T(\pi)\ge t_{\text{obs}}\}}{\binom{n}{n_A}},\)$ অর্থাৎ ঠিক "কত ভাগ বিন্যাস observed-এর মতো বা বেশি চরম" (§Q8-এ আমরা \(\binom{5}{3}=10\)টি বিন্যাস হাতে গুনেছি)। যুক্তির কোথাও normality, সমান variance, বা large-\(n\) লাগেনি — কেবল exchangeability। তাই permutation p-value যেকোনো নমুনা-আকারে, যেকোনো বণ্টনে বৈধ (exact)। বড় \(n\)-এ \(\binom{n}{n_A}\) বিশাল বলে সব বিন্যাস না গুনে \(P\)টা random shuffle নিয়ে Monte-Carlo আঁচ করা হয় — Figure 4 ঠিক সেই আঁচ (\(p\approx 0.0021\)), যা \(P\to\infty\)-এ exact p-value-এ যায়।
ঘ · কোডিং (coding)¶
সমাধান ১২ (★★) — bootstrap SE ও percentile CI¶
import numpy as np
rng = np.random.default_rng(0)
x = np.round(rng.gamma(2.0, 4.0, size=30), 2) # একটা নমুনা, n=30
B, n = 5000, x.size
idx = rng.integers(0, n, size=(B, n)) # B x n index, replacement-সহ
boot_mean = x[idx].mean(axis=1) # প্রতিটি সারি = একটি resample-এর গড়
boot_med = np.median(x[idx], axis=1) # ... এবং median
se_boot = boot_mean.std(ddof=1)
se_formula= x.std(ddof=1) / np.sqrt(n)
ci_med = np.percentile(boot_med, [2.5, 97.5])
print(f"se_boot(mean) = {se_boot:.3f} s/sqrt(n) = {se_formula:.3f}")
print(f"95% percentile CI (median) = [{ci_med[0]:.2f}, {ci_med[1]:.2f}]")
idx একসাথে \(B\times n\) এলোমেলো সূচক বানায় (range \(0..n{-}1\)), x[idx] সেগুলো দিয়ে একসাথে \(5000\)টা resample — কোনো Python লুপ লাগে না, পুরো vectorized। গড়ের \(\widehat{\mathrm{se}}_{\text{boot}}=0.786\) প্রায় সূত্র \(s/\sqrt n=0.803\)-এর সমান (Figure 1)। median-এর CI \([4.49,7.15]\) — \(\hat\theta=6.47\)-এর চারপাশে অসম (বাঁ বাহু বড়), কারণ data skewed (Figure 2)। (\(B\) বাড়ালে এই মানগুলো আরও স্থিতিশীল হবে; seed বদলালে শেষ অঙ্কে সামান্য নড়বে।)
সমাধান ১৩ (★★) — jackknife ফাংশন¶
import numpy as np
def jackknife(x, stat):
"""leave-one-out estimates, jackknife SE, ও jackknife bias ফেরত দেয়।"""
x = np.asarray(x, float); n = x.size
loo = np.array([stat(np.delete(x, i)) for i in range(n)]) # theta_(i)
theta = stat(x); m = loo.mean()
se = np.sqrt((n - 1) / n * np.sum((loo - m) ** 2))
bias = (n - 1) * (m - theta)
return loo, se, bias
x = np.array([3.1, 4.2, 4.8, 5.0, 5.3, 5.9, 6.1, 6.4, 7.0, 12.5])
loo, se, bias = jackknife(x, np.mean)
print(f"[mean] se = {se:.3f} bias = {bias:+.3f} (s/sqrt(n) = {x.std(ddof=1)/np.sqrt(x.size):.3f})")
_, se_v, bias_v = jackknife(x, lambda a: a.var(ddof=0)) # population variance: nonlinear
print(f"[var] se = {se_v:.3f} bias = {bias_v:+.3f}")
ddof=0, যা একটু পক্ষপাতদুষ্ট estimator) nonlinear — jackknife একটা শূন্য-নয় bias ধরে ফেলে; সংশোধিত estimate \(\hat\theta_{\text{jack}}=\hat\theta-\text{bias}_{\text{jack}}=n\hat\theta-(n-1)\bar\theta_{(\cdot)}\) পক্ষপাত কমায়। এটাই jackknife-এর মূল ঐতিহাসিক ব্যবহার (bias reduction)। (অসমান statistic যেমন median-এ jackknife দুর্বল — leave-one-out median প্রায়ই বদলায়ই না; সেখানে bootstrap চালানো উচিত।)
সমাধান ১৪ (★★★) — permutation test¶
import numpy as np
from scipy import stats
rng = np.random.default_rng(3)
A = np.array([5.1, 6.3, 5.8, 6.9, 7.2, 6.1, 5.5, 6.8]) # n_A = 8
B = np.array([4.2, 5.0, 4.8, 5.6, 4.1, 5.3, 4.7]) # n_B = 7
obs = A.mean() - B.mean()
pool = np.concatenate([A, B]); nA = A.size; P = 10000
diffs = np.empty(P)
for i in range(P):
rng.shuffle(pool) # label এলোমেলো (in-place)
diffs[i] = pool[:nA].mean() - pool[nA:].mean()
p_perm = (np.abs(diffs) >= abs(obs)).mean() # দুই-পুচ্ছ, tail area
p_t = stats.ttest_ind(A, B).pvalue # তুলনার জন্য
print(f"observed diff = {obs:.3f}")
print(f"permutation p = {p_perm:.4f}")
print(f"two-sample t p = {p_t:.4f}")
pool shuffle করে প্রথম \(n_A=8\)টা "A", বাকি "B" — \(H_0\) (label অর্থহীন) অনুকরণ; \(10{,}000\)টা তফাত মিলে null distribution (Figure 4)। observed \(1.398\) লেজের প্রায় বাইরে, তাই \(p\approx 0.0021\) — মাত্র \(\approx 21/10000\) shuffle এত চরম। permutation p সাধারণত \(t\)-test p-র কোটিতে, কিন্তু কোনো normality না ধরেই (এখানে \(t\)-test একটু ছোট p দিচ্ছে কারণ সে normality + সমান-variance ধরে; ছোট/অসম data-তে permutation বেশি নির্ভরযোগ্য)। \(P\) বাড়ালে p আরও স্থিতিশীল; exact হতে হলে সব \(\binom{15}{8}=6435\) বিন্যাস গোনা যেত (§Q11)।
সমাধান-নোট: সংখ্যাগুলো seed-নির্ভর (
default_rng(0/3)ইত্যাদি) ও reproducible; পাঠ্যের Figure 1–4-এর মানের সাথে মেলে (\(\widehat{\mathrm{se}}_{\text{boot}}=0.786\), median CI \(=[4.49,7.15]\), jackknife se \(=0.803\)/bias \(=0\), permutation \(p=0.0021\))। মূল শিক্ষা — resampling তত্ত্বের সূত্রের একটা সর্বজনীন বিকল্প: bootstrap দেয় SE ও CI, jackknife দেয় SE ও bias, permutation দেয় null-test p-value — তিনটাই data থেকে বারবার নমুনা/label এলোমেলো করে, closed-form-এর ওপর নির্ভর না করে।