Оценим стандартную ошибку модели для линейных регрессионных моделей а) со всеми объясняющими переменными; б) только с непрерывными объясняющими переменными Будем использовать методы:

методом проверочной выборки с долей обучающей 50%; методом LOOCV; k-кратной кросс-валидацией с k=5 и k=10 Загрузим данные и проведем все необходимые вычисления:

library(MASS)
data(Boston) 
model1 <- lm(crim ~ indus + age + indus:chas + age:chas,
             data = Boston)
summary(model1)
## 
## Call:
## lm(formula = crim ~ indus + age + indus:chas + age:chas, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -11.798  -2.866  -0.598   1.087  81.222 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -3.99849    0.91212  -4.384 1.42e-05 ***
## indus        0.39465    0.06754   5.843 9.22e-09 ***
## age          0.05015    0.01627   3.082  0.00217 ** 
## indus:chas  -0.15806    0.31836  -0.496  0.61977    
## age:chas    -0.01554    0.05544  -0.280  0.77931    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.775 on 501 degrees of freedom
## Multiple R-squared:  0.1894, Adjusted R-squared:  0.183 
## F-statistic: 29.27 on 4 and 501 DF,  p-value: < 2.2e-16
model2 <- lm(crim ~ indus + age + indus:chas,
             data = Boston)
summary(model2)
## 
## Call:
## lm(formula = crim ~ indus + age + indus:chas, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -11.832  -2.848  -0.602   1.084  81.220 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -4.00331    0.91112  -4.394 1.36e-05 ***
## indus        0.39838    0.06616   6.022 3.34e-09 ***
## age          0.04949    0.01609   3.076  0.00221 ** 
## indus:chas  -0.24299    0.09782  -2.484  0.01331 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.768 on 502 degrees of freedom
## Multiple R-squared:  0.1893, Adjusted R-squared:  0.1845 
## F-statistic: 39.08 on 3 and 502 DF,  p-value: < 2.2e-16
#общее число наблюдений
m <- nrow(Boston)

# доля обучающей выборки
train.percent <- 0.5 

# выбрать наблюдения в обучающую выборку
inTrain <- sample(m, m * train.percent)
inTrain
##   [1] 260 105 340 351 460 321 211 120 320 358 421 365 116  56 230 385 152
##  [18] 199 145 143 136 188 190 296 503 295 307 115 185  79 488 294 231 240
##  [35] 279 158 432 389  80 147 450 350  99 248  44 416  20 462 400 370 444
##  [52]   8 371 221  43 467 395 191  87 454 472 213 179 392 388  19  61 285
##  [69]  97 407  71 149   2 355 438  24 409 363 499 173 268 272 463  23 204
##  [86] 360 202 119 429 411 487  84 357 393 446 457  70  34  76 428 368 102
## [103]  14 171 282 238  18 280 154 243 469 311 451 401 491 439 433 445 352
## [120] 384 100 237   9 121 324 124 142  46  48  31 144 313  41 210  11 156
## [137]   3 110 465 484 453 497   1 394 259 455 299 234 281 339 269 346 375
## [154] 246  67 386 198 319  94 335  53  65 315 424 175  62 264 274 332  49
## [171] 500 498 255 180 382 309 336 390 222 220 205 101 196 325   4 177 440
## [188] 442 329 414 232  16 397  98 502 405  75 262 112 104 423  95  38 174
## [205] 477 108 113 431 349 459  45 458 425 217  33 157 447 373 195 316  68
## [222] 241 417 448 165 310 235 475 347 148 208 129 441 160 367 489 245 224
## [239] 138 109 378  59  93 306 478 300 141 123 293 369  81 212 139
# Линейная модель(a) ##############################################################

# присоединить таблицу с данными: названия стоблцов будут доступны напрямую
attach(Boston)
# подгонка линейной модели на обучающей выборке
fit.lm.1 <- lm(crim ~ indus + age + indus:chas, 
               subset = inTrain)

# считаем MSE на тестовой выборке
mean.a.1 <- mean((crim[-inTrain] - predict(fit.lm.1,
                                           Boston[-inTrain, ]))^2)

