## Warning: package 'gam' was built under R version 3.4.4
## Loading required package: foreach
## Warning: package 'foreach' was built under R version 3.4.4
## Loaded gam 1.15
## Warning: package 'akima' was built under R version 3.4.4
## 'data.frame': 506 obs. of 14 variables:
## $ crim : num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
## $ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
## $ indus : num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
## $ chas : int 0 0 0 0 0 0 0 0 0 0 ...
## $ nox : num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
## $ rm : num 6.58 6.42 7.18 7 7.15 ...
## $ age : num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
## $ dis : num 4.09 4.97 4.97 6.06 6.06 ...
## $ rad : int 1 2 2 3 3 3 5 5 5 5 ...
## $ tax : num 296 242 242 222 222 222 311 311 311 311 ...
## $ ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
## $ black : num 397 397 393 395 397 ...
## $ lstat : num 4.98 9.14 4.03 2.94 5.33 ...
## $ medv : num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
Будем работать с переменными crim(количество преступлений) и nox(концентрация оксидов азота).
Судя по графику, можно сказать, что данные неоднородны, посмотрев на структуру, убеждаемся, что разброс переменной crim очень высок. Проведем границу на 30.
Получаем регрессионный анализ для полинома 3 степени.
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.61 0.32 11.24 0
## poly(nox, 3)1 81.37 7.23 11.25 0
## poly(nox, 3)2 -28.83 7.23 -3.99 0
## poly(nox, 3)3 -60.36 7.23 -8.34 0
## 1 2 3
## [1,] -0.006 -0.033 0.040
## [2,] -0.033 0.003 0.028
## [3,] -0.033 0.003 0.028
## [4,] -0.037 0.011 0.019
## [5,] -0.037 0.011 0.019
## [6,] -0.037 0.011 0.019
## 1 2 3
## [1,] 0.538 0.289 0.156
## [2,] 0.469 0.220 0.103
## [3,] 0.469 0.220 0.103
## [4,] 0.458 0.210 0.096
## [5,] 0.458 0.210 0.096
## [6,] 0.458 0.210 0.096
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 233.09 33.64 6.93 0
## poly(nox, 3, raw = T)1 -1279.37 170.40 -7.51 0
## poly(nox, 3, raw = T)2 2248.54 279.90 8.03 0
## poly(nox, 3, raw = T)3 -1245.70 149.28 -8.34 0
Получаем границы доверительного интервала.
## lower.bound upper.bound
## 1 0.40 5.06
## 2 0.34 4.93
## 3 0.28 4.79
## 4 0.22 4.66
## 5 0.17 4.53
## 6 0.11 4.41
Заметно, что график полностью находится в пределах доверительной области.
Модель anova говорит нам о том, что полином четвертой степени ухудшает модель, поэтому стоит остановиться на полиноме третьей степени.
## Analysis of Variance Table
##
## Model 1: crim ~ nox
## Model 2: crim ~ poly(nox, 2)
## Model 3: crim ~ poly(nox, 3)
## Model 4: crim ~ poly(nox, 4)
## Model 5: crim ~ poly(nox, 5)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 504 30742
## 2 503 29911 1 831.1 16.49 <2e-16 ***
## 3 502 26267 1 3643.6 72.31 <2e-16 ***
## 4 501 26266 1 1.1 0.02 0.89
## 5 500 25193 1 1072.8 21.29 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Очень заметен слишком высокий доверительный интервал при минимальных значениях nox, что в очередной раз указывает на неоднородность данных.
## lower.bound upper.bound
## 1 0 1
## 2 0 1
## 3 0 1
## 4 0 1
## 5 0 1
## 6 0 1
Теперь построим ступенчатую функцию для нашей модел с учетом P(crim>30). Мы решили поделить на 3 интервала.
##
## (0.385,0.547] (0.547,0.709] (0.709,0.871]
## 293 152 61
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.29 0.45 0.64 0.52
## cut(nox, 3)(0.547,0.709] 8.60 0.76 11.25 0.00
## cut(nox, 3)(0.709,0.871] 6.16 1.08 5.72 0.00
Теперь построим тот же график с вероятностями. Верхние границы 1-ого и 3-ого интервалов не определены. График показывает, что как раз таким там, где доверительнный интервал отчетливо виден, вероятность преступления гораздо выше, чем в 2 других, отсюда такое закономерное изображение графика.
## lower.bound upper.bound
## 1 0 NaN
## 2 0 NaN
## 3 0 NaN
## 4 0 NaN
## 5 0 NaN
## 6 0 NaN
Как итог, я считаю, что не стоит работать с этой моделью, пока мы не сократим выборку, либо будем брать ее на отдельных интервалах, также можно попробовать избавиться от аномальных значений.