R Language (Сковорцов) / Анализ данных на языке R
.pdfвторая модель предсказывает хуже. Что собственно можно было увидеть, сравнив их Adjusted R-squared.
anova(fit_full, fit_reduced1)
Теперь построим еще одну регрессионную модель и сравним ее с первой. На этот раз особой разницы между моделями мы не видим.
fit_reduced2 <- lm(Fertility ~ Infant.Mortality + Education + Catholic + Agriculture, data = swiss) summary(fit_reduced2)
anova(fit_full, fit_reduced2)
Чтобы вручную не строить различные регрессионные модели в поисках оптимальной модели. model_full - модель, которая предсказывает значение переменной рейтинг (rating) в зависимости от всех остальных переменных в данном датасете.
model_null - модель, в которой нет ни одного предиктора, а есть только intercept. Значение intercept - это просто среднее значение зависимой переменной. Соответственно, модель предоставляет нам информацию только о том, отличается ли это среднее от нуля.
Функция step позволяет нам подобрать модель с оптимальным количеством предикторов. С помощью аргумента scope мы можем задать пространство моделей с разным числом предикторов, в котором будет происходить поиск оптимального набора предикторов. Самый простой путь - задать границы возможных моделей с помощью нулевой и полной моделей.
scope = list(lower = model_null, upper = model_full)
Аргумент direction позволяет задать направление поиска.
Первый аргумент (object) задаёт начальную модель, с которой начинается поиск. Обратите внимание на то, что при разных значениях аргумента direction нужно использовать разные начальные модели.
Функция step возвращает оптимальную модель.
optimal_fit <- step(fit_full, direction = 'backward') summary(optimal_fit)
Задание 10.1. Напишите функцию fill_na, которая принимает на вход данные с тремя переменными:
x_1 - числовой вектор x_2 - числовой вектор
y - числовой вектор с пропущенными значениями.
Теперь самое интересное, на первом этапе, использую только наблюдения, в которых нет пропущенных значений, вы должны построить регрессионную модель (без взаимодействий), где y - зависимая переменная, x_1 и x_2 - независимые переменные. Затем, используя построенную модель, мы заполним пропущенные значения предсказаниями модели.
Функция должна возвращать dataframe c новой переменной y_full. Сохраните в нее переменную y, в которой пропущенные значения заполнены предсказанными значениями построенной модели.
>test_data <- read.csv(“fill_na_test.csv")
>fill_na(test_data)
x_1 x_2 y y_full
1 9 221414.00000
2 14 35 9 9.00000
3 10 45NA 13.12727
4 6 35NA 13.30132 5 11 361616.00000 6 5 271111.00000 7 9 34NA 12.83632 8 6 25NA 12.90783 9 11 381313.00000 10 12 23NA 11.97784
Задание 10.2. Сейчас мы поработаем со встроенным датасетом attitude. Рассмотрим две модели
model_full <- lm(rating ~ ., data = attitude)
model_null <- lm(rating ~ 1, data = attitude)
C помощью функции step найдите оптимальную модель для предсказания rating в датасете attitude. Model_full и model_null уже созданы. Сохраните команду с функцией step в переменную ideal_model.
Задание 10.3. В этой задаче будем работать со встроенным датасетом LifeCycleSavings. Попытаемся предсказать значение sr на основе всех остальных переменных в этом датасете. Вспомните способы сокращения формул и напишите команду, которая создаёт линейную регрессию с главными эффектами и всеми возможными взаимодействиями второго уровня. Сохраните модель в переменную model.
11. Диагностика модели
Давайте поговорим о том, как проверить, можно ли основываясь на имеющихся данных построить интересующие нас модели. Есть множество ограничений к построению линейной регрессии. Мы возьмем основные допущения к линейной регрессии и посмотрим, как их можно проверить при помощи графиков, стандартных и собственных функций.
library(ggplot2)
data(swiss)
str(swiss)
В первую очередь необходимо проверить взаимосвязь переменных между собой.
pairs(swiss)
ggplot(swiss, aes(x = Examination, y = Education)) + geom_point()
При проверке взаимосвязи необходимо обращать внимание на выбросы. Выброс - это значения, которые очень сильно отклоняются от общего тренда взаимосвязи двух переменных.
ggplot(swiss, aes(x = Examination, y = Education)) + geom_point() +
geom_smooth(method = 'lm')
Другим важным фактором является то, нормально ли распределены переменные, с которыми мы работаем. Если распределение переменных отличается от нормальных, то их нужно преобразовать. Для преобразования переменных можно взять логарифм или квадратный корень, или любой другой способ.
ggplot(swiss, aes(x = Examination)) + geom_histogram()
ggplot(swiss, aes(x = Education)) + geom_histogram()
Функция scale() позволяет совершить стандартизацию вектора, то есть делает его среднее значение равным нулю, а стандартное отклонение - единице (Z-преобразование). Стандартизованный коэффициент регрессии можно получить, если предикторы и зависимая переменная стандартизованы.
Следующим важным фактором является проверка наших данных на линейность взаимосвязи между зависимой и независимой переменной. Например, возьмем переменные Examination и Education. Из графика видно, что у них скорее квадратичная зависимость, чем линейная.
ggplot(swiss, aes(x = Examination, y = Education)) + geom_point() +
geom_smooth()
lm1 <- lm(Education ~ Examination, swiss) summary(lm1)