Bootstrap

Идея.

Пусть на основе выборки \(X_1,\) \(\ldots\), \(X_n\) мы каким-то способом получили точечную оценку неизвестного параметра \(\theta\) и обозначили её \(\hat{\theta}\). Теперь наша цель состоит в том, чтобы построить асимптотический доверительный интервал для \(\theta\). Bootstrap предлагает оценить дисперсию \(\hat{\theta}\) на основе тех же данных, на которых была получена сама оценка \(\hat{\theta}\).

“Pull oneself up by one’s bootstraps”: (idiomatic) To succeed only by one’s own efforts or abilities. (Wiktionary)


Построение выборки (Sampling).

Вспомним, что построением выборки (sampling) называется выбор элементов генеральной совокупности (какого-то множетства или распределения). Случайная выборка строится путём случайного выбора наблюдений. Случайную выборку можно строить двумя способами:

  • без возвращения (without replacement, simple random sampling),

  • с возвращением (with replacement).

Вопросы на подумать:

  1. Можно ли рассматривать построение выборки с возвращением из множества \(\{1, 2, \ldots, 8\}\) как процедуру последовательного подбрасывания восьмигранной кости?

  2. Когда на практике построение выборки с возвращением и без возвращения эквивалентны?


Эмпирическая функция распределения.

Также вспомним, что на основе выборки можно построить оценку функции распределения, из которого были взяты наблюдения. Для этого для каждого значения \(x_i\) рассчитывается его доля в выборке.


Построение boostrap-выборки (Resampling).

Построением boostrap-выборки (resampling) называется построение выборки с возвращением из эмпирического распределения.

Пример 1: пусть имеется набор чисел \(1\), \(1\), \(2\), \(3\), \(10\), \(11\), \(11\), который рассматривается как выборка, взятая из какого-то распределения. Чтобы построить выборку с возвращением из эмпирического распределения, мы должны сложить эти числа в шляпу и не глядя вытаскивать их одно за другим, записывая результат и возвращая число обратно.

Формально: пусть дана выборка \(X_1\), \(\ldots\), \(X_n\). Построением boostrap-выборки называется выбор номера \(i\) из равновероятного на \(\{1, 2, \ldots n\}\) распределения и взятие \(X_i\) как одного значения этой выборки.

Продолжение примера 1: пусть мы хотим построить boostrap-выборку размера 3 для чисел из примера 1. Тогда мы можем подбросить семигранную (так как семь наблюдений) кость три раза и, например, получить: $\( 3, 3, 7, 1 \)\( Тогда boostrap-выборка будет: \)\( 2, 2, 11, 1 \)$

Будем обозначать boostrap-выборку как \(X_1^*\), \(\ldots\), \(X_m^*\).


Эмпирический bootstrap.

Выборкой эмпирического bootstrap нызвается boostrap-выборка того же размера, что и оригинальная выборка:

для выборки \(X_1\), \(\ldots\), \(X_n\) это \(X_1^*\), \(\ldots\), \(X_n^*\). Тогда boostrap говорит, что \(F \approx F^*\), а дисперсия статистики, рассчитанной на основе выборки \(X\), примерно равна дисперсии статистики, рассчитанной на основе \(X^*\).

1. Reverse bootstrap percentile.

Пример 2: пусть дана выборка из некоторого распределения с конечным матожиданием \(\mu\):

X = [30, 37, 36, 43, 42, 43, 43, 46, 41, 42]

Постройте 80% доверительный интервал для \(\mu\).

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
## Шаг 1: Найдите точечную оценку неизвестного параметра
# (ML)
mu_hat =
mu_hat

Мы бы хотели найти распределение величины \(d = \hat{X} - \mu\), потому что тогда мы можем построить доверительный интервал для \(\mu\) как $\( P(d_{0.9} \le \bar{X} - \mu \le d_{0.1}) = 0.8 \Rightarrow \mu \in [\bar{x} - d_{0.1}; \bar{x} - d_{0.9}]. \)$

Boostrap говорит, что распределение \(d\) можно приблизить распределением \(d^* = \bar{x^*} - \bar{x}\).

Удача заключается в том, что можно сгенерировать \(d^*\) сколько угодно раз, а потому возможно получить достаточно точную оценку распределения \(d^*\).

