1. Выбор датасета и разведочный анализ данных (EDA)

# Загрузка данных
data(mtcars)

# Структура данных
str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
# Первые несколько строк
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Основные статистики
summary(mtcars)
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000
# Матрица корреляций
cor_matrix <- cor(mtcars)
print(round(cor_matrix, 3))
##         mpg    cyl   disp     hp   drat     wt   qsec     vs     am   gear
## mpg   1.000 -0.852 -0.848 -0.776  0.681 -0.868  0.419  0.664  0.600  0.480
## cyl  -0.852  1.000  0.902  0.832 -0.700  0.782 -0.591 -0.811 -0.523 -0.493
## disp -0.848  0.902  1.000  0.791 -0.710  0.888 -0.434 -0.710 -0.591 -0.556
## hp   -0.776  0.832  0.791  1.000 -0.449  0.659 -0.708 -0.723 -0.243 -0.126
## drat  0.681 -0.700 -0.710 -0.449  1.000 -0.712  0.091  0.440  0.713  0.700
## wt   -0.868  0.782  0.888  0.659 -0.712  1.000 -0.175 -0.555 -0.692 -0.583
## qsec  0.419 -0.591 -0.434 -0.708  0.091 -0.175  1.000  0.745 -0.230 -0.213
## vs    0.664 -0.811 -0.710 -0.723  0.440 -0.555  0.745  1.000  0.168  0.206
## am    0.600 -0.523 -0.591 -0.243  0.713 -0.692 -0.230  0.168  1.000  0.794
## gear  0.480 -0.493 -0.556 -0.126  0.700 -0.583 -0.213  0.206  0.794  1.000
## carb -0.551  0.527  0.395  0.750 -0.091  0.428 -0.656 -0.570  0.058  0.274
##        carb
## mpg  -0.551
## cyl   0.527
## disp  0.395
## hp    0.750
## drat -0.091
## wt    0.428
## qsec -0.656
## vs   -0.570
## am    0.058
## gear  0.274
## carb  1.000
# Визуализация попарных зависимостей
pairs(mtcars[, c("mpg", "disp", "hp", "wt")], 
      main = "Парные графики для основных переменных mtcars",
      col = "steelblue", pch = 19)

2. Адаптация программы бутстрапа на R

set.seed(42)

# Функция для вычисления 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)

# Вывод результатов
print(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.002527745    0.065857
# Доверительный интервал
ci <- boot.ci(reps, type = c("norm", "basic", "perc", "bca"))
print(ci)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = reps, type = c("norm", "basic", "perc", "bca"))
## 
## Intervals : 
## Level      Normal              Basic         
## 95%   ( 0.5867,  0.8449 )   ( 0.6029,  0.8662 )  
## 
## Level     Percentile            BCa          
## 95%   ( 0.5705,  0.8338 )   ( 0.5426,  0.8161 )  
## Calculations and Intervals on Original Scale

3. Визуализация результатов бутстрапа

# Подготовка данных для визуализации
boot_stats <- data.frame(r_squared = reps$t)
original_r2 <- round(reps$t0, 4)
ci_bca <- boot.ci(reps, type = "bca")
ci_lower <- round(ci_bca$bca[4], 4)
ci_upper <- round(ci_bca$bca[5], 4)

# Гистограмма распределения R^2
p1 <- ggplot(boot_stats, aes(x = r_squared)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30, 
                 fill = "steelblue", color = "black", alpha = 0.7) +
  geom_density(color = "darkred", linewidth = 1) +
  geom_vline(xintercept = original_r2, color = "darkgreen", 
             linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = ci_lower, color = "orange", 
             linetype = "dotted", linewidth = 1) +
  geom_vline(xintercept = ci_upper, color = "orange", 
             linetype = "dotted", linewidth = 1) +
  labs(title = "Бутстрап распределение R²",
       subtitle = paste0("Модель: mpg ~ disp (исходный R² = ", original_r2, ")"),
       x = expression(R^2), y = "Плотность") +
  annotate("text", x = ci_lower - 0.03, y = 4, 
           label = paste0("95% BCa CI: [", ci_lower, ", ", ci_upper, "]"),
           color = "orange", size = 3) +
  theme_minimal()

# Q-Q plot для проверки нормальности
p2 <- ggplot(boot_stats, aes(sample = r_squared)) +
  stat_qq() +
  stat_qq_line(color = "red") +
  labs(title = "Q-Q график",
       x = "Теоретические квантили",
       y = "Выборочные квантили") +
  theme_minimal()

# График зависимости с доверительной полосой
p3 <- ggplot(mtcars, aes(x = disp, y = mpg)) +
  geom_point(size = 2, color = "steelblue") +
  geom_smooth(method = "lm", se = TRUE, color = "darkred", fill = "lightpink") +
  labs(title = "Зависимость mpg от disp с 95% доверительной полосой",
       x = "Объем двигателя (куб. дюймы)",
       y = "Расход топлива (мили на галлон)") +
  theme_minimal()

# Вывод графиков
grid.arrange(p1, p2, p3, ncol = 2, nrow = 2)

4. Выводы

## ========================================
## РЕЗУЛЬТАТЫ БУТСТРАП АНАЛИЗА
## ========================================
## Исходная модель: mpg ~ disp
## R² на исходных данных: 0.7183
## Стандартная ошибка R²: 0.0659
## Смещение (bias): 0.0025
## 95% доверительный интервал для R²: [ 0.5426 ,  0.8161 ]
## ВЫВОДЫ:
## 1. Модель объясняет 71.8 % дисперсии расхода топлива (mpg) с помощью объема двигателя (disp).
## 2. Стандартная ошибка R² составляет 0.0659 , что указывает на умеренную стабильность оценки.
## 3. Доверительный интервал [ 0.5426 ,  0.8161 ] не включает ноль, что подтверждает статистическую значимость модели.
## 4. Распределение бутстрап-статистик близко к нормальному, что подтверждается Q-Q графиком.
## 5. Метод бутстрапа позволил оценить неопределенность параметров модели
##    без параметрических предположений о распределении ошибок.