# отсоединить таблицу с данными
detach(Boston)

# Квадратичная модель ##########################################################

# присоединить таблицу с данными: названия стоблцов будут доступны напрямую
attach(Boston)
# подгонка линейной модели на обучающей выборке
fit.lm.2 <- lm(crim ~ poly(age,2) + poly(indus, 2) + indus:chas, 
               subset = inTrain)
summary(fit.lm.2)
## 
## Call:
## lm(formula = crim ~ poly(age, 2) + poly(indus, 2) + indus:chas, 
##     subset = inTrain)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.226 -3.246 -0.605  1.619 42.692 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       3.5391     0.3819   9.268  < 2e-16 ***
## poly(age, 2)1    23.3584    11.3953   2.050   0.0414 *  
## poly(age, 2)2    15.9602     9.3043   1.715   0.0875 .  
## poly(indus, 2)1  59.7007    11.4077   5.233 3.56e-07 ***
## poly(indus, 2)2 -17.8190     8.7368  -2.040   0.0425 *  
## indus:chas       -0.1880     0.1004  -1.872   0.0624 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.848 on 247 degrees of freedom
## Multiple R-squared:  0.283,  Adjusted R-squared:  0.2684 
## F-statistic: 19.49 on 5 and 247 DF,  p-value: 2.35e-16
fit.lm.2.1 <- lm(crim ~ poly(age,2) + poly(indus, 2), 
                 subset = inTrain)
summary(fit.lm.2.1)
## 
## Call:
## lm(formula = crim ~ poly(age, 2) + poly(indus, 2), subset = inTrain)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.984 -3.156 -0.558  1.622 43.016 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       3.3671     0.3725   9.039  < 2e-16 ***
## poly(age, 2)1    21.9676    11.4284   1.922   0.0557 .  
## poly(age, 2)2    16.0476     9.3511   1.716   0.0874 .  
## poly(indus, 2)1  58.2974    11.4404   5.096 6.89e-07 ***
## poly(indus, 2)2 -16.1585     8.7355  -1.850   0.0655 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.878 on 248 degrees of freedom
## Multiple R-squared:  0.2728, Adjusted R-squared:  0.2611 
## F-statistic: 23.26 on 4 and 248 DF,  p-value: 2.445e-16
# считаем MSE на тестовой выборке
mean.a.2 <- mean((crim[-inTrain] - predict(fit.lm.2.1,
                                           Boston[-inTrain, ]))^2)

# отсоединить таблицу с данными
detach(Boston)

# Кубическая модель ############################################################

# присоединить таблицу с данными: названия стоблцов будут доступны напрямую
attach(Boston)
# подгонка линейной модели на обучающей выборке
fit.lm.3 <- lm(crim ~ poly(age,3) + poly(indus, 3) + indus:chas, 
               subset = inTrain) 
summary(fit.lm.3)
## 
## Call:
## lm(formula = crim ~ poly(age, 3) + poly(indus, 3) + indus:chas, 
##     subset = inTrain)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.544 -1.903 -0.326  1.024 41.179 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       3.45196    0.35492   9.726  < 2e-16 ***
## poly(age, 3)1    23.84287   10.58623   2.252  0.02519 *  
## poly(age, 3)2     8.92303    8.76261   1.018  0.30954    
## poly(age, 3)3     4.96348    8.20359   0.605  0.54571    
## poly(indus, 3)1  59.11759   10.59758   5.578 6.41e-08 ***
## poly(indus, 3)2 -22.01279    8.32821  -2.643  0.00874 ** 
## poly(indus, 3)3 -50.50186    8.15377  -6.194 2.46e-09 ***
## indus:chas       -0.21440    0.09334  -2.297  0.02246 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.431 on 245 degrees of freedom
## Multiple R-squared:  0.3866, Adjusted R-squared:  0.3691 
## F-statistic: 22.06 on 7 and 245 DF,  p-value: < 2.2e-16
# считаем MSE на тестовой выборке
mean.a.3 <- mean((crim[-inTrain] - predict(fit.lm.3,
                                           Boston[-inTrain, ]))^2)

