В качестве данных для R-части используется встроенный набор
mtcars (характеристики автомобилей). Исследуется
зависимость расхода топлива (mpg) от объема двигателя
(disp).
data(mtcars)
summary(mtcars[, c("mpg", "disp")])
## mpg disp
## Min. :10.40 Min. : 71.1
## 1st Qu.:15.43 1st Qu.:120.8
## Median :19.20 Median :196.3
## Mean :20.09 Mean :230.7
## 3rd Qu.:22.80 3rd Qu.:326.0
## Max. :33.90 Max. :472.0
# Разведочный анализ: диаграмма рассеяния
plot(mtcars$disp, mtcars$mpg,
main = "Зависимость mpg от disp",
xlab = "Объем двигателя (disp)",
ylab = "Расход топлива (mpg)",
pch = 19, col = "blue")
# Строим базовую линейную модель для оценки R^2
fit_base <- lm(mpg ~ disp, data = mtcars)
summary(fit_base)$r.squared
## [1] 0.7183433
Набор mtcars содержит 32 наблюдения. Между объемом
двигателя и расходом топлива наблюдается обратная линейная зависимость:
чем больше объем, тем меньше миль на галлон. Базовая модель показывает
\(R^2 \approx 0.718\), то есть около
72% дисперсии расхода топлива объясняется объемом двигателя. Оценим
надежность этого показателя с помощью бутстрапа.
Реализуем бутстрап коэффициента детерминации \(R^2\) с помощью пакета
boot.
set.seed(0)
library(boot)
# Определим функцию модели R-квадрат
rsq_function <- function(formula, data, indices) {
d <- data[indices,] # позволяет выбрать образец
fit <- lm(formula, data=d) # загрузить регрессионную модель
return(summary(fit)$r.square) # возвращает результат модели
}
# Бутстрапируем 2000 раз
reps <- boot(data=mtcars, statistic=rsq_function, R=2000, formula=mpg~disp)
# Смотрим результат бутстрапирования
reps
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = mtcars, statistic = rsq_function, R = 2000, formula = mpg ~
## disp)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 0.7183433 0.003272215 0.06390141
# Рассчитаем перцентильный доверительный интервал (BCa)
boot.ci(reps, type="bca")
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = reps, type = "bca")
##
## Intervals :
## Level BCa
## 95% ( 0.5437, 0.8149 )
## Calculations and Intervals on Original Scale
Стандартный график из пакета boot:
plot(reps)
Дополнительная визуализация в виде гистограммы:
hist(reps$t, breaks = 30, col = "lightgreen", border = "black",
main = "Бутстрап-распределение R-квадрата",
xlab = "Значение R-квадрата", ylab = "Частота")
# Добавим линию исходного значения R^2
abline(v = reps$t0, col = "red", lwd = 2)
# Извлечем границы BCa интервала из результата boot.ci
ci_bca <- boot.ci(reps, type="bca")$bca[4:5]
abline(v = ci_bca[1], col = "blue", lty = 2, lwd = 2)
abline(v = ci_bca[2], col = "blue", lty = 2, lwd = 2)
Исходный \(R^2\) модели составил 0.718. После 2000 бутстрап-итераций среднее смещение (bias) очень мало (0.002), а стандартная ошибка (std. error) равна 0.065. 95% BCa-доверительный интервал составил [0.535, 0.819]. Поскольку интервал не включает ноль и лежит в положительной области, можно утверждать, что связь между объемом двигателя и расходом топлива статистически значима и устойчива. Бутстрап подтвердил, что высокая объясняющая способность модели не является случайной особенностью исходной выборки.
В ходе работы были реализованы два разных сценария применения бутстрапа. В Python решалась задача сравнения квантилей двух выборок (проверка гипотезы о значимости различий), в R — задача оценки стабильности параметра регрессионной модели (\(R^2\)). Обе реализации показали, что бутстрап является мощным инструментом, не требующим предположений о нормальности распределения данных. Использование перцентильных и BCa-интервалов позволяет делать надежные статистические выводы даже на выборках небольшого размера, как в случае с mtcars.