## Шаг 2: Сгенерируйте 20 bootstrap-выборок из X и сохраните их в матрицу n x 20
np.random.seed(123)
bootstrap_samples = 
bootstrap_samples
# Шаг 3: Рассчитайте выборочное среднее по каждой bootstrap-выборке
bootstrap_means = 
bootstrap_means
# Шаг 4: Рассчитайте d*
d_star = 
d_star
# Шаг 5: Найдите 0.1 и 0.9 квантили для d_star
d_star_quant = 
d_star_quant
# Шаг 6: Постройте 80%-ый доверительный интервал для mu
LB = 
UB = 
print('[', LB, ';', UB, ']')

Пример 3: для той же выборки постройте 90%-ый доверительный интервал для медианы.

## Шаг 1: Найдите точечную оценку неизвестного параметра
med = 
## Шаг 2: Сгенерируйте 100 boostrap-выборок из X и сохраните их в матрицу n x 100
bootstrap_samples = 
# Шаг 3: Рассчитайте выборочную медиану по каждой bootstrap-выборке
bootstrap_medians =
# Шаг 4: Рассчитайте d*
d_star = 
# Шаг 5: Найдите 0.05 и 0.95 квантили для d_star
d_star_quant = 
# Шаг 6: Постройте 90%-ый доверительный интервал для медианы
LB = 
UB = 
print('[', LB, ';', UB, ']')

2. t-bootstrap

Идея: сгенерировать не \(d^*\), а $\( t^* = \dfrac{\hat{\theta^*} - \hat{\theta}}{se^{*}} \)$

Пример 4: для той же выборки постройте 80%-ый доверительный интервал для \(\mu\).

## Шаг 1: Найдите точечную оценку неизвестного параметра
x_hat = 
## Шаг 2: Сгенерируйте 100 boostrap-выборок из X и сохраните их в матрицу n x 100
bootstrap_samples = 
# Шаг 3: Рассчитайте выборочное среднее по каждой bootstrap-выборке
bootstrap_means = 
# Шаг 4: Рассчитайте стандартную ошибку по каждой bootstrap-выборке
bootstrap_ses = 
# Шаг 5: Рассчитайте t*
t_star = 
# Шаг 6: Найдите 0.1 и 0.9 квантили для t_star
t_star_quant = 
# Шаг 7: Постройте 80%-ый доверительный интервал для mu
LB = 
UB = 
print('[', LB, ';', UB, ']')

3. Bootstrap percentile method

!Danger: не используйте этот метод.

Идея: использовать распределение не \(d^*\), а распределение \(\hat{\theta^*}\).

Пример 5: для той же выборки постройте 80%-ый доверительный интервал для \(\mu\).

## Шаг 1: Сгенерируйте 100 boostrap-выборок из X и сохраните их в матрицу n x 100
bootstrap_samples = 
# Шаг 2: Рассчитайте выборочное среднее по каждой bootstrap-выборке
bootstrap_means = 
# Шаг 3: Найдите 0.1 и 0.9 квантили для bootstrap_means
quant = 
# Шаг 4: Постройте 80%-ый доверительный интервал для mu
LB = 
UB = 
print('[', LB, ';', UB, ']')

Пример 6: покажите, насколько хорошо различные эмпирические доверительные интервалы накрывают истинное значение параметра.


Параметрический Bootstrap.

Совпадает с reverse bootstrap percentile за исключением того, что bootstrap-выборка набирается из параметризованного распределения.

Пример 7: предположим, что \(X_1\), \(\ldots\), \(X_{300}\) – случайная выборка из экспоненциального exp\((\lambda)\) распределения. Пусть оказалось так, что \(\bar{X} = 2\). Постройте 95%-ый доверительный интервал для \(\lambda\).

## Шаг 1: Найдите точечную оценку неизвестного параметра
lambda_hat = 
## Шаг 2: Сгенерируйте 1000 boostrap-выборок из X и сохраните их в матрицу n x 1000
bootstrap_samples = 
# Шаг 3: Рассчитайте оценку lambda по каждой bootstrap-выборке
lambda_star = 
# Шаг 4: Рассчитайте d*
d_star = 
# Шаг 5: Найдите 0.05 и 0.95 квантили для d_star
d_star_quant = 
# Шаг 6: Постройте 95%-ый доверительный интервал для lambda
LB = 
UB = 
print('[', LB, ';', UB, ']')