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, 2, \ldots, 8\}\) как процедуру последовательного подбрасывания восьмигранной кости?
Когда на практике построение выборки с возвращением и без возвращения эквивалентны?
Эмпирическая функция распределения.¶
Также вспомним, что на основе выборки можно построить оценку функции распределения, из которого были взяты наблюдения. Для этого для каждого значения \(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, ']')