# отсоединить таблицу с данными
detach(Boston)

# k-кратная перекрёстная проверка ==============================================

# оценим точность полиномиальных моделей, меняя степень
# вектор с ошибками по 10-кратной кросс-валидации
cv.err.k.fold <- rep(0, 5)
names(cv.err.k.fold) <- 1:5
# цикл по степеням полиномов
for (i in 1:5){
  fit.glm <- glm(crim ~ poly(age,3) + poly(indus, 3) + indus:chas, data = Boston)
  cv.err.k.fold[i] <- cv.glm(Boston, fit.glm,
                             K = 10)$delta[1]
}
# результат
cv.err.k.fold
##        1        2        3        4        5 
## 52.64665 53.25052 52.83313 53.01211 53.11844

Наименьшая ошибка у кубической модели. Она равна 54.13. У к-кратной выборки наименьшая ошибка у i=3.

Проведем аналогичную работу для нашей модели, исключив из нее фактор, оставим только дискретные величины.

# присоединить таблицу с данными: названия стоблцов будут доступны напрямую
attach(Boston)
# подгонка линейной модели на обучающей выборке
fit.lm.1b <- lm(crim ~ indus + age, 
                subset = inTrain)
summary(fit.lm.1b)
## 
## Call:
## lm(formula = crim ~ indus + age, subset = inTrain)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -11.055  -2.767  -0.621   1.173  43.777 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -3.67566    1.06496  -3.451 0.000654 ***
## indus        0.41231    0.07134   5.780 2.22e-08 ***
## age          0.03572    0.01801   1.984 0.048400 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.923 on 250 degrees of freedom
## Multiple R-squared:  0.2555, Adjusted R-squared:  0.2495 
## F-statistic:  42.9 on 2 and 250 DF,  p-value: < 2.2e-16
# считаем MSE на тестовой выборке
mean.b.1 <- mean((crim[-inTrain] - predict(fit.lm.1b,
                                           Boston[-inTrain, ]))^2)

# отсоединить таблицу с данными
detach(Boston)

# Квадратичная модель ##########################################################

# присоединить таблицу с данными: названия стоблцов будут доступны напрямую
attach(Boston)
# подгонка линейной модели на обучающей выборке
fit.lm.2b <- lm(crim ~ poly(age,2) + poly(indus, 2), 
                subset = inTrain)
summary(fit.lm.2b)
## 
## Call:
## lm(formula = crim ~ poly(age, 2) + poly(indus, 2), subset = inTrain)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.984 -3.156 -0.558  1.622 43.016 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       3.3671     0.3725   9.039  < 2e-16 ***
## poly(age, 2)1    21.9676    11.4284   1.922   0.0557 .  
## poly(age, 2)2    16.0476     9.3511   1.716   0.0874 .  
## poly(indus, 2)1  58.2974    11.4404   5.096 6.89e-07 ***
## poly(indus, 2)2 -16.1585     8.7355  -1.850   0.0655 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.878 on 248 degrees of freedom
## Multiple R-squared:  0.2728, Adjusted R-squared:  0.2611 
## F-statistic: 23.26 on 4 and 248 DF,  p-value: 2.445e-16
# считаем MSE на тестовой выборке
mean.b.2 <- mean((crim[-inTrain] - predict(fit.lm.2b,
                                           Boston[-inTrain, ]))^2)

# отсоединить таблицу с данными
detach(Boston)

# Кубическая модель ############################################################

# присоединить таблицу с данными: названия стоблцов будут доступны напрямую
attach(Boston)
# подгонка линейной модели на обучающей выборке
fit.lm.3b <- lm(crim ~ poly(age,3) + poly(indus, 3), 
                subset = inTrain) 
