Вибіркові методи: Bootstrap і Jackknife
Яка невизначеність медіани 40 вимірювань, коли підручникової формули для її стандартної похибки не існує? Перевибірка дає відповідь без жодних припущень про розподіл: перевибираємо самі дані. Ми розглянемо непараметричний bootstrap, персентильні довірчі інтервали, jackknife «залиш-один-геть» та повну реалізацію обох методів на JavaScript.
1. Навіщо перевибирати? Принцип підстановки
Класична статистика дає формули у замкнутому вигляді для стандартних похибок простих статистик, як-от середнє (σ/√n), але для медіани, усіченого середнього, коефіцієнта кореляції чи відношення двох статистик такої формули загалом не існує — або вона залежить від невідомих властивостей розподілу генеральної сукупності.
Принцип підстановки Бредлі Ефрона (1979) вирішує цю проблему: оскільки ми не знаємо справжнього розподілу генеральної сукупності F, ми підставляємо емпіричний розподіл F̂ — саму вибірку, вважаючи кожне спостережене значення однаково ймовірним — і оцінюємо мінливість вибірки статистики шляхом повторної перевибірки з F̂ замість F.
2. Алгоритм bootstrap
Маючи вихідну вибірку x₁, …, xₙ і статистику θ̂ = T(x₁,…,xₙ) (наприклад, середнє, медіану чи стандартне відхилення), непараметричний bootstrap працює так:
- Витягуємо bootstrap-вибірку x₁*, …, xₙ* розміром n, вибираючи з поверненням із вихідних даних.
- Обчислюємо статистику на перевибірці: θ̂* = T(x₁*, …, xₙ*).
- Повторюємо кроки 1–2 B разів (зазвичай B = 1 000–10 000), отримуючи bootstrap-розподіл θ̂*₁, …, θ̂*ᴮ.
- Використовуємо розкид bootstrap-розподілу як оцінку вибіркового розподілу θ̂.
// θ̄* — середнє B bootstrap-реплікацій
3. Довірчі інтервали bootstrap
Найпростіший і найпоширеніший інтервал — персентильний метод: сортуємо B bootstrap-реплікацій і беремо емпіричні 2.5-й та 97.5-й персентилі як 95% довірчий інтервал:
Цей метод не робить жодних припущень про нормальність і працює навіть для скошених вибіркових розподілів (наприклад, медіани чи відношення). Існують уточнені варіанти для випадків, коли персентильний метод зміщений:
- Базовий (пивотальний) bootstrap ДІ: відображає персентильний інтервал навколо θ̂ замість використання квантилів реплікацій напряму — коригує деяку асиметрію.
- BCa (bias-corrected and accelerated): коригує як медіанне зміщення bootstrap-розподілу, так і те, як сама стандартна похибка змінюється залежно від θ (прискорення) — стандартний вибір у промисловому статистичному ПЗ.
Для порівняння, класичний параметричний ДІ для середнього за припущення нормальної генеральної сукупності використовує t-розподіл: X̄ ± tn−1,0.975·s/√n. Коли дані справді близькі до нормальних, цей інтервал і персентильний bootstrap-ДІ майже збігаються; коли дані скошені або статистика нелінійна (наприклад, медіана), вони розходяться, і bootstrap заслуговує більше довіри.
4. Jackknife: залиш-один-геть
Jackknife (Кенуй 1949, Тьюкі 1958) передує bootstrap і використовує детермінований спосіб перевибірки: обчислює статистику n разів, кожного разу виключаючи рівно одне спостереження.
Jackknife-середнє: θ̄₍·₎ = (1/n) Σᵢ θ̂₍ᵢ₎
Оцінка зміщення
Оцінка дисперсії / стандартної похибки
Множник (n−1) роздуває сиру дисперсію оцінок «залиш-один-геть», оскільки кожна θ̂₍ᵢ₎ обчислюється з n−1 точок і тому варіюється менше, ніж це робила б незалежна реплікація — формула jackknife компенсує це.
5. Bootstrap проти jackknife
| Властивість | Bootstrap | Jackknife |
|---|---|---|
| Перевибірки | B випадкових, з поверненням | n детермінованих, залиш-один-геть |
| Обчислювальна вартість | O(B·n) — B часто 1 000+ | O(n²) у гіршому разі — лише n реплікацій |
| Працює для медіани | Так | Ні (неспроможний) |
| Довірчі інтервали | Персентильний, BCa, пивотальний — напряму | Потребує нормальної апроксимації додатково |
| Історична роль | Універсальний, стандарт сьогодні | Простіший попередник, досі використовується для зміщення/дисперсії гладких статистик |
У сучасній практиці bootstrap значною мірою витіснив jackknife для довірчих інтервалів, але jackknife залишається корисним як дешевий детермінований інструмент корекції зміщення, а також лежить в основі крос-валідації та діагностики jackknife-after-bootstrap.
6. Реалізація на JavaScript
function mean(arr) { return arr.reduce((a,b) => a+b, 0) / arr.length; }
function median(arr) {
const s = [...arr].sort((a,b) => a-b);
const mid = Math.floor(s.length / 2);
return s.length % 2 ? s[mid] : (s[mid-1] + s[mid]) / 2;
}
// ── Bootstrap: перевибірка з поверненням, B разів ───────────────
function bootstrap(data, statFn, B = 2000) {
const n = data.length;
const replicates = new Array(B);
for (let b = 0; b < B; b++) {
const sample = new Array(n);
for (let i = 0; i < n; i++) sample[i] = data[Math.floor(Math.random() * n)];
replicates[b] = statFn(sample);
}
return replicates;
}
// ── Персентильний довірчий інтервал з bootstrap-реплікацій ──────
function percentileCI(replicates, alpha = 0.05) {
const sorted = [...replicates].sort((a,b) => a-b);
const lo = sorted[Math.floor((alpha/2) * sorted.length)];
const hi = sorted[Math.ceil((1 - alpha/2) * sorted.length) - 1];
return [lo, hi];
}
// ── Jackknife: зміщення та дисперсія «залиш-один-геть» ──────────
function jackknife(data, statFn) {
const n = data.length;
const full = statFn(data);
const looEstimates = new Array(n);
for (let i = 0; i < n; i++) {
const leaveOneOut = data.slice(0, i).concat(data.slice(i + 1));
looEstimates[i] = statFn(leaveOneOut);
}
const jackMean = mean(looEstimates);
const bias = (n - 1) * (jackMean - full);
const variance = ((n - 1) / n) *
looEstimates.reduce((s, v) => s + (v - jackMean) ** 2, 0);
return { estimate: full, bias, se: Math.sqrt(variance) };
}
// ── Приклад: bootstrap і jackknife для медіани ──────────────────
const data = [12, 15, 14, 10, 50, 13, 11, 16, 9, 14]; // скошено викидом 50
const replicates = bootstrap(data, median, 5000);
console.log('bootstrap SE', Math.sqrt(bootstrap(data, median, 5000).reduce(
(s,x,_,a) => s + (x - mean(a))**2, 0) / (replicates.length - 1)));
console.log('95% персентильний ДІ', percentileCI(replicates));
console.log('jackknife (середнє, не медіана!)', jackknife(data, mean));
7. Підводні камені
- Малі вибірки: при n < 10–15 обидва методи можуть бути ненадійними — bootstrap- перевибірка може містити лише значення, вже присутні у вихідних даних, тому крайні персентилі оцінюються погано.
- Залежні дані / часові ряди: наївна bootstrap-перевибірка припускає незалежні однаково розподілені спостереження. Для корельованих даних (часові ряди, просторові дані) використовуйте блоковий bootstrap, який перевибирає суцільні блоки спостережень, щоб зберегти локальну структуру залежності.
- Статистики з необмеженим впливом: якщо одне екстремальне значення може домінувати над статистикою (наприклад, максимум), bootstrap-розподіл може бути сильно скошеним або дискретним — візуалізуйте гістограму bootstrap перед тим, як довіряти інтервалу.
- Обчислювальна вартість на масштабі: для великих n або дорогих статистик (наприклад, повторне навчання складної моделі B разів) розгляньте швидший jackknife-plus або варіанти підвибірки замість повного bootstrap з B = 10 000.
🎯 Дослідіть симуляції Монте-Карло
Побачте випадковість у стилі перевибірки в дії: тисячі випробувань, що збігаються до стабільної оцінки.