В файле assumptions.xlsx содержатся данные переменных x, y1, y2.
library(readxl) # считывание данных из файлов Excel
library(tidyverse) # манипулирование данными
library(ggplot2) # визуализация
library(ggfortify) # визуализация диагностических графиков
library(modelr) # вспомогательные функции для работы с моделями
library(broom) # преобразование результатов моделирования в табличный вид
library(GGally) # построение матрицы диаграмм рассеяния
library(car) # функции для степенных преобразований
Загрузите данные и постройте визуализации зависимостей y1(x) и y2(x).
assumptions <- read_excel('data/assumptions.xlsx')
ggplot(assumptions, aes(x, y1)) +
geom_point() +
geom_smooth(method = lm, se = F, col = 'blue') +
labs(title = 'Визуализация зависимости y1(x)')
ggplot(assumptions, aes(x, y2)) +
geom_point() +
geom_smooth(method = lm, se = F, col = 'blue') +
labs(title = 'Визуализация зависимости y2(x)')
Постройте линейные модели y1(x) и y2(x) и проверьте, выполняются ли допущения линейной модели.
Построение модели y1(x) и проверка на выполнение допущений линейной модели:
m1 <- lm(y1 ~ x, assumptions)
autoplot(m1)
Первый график показывает зависимость остатков модели от предсказанных значений: Если допущения линейной регрессии верны, то не должно быть зависимости остатков от предскзанных значений. Искривленная форма облака точек на этом графике означает, что зависимость между x и y1нелинейная и необходимо либо включать в модель нелинейные члены, либо использовать линеаризующее преобразование данных. На этом графике прослеживается непостоянство дисперсии остатков. Можно предполодить, что результаты проверки гипотез о значимости модели и коэффициентов будут некорректными.
Второй график позволяет проверить предположение о нормальности остатков: Остатки на графики близки к прямой линии, что свидетельствует о справедливости допущений.
Третий график позволяет обнаружить гетероскедастичность: Дисперсия остатков не постоянна, т.е. предположение о гомоскедастичности нарушено.
Четвертый график помогает выявить выбросы и влиятельные наблюдения.
Модель плохая: гетероскедастичность.
Построение модели y2(x) и проверка на выполнение допущений линейной модели:
m2 <- lm(y2 ~ x, assumptions)
autoplot(m2)
Первый график показывает зависимость остатков модели от предсказанных значений: наблюдается искривление облака точек.
Второй график позволяет проверить предположение о нормальности остатков: отклонение от нормального распределения в области положительных остатков более заметно.
Третий график позволяет обнаружить гетероскедастичность: присутствует изменение дисперсии остатков.
Найдите и выполните такие преобразования переменных, при которых допущения регрессионной модели выполняются. Определите, есть ли в выборке влиятельные наблюдения.
Рассмотрим первую модель:
t1 <- powerTransform(y1 ~ x, assumptions) # Эта функция подбирает параметр λ таким образом, чтобы распределение остатков линейной модели в результате было наиболее близко к нормальному.
m1_2 <- lm(y1^-0.2 ~ x, assumptions)
coef(m1_2)
## (Intercept) x
## 0.611124375 -0.004365662
Уравнение регрессии: \(\frac{1}{\sqrt[5]{y1}} = 0.611−0.0044*x\)
Диагностика остатков:
autoplot(m1_2)
Рассмотрим вторую модель:
t2 <- powerTransform(y2 ~ x, assumptions) # Эта функция подбирает параметр λ таким образом, чтобы распределение остатков линейной модели в результате было наиболее близко к нормальному.
m2_2 <- lm(y2^-0.143 ~ x, assumptions)
coef(m2_2)
## (Intercept) x
## 0.600139449 -0.001116676
Уравнение регрессии: \(\frac{1}{\sqrt[7]{y2}} = 0.6−0.0011*x\)
Диагностика остатков:
autoplot(m2_2)
К сожалению, устранить проблемы в полной мере не удалось.
Анализ влиятельных наблюдений:
autoplot(m1_2, which = c(1, 4:6))
autoplot(m2_2, which = c(1, 4:6))
Для модели y2(x) влиятельные наблюдения являются более значительными и выделяющимися на фоне всего ряда данных. Связано это может быть с тем, что в модели y2(x) проявляется большая корреляция.
Постройте прогноз и доверительные интервалы прогноза на основе полученных моделей.
# Создаем точки для получения нового прогноза
newdata_ht_1 <- data.frame(x = seq_range(assumptions$x, by = 0.1))
# Интервальный прогноз:
pred_ht_transformed_1 <- predict(m1_2, newdata = newdata_ht_1,
interval = 'prediction',
level = .95)
# Обратное преобразование:
pred_ht_1 <- pred_ht_transformed_1^(-5)
# Соединяем все в одну таблицу:
newdata_ht_1 <- bind_cols(newdata_ht_1, as.data.frame(pred_ht_1))
# График
ggplot(data = newdata_ht_1, mapping = aes(x)) +
geom_ribbon(aes(ymin=lwr, ymax=upr), fill='lightskyblue', alpha=1/2) +
geom_line(aes(y = fit), colour='blue') +
geom_point(data = assumptions, aes(x, y1)) +
labs(title='Интервальный прогноз модели y1(x) (95% интервал)',
y = 'y1')
# Создаем точки для получения нового прогноза
newdata_ht_2 <- data.frame(x = seq_range(assumptions$x, by = 0.1))
# Интервальный прогноз:
pred_ht_transformed_2 <- predict(m2_2, newdata = newdata_ht_2,
interval = 'prediction',
level = .95)
# Обратное преобразование:
pred_ht_2 <- pred_ht_transformed_2^(-7)
# Соединяем все в одну таблицу:
newdata_ht_2 <- bind_cols(newdata_ht_2, as.data.frame(pred_ht_2))
# График
ggplot(data = newdata_ht_2, mapping = aes(x)) +
geom_ribbon(aes(ymin=lwr, ymax=upr), fill='lightskyblue', alpha=1/2) +
geom_line(aes(y = fit), colour='blue') +
geom_point(data = assumptions, aes(x, y2)) +
labs(title='Интервальный прогноз модели y2(x) (95% интервал)',
y = 'y2')
Границы доверительного интервала расходятся, т.к. к ним применили нелинейное преобразование. Это означает, что уровень неопределенности возрастает при увеличении y. Этого следовало ожидать, т.к. гетероскедастичность - по определению рост дисперсии.
Визуально наиболее достоверным прогнозом кажется интервальный прогноз модели y2(x) (95% интервал).