Comments 6
Не до конца понял, почему bootstrap можно использовать для расчета p-value в случае зависимых наблюдений. Тут предпосылки для ЦПТ не должны выполняться?
Потому что это непараметрический метод, он ничего "не знает" об исходных данных и ему не нужны предпосылки или предположения об их природе, в отличие от ЦПТ. Бутстрап просто на основе имеющихся данных путем многих вычислений дает возможность построить эмпирическое распределение интересующей статистики и из этого распределения поотвечать на имеющиеся вопросы.
Не совсем понял, но чем то методика напомнила монте-карло.
Да, действительно все так, в бутстрапе заложена такая идея.
Помимо бутстрапа есть еще перестановочные тесты, там элементы не возвращаются в исходную выборку. В таких тестах мы две выборки объединяем в одну и потом опять делим рандомно на 2 и так много раз.
Можно сделать исчерпывающий перестановочный тест, т.е. перебрать все имеющиеся сочетания, но их будет очень мноооого, а можно приблизительный, ограничив константой, это будет уже больше похоже на монте-карло)
Проблема вычислительных мощностей для бутстрапа может быть решена с помощью пуассоновского бутстрапа. Можно посмотреть тут: https://www.unofficialgoogledatascience.com/2015/08/an-introduction-to-poisson-bootstrap26.html?m=1
Посмотрел. Пуассоновский бутсрап не решает проблему вычислительных мощностей для повторного отбора (по крайней мере на одной машине), в статье такого тезиса просто нет. Там с помощью пуассоновского бутстрапа решается проблема как сгенерировать бутстрапированные выборки, не вынимая всю выборку при параллельных вычислениях, когда размер выборки n заранее не известен, а данные хранятся распределено.
Проверил разные реализации на одной машина на Python по самым затратным операциям — генерациям подвыборок. Пуассоновский бутстрап по времени оказывался не быстрее отбора с повторением, а иногда и медленнее.
import numpy as np
import pandas as pd
# df = pd.read_csv('file_name.csv')
data = df.n_bnr_clkd.values
n_trial = 5_000
print(n_trial, len(data)) # 5000, 449417
# Итерации отбора с повторением
%%time
for _ in range(n_trial):
_ = np.random.choice(data, size=len(data))
# Wall time: 11.8 s
# Итерации Пуассона
%%time
for _ in range(n_trial):
_ = np.random.poisson (1, size=len(data))
# Wall time: 58.7 s
# Генерация матрицы отбора с повторением
%%time
_ = np.random.choice(data, size=(n_trial, len(data)))
# Wall time: 59.7 s
# Генерация матрицы Пуассона
%%time
_ = np.random.poisson(1, size=(n_trial, len(data)))
# Wall time: 1min 8s
Бутстрап: швейцарский нож аналитика в A/B-тестах