Задание 1
Проведена предобработка в экселе: я отчаялась
и сократила названия меток.
Посомтрим категориальную перемнную
regr = lm(Index ~ Activities, data = data)
summary(regr)$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 54.7585115 0.2702369 202.631541 0.00000000
## ActivitiesYes 0.9423778 0.3841756 2.452987 0.01418449
Этап построения регрессионной модели
regres = lm(Index ~ Hours+Scores+Activities+Sleep+Sample, data = data)
summary(regres)
##
## Call:
## lm(formula = Index ~ Hours + Scores + Activities + Sleep + Sample,
## data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.6333 -1.3684 -0.0311 1.3556 8.7932
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -34.075588 0.127143 -268.01 <2e-16 ***
## Hours 2.852982 0.007873 362.35 <2e-16 ***
## Scores 1.018434 0.001175 866.45 <2e-16 ***
## ActivitiesYes 0.612898 0.040781 15.03 <2e-16 ***
## Sleep 0.480560 0.012022 39.97 <2e-16 ***
## Sample 0.193802 0.007110 27.26 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.038 on 9994 degrees of freedom
## Multiple R-squared: 0.9888, Adjusted R-squared: 0.9887
## F-statistic: 1.757e+05 on 5 and 9994 DF, p-value: < 2.2e-16
sjPlot::tab_model(regres)
| Index | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | -34.08 | -34.32 – -33.83 | <0.001 |
| Hours | 2.85 | 2.84 – 2.87 | <0.001 |
| Scores | 1.02 | 1.02 – 1.02 | <0.001 |
| Activities [Yes] | 0.61 | 0.53 – 0.69 | <0.001 |
| Sleep | 0.48 | 0.46 – 0.50 | <0.001 |
| Sample | 0.19 | 0.18 – 0.21 | <0.001 |
| Observations | 10000 | ||
| R2 / R2 adjusted | 0.989 / 0.989 | ||
Все 5 предикторов значимо влияют на итоговый результат: при
увеличении любого предиктора будет увеличиваться индекс успеваемости.
Коэффициент детерминации высокий: 98,9% дисперсии зависимой
переменной объясняется регрессионной моделью.
F-статистика тоже
статистически значима (1.757e+05 on 5 and 9994 DF, p-value: <
2.2e-16)
из интереса (актуальности :( ) уберем показатель сна
для сравнения моделей
regresss = lm(Index ~ Hours+Scores+Activities+Sample, data = data)
summary(regresss)
##
## Call:
## lm(formula = Index ~ Hours + Scores + Activities + Sample, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.8111 -1.4561 -0.0075 1.4583 9.0593
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -30.945965 0.107882 -286.85 <2e-16 ***
## Hours 2.853403 0.008479 336.52 <2e-16 ***
## Scores 1.018722 0.001266 804.80 <2e-16 ***
## ActivitiesYes 0.574765 0.043905 13.09 <2e-16 ***
## Sample 0.195003 0.007657 25.47 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.195 on 9995 degrees of freedom
## Multiple R-squared: 0.987, Adjusted R-squared: 0.9869
## F-statistic: 1.89e+05 on 4 and 9995 DF, p-value: < 2.2e-16
sjPlot::tab_model(regresss)
| Index | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | -30.95 | -31.16 – -30.73 | <0.001 |
| Hours | 2.85 | 2.84 – 2.87 | <0.001 |
| Scores | 1.02 | 1.02 – 1.02 | <0.001 |
| Activities [Yes] | 0.57 | 0.49 – 0.66 | <0.001 |
| Sample | 0.20 | 0.18 – 0.21 | <0.001 |
| Observations | 10000 | ||
| R2 / R2 adjusted | 0.987 / 0.987 | ||
anova(regres, regresss)
## Analysis of Variance Table
##
## Model 1: Index ~ Hours + Scores + Activities + Sleep + Sample
## Model 2: Index ~ Hours + Scores + Activities + Sample
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 9994 41514
## 2 9995 48151 -1 -6637 1597.8 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
модель тоже хорошая, качество снизилось буквально на 1 тысячную.
степень свободы снизилась на 1 единицу, что не особо значимо.
мультиколлинеарность из интереса. Ругался на активизм, пришлось
убрать
library(dplyr)
##
## Присоединяю пакет: 'dplyr'
## Следующие объекты скрыты от 'package:stats':
##
## filter, lag
## Следующие объекты скрыты от 'package:base':
##
## intersect, setdiff, setequal, union
data %>%
dplyr::select(Hours,Scores,Sleep,Sample) %>%
cor()
## Hours Scores Sleep Sample
## Hours 1.000000000 -0.012389916 0.001245198 0.017463168
## Scores -0.012389916 1.000000000 0.005944219 0.007888025
## Sleep 0.001245198 0.005944219 1.000000000 0.003990220
## Sample 0.017463168 0.007888025 0.003990220 1.000000000
достаточно удивительно (для меня), что корреляции между факторами
очень маленькие.
Вывод. Все предикторы: количество часов на
учебу, предшествущие результаты, внеклассная деятельность, сон, эказмены
- влияют на показатель общей успеваемости.Причем если предиктор будет
увелививаться, то и успеваемость будет лучше (в завивисмости от
коэффициента)
Задание 2
в базе пришлось
перекодировать в те же переменные (2 поменять на 0)
library(haven)
kl<-read_sav("C:/Users/malya/Desktop/База_КлимРиск_2023.sav")
перевод в факторы
kl$type <- factor(kl$type)
kl$V1 <- factor(kl$V1)
Формируем регрессионную модель
model_glm <- glm(V19 ~ type + V1 + age_cats3, data = kl, family = "binomial")
summary(model_glm)
##
## Call:
## glm(formula = V19 ~ type + V1 + age_cats3, family = "binomial",
## data = kl)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.23294 0.32249 -3.823 0.000132 ***
## type2 -0.63873 0.48761 -1.310 0.190221
## type3 0.28330 0.52582 0.539 0.590046
## type4 -0.29673 0.26408 -1.124 0.261179
## type5 -0.31947 0.29471 -1.084 0.278358
## type6 -0.06609 0.41086 -0.161 0.872213
## type7 0.31842 0.24093 1.322 0.186291
## V12 0.74930 0.15464 4.845 1.26e-06 ***
## age_cats3 0.41272 0.10530 3.919 8.88e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1151.2 on 834 degrees of freedom
## Residual deviance: 1089.0 on 826 degrees of freedom
## (78 пропущенных наблюдений удалены)
## AIC: 1107
##
## Number of Fisher Scoring iterations: 4
на данном этапе наблюдается несколько значимых перемнных: мужской пол и возраст более 50 лет. Проживание в разном типе района незначимо (было бы интересно), как и возраст до 50 лет и женский пол.
exp(cbind(OR = coef(model_glm), confint(model_glm)))
## Waiting for profiling to be done...
## OR 2.5 % 97.5 %
## (Intercept) 0.2914333 0.1540204 0.5462918
## type2 0.5279611 0.1971553 1.3573295
## type3 1.3274982 0.4823173 3.8931683
## type4 0.7432464 0.4417900 1.2460589
## type5 0.7265321 0.4064793 1.2929272
## type6 0.9360495 0.4174097 2.1052935
## type7 1.3749589 0.8553192 2.2037381
## V12 2.1155227 1.5642667 2.8691308
## age_cats3 1.5109249 1.2305761 1.8601040
Сложноинтерпретируемые к нашем случае шансы: принадлежность к мужскому полу на 113% увеличивает шанс ощущать опасность от таяния ледников (но как бы так не говорят), а возраст более 50 лет - в 118% повышает это чувство.
with(summary(model_glm), 1 - deviance/null.deviance)
## [1] 0.05399195
R2 получился скромный - 0,055. То есть 5% дисперсии перемнной описывается регрессионной моделью. Это значит, что модель требует корректировки и внесения иных предикторов.