Σ
SDCalc
ПросунутийПросунутий·15 min

Бутстреп-методи для стандартного відхилення

Опануйте бутстреп-ресемплінг для оцінки стандартного відхилення. Дізнайтеся про перцентильний, BCa та параметричний бутстреп-методи з реалізацією на Python та розібраними прикладами.

Бутстреп: статистична революція комп’ютерної ери

Бутстреп-ресемплінг — це потужний статистичний метод, який дозволяє оцінити вибірковий розподіл будь-якої статистики шляхом багаторазового повторного відбору зі спостережуваних даних. Запропонований Бредлі Ефроном у 1979 році, він здійснив революцію в статистичному висновуванні, даючи змогу аналізувати складні статистики без опори на математичні формули чи припущення щодо розподілу.

Ключова ідея бутстрепу елегантно проста: ваша вибірка є найкращою оцінкою генеральної сукупності. Повторно відбираючи зі своєї вибірки (з поверненням), ви імітуєте те, що було б, якби можна було багаторазово вибирати з генеральної сукупності. Цей підхід особливо цінний для стандартного відхилення, оскільки традиційні формули довірчих інтервалів припускають нормальність — припущення, яке на практиці часто не виконується.

Бутстреп став незамінним у сучасній науці про дані, оскільки працює з будь-якою статистикою (медіана, кореляція, коефіцієнти регресії, ваги нейронної мережі) і не висуває жодних припущень щодо розподілу ваших даних.

Навіщо бутстреп для стандартного відхилення?

Традиційні довірчі інтервали для стандартного відхилення передбачають, що дані походять із нормального розподілу. Коли це припущення порушується (а це трапляється часто), такі інтервали можуть бути вкрай неточними. Бутстреп надає альтернативу, вільну від розподільних припущень.

Коли традиційні методи не спрацьовують

Довірчий інтервал для стандартного відхилення на основі хі-квадрат розподілу передбачає нормальність. При асиметричних даних (доходи, час реакції, дані виживання) він може давати інтервали, що пропускають справжній параметр у 20–30% випадків замість очікуваних 5%.

Основні переваги бутстрепу для стандартного відхилення:

  • Без припущень щодо розподілу: однаково добре працює з нормальними, асиметричними та важкохвостими даними
  • Ефективність на малих вибірках: часто точніший за параметричні методи при n < 30
  • Робота зі складними статистиками: той самий підхід працює для тримованого СВ, MAD або власних мір варіабельності
  • Візуальне розуміння: бутстреп-розподіл показує, що відбувається, а не лише кінцеві числа

Процедура бутстрепу

Алгоритм бутстрепу надзвичайно простий. З вашої початкової вибірки обсягом n спостережень:

1

Побудувати бутстреп-вибірку

Випадково відберіть n спостережень із поверненням із ваших вихідних даних. Деякі значення з’являться кілька разів, інші — жодного.
2

Обчислити статистику

Розрахуйте стандартне відхилення цієї бутстреп-вибірки. Це одна бутстреп-реплікація.
3

Повторити багато разів

Повторіть кроки 1–2 тисячі разів (зазвичай B = 10 000). Кожне повторення дає одне бутстреп-значення СВ.
4

Проаналізувати розподіл

Колекція B бутстреп-значень СВ апроксимує вибірковий розподіл. Використовуйте його для довірчих інтервалів та перевірки гіпотез.

Чому з поверненням?

Відбір із поверненням є ключовим. Він створює вибірки, що відрізняються за складом, імітуючи варіабельність, яку ви спостерігали б у різних вибірках із генеральної сукупності. Без повернення кожна вибірка була б ідентичною оригіналу.

Скільки бутстреп-вибірок? B = 1 000 часто достатньо для грубих оцінок і перевірки гіпотез. Для довірчих інтервалів B = 10 000 забезпечує стабільні перцентилі. Для якісних BCa-інтервалів для публікацій рекомендується B = 15 000+.

Методи побудови довірчих інтервалів бутстрепу

Існує кілька методів побудови довірчих інтервалів із бутстреп-вибірок, кожен зі своїми компромісами:

1. Перцентильний метод (найпростіший)

Найінтуїтивніший підхід: просто візьміть перцентилі бутстреп-розподілу.

Перцентильний ДІ

95% CI = [θ*₂.₅, θ*₉₇.₅]

Для 10 000 бутстреп-вибірок це 250-те та 9 750-те впорядковані значення. Простий, але може бути зміщеним, коли бутстреп-розподіл асиметричний.

2. Базовий (стрижневий) бутстреп

Використовує зв’язок між вибірковою статистикою та бутстреп-статистиками:

