Задание 1-2. Датасет и разведочный анализ

В качестве данных для 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

Вывод по EDA

Набор mtcars содержит 32 наблюдения. Между объемом двигателя и расходом топлива наблюдается обратная линейная зависимость: чем больше объем, тем меньше миль на галлон. Базовая модель показывает \(R^2 \approx 0.718\), то есть около 72% дисперсии расхода топлива объясняется объемом двигателя. Оценим надежность этого показателя с помощью бутстрапа.

Задание 4. Бутстрап на R (Слайд 21)

Реализуем бутстрап коэффициента детерминации \(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-части

Исходный \(R^2\) модели составил 0.718. После 2000 бутстрап-итераций среднее смещение (bias) очень мало (0.002), а стандартная ошибка (std. error) равна 0.065. 95% BCa-доверительный интервал составил [0.535, 0.819]. Поскольку интервал не включает ноль и лежит в положительной области, можно утверждать, что связь между объемом двигателя и расходом топлива статистически значима и устойчива. Бутстрап подтвердил, что высокая объясняющая способность модели не является случайной особенностью исходной выборки.

Задание 5. Итоговый вывод

В ходе работы были реализованы два разных сценария применения бутстрапа. В Python решалась задача сравнения квантилей двух выборок (проверка гипотезы о значимости различий), в R — задача оценки стабильности параметра регрессионной модели (\(R^2\)). Обе реализации показали, что бутстрап является мощным инструментом, не требующим предположений о нормальности распределения данных. Использование перцентильных и BCa-интервалов позволяет делать надежные статистические выводы даже на выборках небольшого размера, как в случае с mtcars.