summary(fit.lm.3b)
## 
## Call:
## lm(formula = crim ~ poly(age, 3) + poly(indus, 3), subset = inTrain)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.189 -1.932 -0.237  1.068 41.564 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       3.2574     0.3477   9.370  < 2e-16 ***
## poly(age, 3)1    22.2582    10.6551   2.089   0.0377 *  
## poly(age, 3)2     9.1111     8.8381   1.031   0.3036    
## poly(age, 3)3     5.0719     8.2745   0.613   0.5405    
## poly(indus, 3)1  57.5353    10.6667   5.394 1.62e-07 ***
## poly(indus, 3)2 -20.0971     8.3581  -2.405   0.0169 *  
## poly(indus, 3)3 -49.6581     8.2160  -6.044 5.53e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.478 on 246 degrees of freedom
## Multiple R-squared:  0.3734, Adjusted R-squared:  0.3581 
## F-statistic: 24.43 on 6 and 246 DF,  p-value: < 2.2e-16
# считаем MSE на тестовой выборке
mean.b.3 <- mean((crim[-inTrain] - predict(fit.lm.3b,
                                           Boston[-inTrain, ]))^2)

# отсоединить таблицу с данными
detach(Boston)

# k-кратная перекрёстная проверка ==============================================

# оценим точность полиномиальных моделей, меняя степень
# вектор с ошибками по 10-кратной кросс-валидации
cv.err.k.fold.b <- rep(0, 5)
names(cv.err.k.fold.b) <- 1:5
# цикл по степеням полиномов
for (i in 1:5){
  fit.glm.b <- glm(crim ~ poly(age,3) + poly(indus, 3), data = Boston)
  cv.err.k.fold.b[i] <- cv.glm(Boston, fit.glm,
                               K = 10)$delta[1]
}
# результат
cv.err.k.fold.b
##        1        2        3        4        5 
## 52.75442 52.59038 53.19932 52.72476 53.05409

в этом случае наименьшая оштбка также у кубической модели. Она равна 54,52. У к-кратной выборки наименьшая ошибка у i=4.

Применим бутстреп к нашей модели, сравним ее показатели с оценками, полученными с помощью МНК.

attach(Boston)
boot.fn <- function(data, index){
  coef(lm(crim ~ poly(age,3) + poly(indus, 3) + indus:chas, subset = index))
}
boot.fn(Boston, 1:506)
##     (Intercept)   poly(age, 3)1   poly(age, 3)2   poly(age, 3)3 
##       3.8738819      30.1766409      20.2827291      15.6602755 
## poly(indus, 3)1 poly(indus, 3)2 poly(indus, 3)3      indus:chas 
##      57.2257259     -28.2091081     -49.6572388      -0.2959349
# применяем функцию boot для вычисления стандартных ошибок параметров
#  (1000 выборок с повторами)
boot(Boston, boot.fn, 1000)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = Boston, statistic = boot.fn, R = 1000)
## 
## 
## Bootstrap Statistics :
##        original        bias    std. error
## t1*   3.8738819 -0.0104830183  0.35556340
## t2*  30.1766409 -0.0302793177  6.71623769
## t3*  20.2827291 -0.0780726953  6.58510902
## t4*  15.6602755  0.1160958063  7.20312225
## t5*  57.2257259 -0.4994779639  7.33903987
## t6* -28.2091081 -0.9736492584  5.77745850
## t7* -49.6572388 -0.8332395312  6.44087038
## t8*  -0.2959349  0.0007056421  0.05144689
# сравним с МНК
attach(Boston)
summary(lm(crim ~ poly(age,3) + poly(indus, 3) + indus:chas))$coef
##                    Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)       3.8738819  0.33243436 11.653073 6.449355e-28
## poly(age, 3)1    30.1766409  9.81390385  3.074887 2.221466e-03
## poly(age, 3)2    20.2827291  7.76149057  2.613252 9.239761e-03
## poly(age, 3)3    15.6602755  7.48825414  2.091312 3.700621e-02
## poly(indus, 3)1  57.2257259 10.16909934  5.627413 3.056997e-08
## poly(indus, 3)2 -28.2091081  7.42224589 -3.800616 1.622093e-04
## poly(indus, 3)3 -49.6572388  7.44514574 -6.669747 6.829902e-11
## indus:chas       -0.2959349  0.09188861 -3.220583 1.362901e-03

Оценки получились в обоих случаях практически одинаковыми, различаются они лишь ошибками, так что нельзя сказать какая модель лучше.