Базовий бутстреп-ДІ

95% CI = [2θ̂ - θ*₉₇.₅, 2θ̂ - θ*₂.₅]

Де θ̂ — стандартне відхилення вихідної вибірки. Цей метод “відзеркалює” перцентильний інтервал відносно вибіркової оцінки.

3. BCa (із корекцією зміщення та прискоренням)

Золотий стандарт точності. BCa коригує як зміщення в бутстреп-розподілі, так і прискорення (те, як стандартна похибка змінюється зі значенням параметра). Складніший в обчисленні, але забезпечує інтервали з точністю другого порядку.

МетодПеревагиНедоліки
ПерцентильнийПростий, інтуїтивнийМоже бути зміщеним при асиметричних даних
БазовийСиметричні інтервалиМоже давати від’ємні значення
BCaНайточніший, враховує трансформаціїОбчислювально інтенсивний

Розібраний приклад: ненормальні дані

Розглянемо 15 вимірювань часу реакції (у мс): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Ці дані мають правосторонню асиметрію (деякі дуже повільні відповіді).

1

Обчислити вибіркове СВ

Вихідна вибірка: n=15, SD = 109,8 мс
2

Згенерувати бутстреп-вибірки

Побудуйте 10 000 вибірок розміром 15 із поверненням. Кожна вибірка має різний склад.
3

Обчислити бутстреп-СВ

Розрахуйте СВ для кожної бутстреп-вибірки, отримавши 10 000 значень у діапазоні приблизно від ~60 до ~180
4

Знайти перцентилі

2,5-й перцентиль: 72,3 мс, 97,5-й перцентиль: 156,8 мс
5

Побудувати 95% ДІ

95% ДІ: [72,3; 156,8] мс. Порівняйте з ДІ за хі-квадратом: [79,4; 175,2], який припускає нормальність.

Бутстреп-ДІ є асиметричним (ширший з правого боку), що відображає правосторонню асиметрію даних. ДІ за хі-квадратом не вловлює цю асиметрію.

Реалізація на Python

Повна реалізація бутстрепу з кількома методами побудови довірчих інтервалів:

python
import numpy as np
from scipy import stats

def bootstrap_sd_ci(data, n_bootstrap=10000, ci=0.95, method='percentile'):
    """
    Bootstrap confidence interval for standard deviation.

    Parameters:
    -----------
    data : array-like - Original sample
    n_bootstrap : int - Number of bootstrap samples
    ci : float - Confidence level (e.g., 0.95)
    method : str - 'percentile', 'basic', or 'bca'

    Returns:
    --------
    tuple : (lower_bound, upper_bound, bootstrap_sds)
    """
    data = np.array(data)
    n = len(data)
    original_sd = np.std(data, ddof=1)

    # Generate bootstrap samples and calculate SDs
    bootstrap_sds = np.array([
        np.std(np.random.choice(data, size=n, replace=True), ddof=1)
        for _ in range(n_bootstrap)
    ])

    alpha = 1 - ci

    if method == 'percentile':
        lower = np.percentile(bootstrap_sds, 100 * alpha/2)
        upper = np.percentile(bootstrap_sds, 100 * (1 - alpha/2))

    elif method == 'basic':
        lower = 2*original_sd - np.percentile(bootstrap_sds, 100*(1-alpha/2))
        upper = 2*original_sd - np.percentile(bootstrap_sds, 100*alpha/2)

    elif method == 'bca':
        # Bias correction
        prop_less = np.mean(bootstrap_sds < original_sd)
        z0 = stats.norm.ppf(prop_less)

        # Acceleration (jackknife estimate)
        jackknife_sds = np.array([
            np.std(np.delete(data, i), ddof=1) for i in range(n)
        ])
        jack_mean = jackknife_sds.mean()
        a = np.sum((jack_mean - jackknife_sds)**3) / \
            (6 * np.sum((jack_mean - jackknife_sds)**2)**1.5)

        # Adjusted percentiles
        z_alpha = stats.norm.ppf([alpha/2, 1-alpha/2])
        adj_percentiles = stats.norm.cdf(
            z0 + (z0 + z_alpha) / (1 - a*(z0 + z_alpha))
        ) * 100
        lower = np.percentile(bootstrap_sds, adj_percentiles[0])
        upper = np.percentile(bootstrap_sds, adj_percentiles[1])

    return lower, upper, bootstrap_sds

# Example usage
response_times = [245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312]

for method in ['percentile', 'basic', 'bca']:
    lower, upper, _ = bootstrap_sd_ci(response_times, method=method)
    print(f"{method.upper():12s} 95% CI: [{lower:.1f}, {upper:.1f}]")