Добавил:
По своей натуре перфекционист. Поэтому люблю все аккуратно оформлять и упорядочивать, складывать по полочкам. Вот, не пропадать же добру, нажитому за четыре кропотливых семестра. Тут я выложил все мои ответы, курсовые, отчеты и некоторые ДЗ. Они могут вам помочь для получения зачета или сдачи экзамена. Если чего-то не нашли в папочках, то попытайте удачу в разделе НЕОТСОРТИРОВАННОЕ на моей страничке, там все 4 семестра разложены по папкам. ГРУППА КТ-43-15. Годы обучения 2015-2019. Коллекция будет пополняться. Что ж, удачки :З Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
35
Добавлен:
15.09.2017
Размер:
451.1 Кб
Скачать

Обычно модель выбирают на основе каких-либо теоретических представлений. Если теоретические представления отсутствуют, а нам нужно хоть как-то аппроксимировать зависимость, то нужно ограничиться только значимыми коэффициентами. При аппроксимации полиномом высокой степени нужно быть осторожным, так как возможны не имеющие смысла выбросы, особенно в области, где мало точек.

Если мы аппроксимируем данные, имеющие погрешность измерения, то их тоже следует учитывать при оценке адекватности модели. Если экспериментальные точки отличаются от аппроксимирующей кривой меньше, чем погрешность измерений, то нет смысла вводить новые коэффициенты. Есть статистические методы, которые позволяют оценить это количественно.

Поэтому что мы сделаем в данном случае. Мы переменную Examination возведем в квадрат и построим новую модель линейной регрессии.

swiss$Examination_squared <- (swiss$Examination)^2

lm2 <- lm(Education ~ Examination + Examination_squared, swiss) summary(lm2)

Сравнив модели, при помощи функции anova, видим, что они значимо различаются.

anova(lm2, lm1)

Подтвердим это визуально. Сохраним в изначальный набор данных предсказанные значения и остатки из обоих моделей.

swiss$lm1_fitted <- lm1$fitted swiss$lm2_fitted <- lm2$fitted swiss$lm1_resid <- lm1$resid swiss$lm2_resid <- lm2$resid swiss$obs_number <- 1:nrow(swiss)

Построим диаграмму рассеивания с двумя линиями тренда: для первой и второй модели.

ggplot(swiss, aes(x = Examination, y = Education)) + geom_point(size = 3) +

geom_line(aes(x = Examination, y = lm1_fitted), col

='red', lwd=1) +

geom_line(aes(x = Examination, y = lm2_fitted), col

='blue', lwd=1)

Видно, что линия тренда второй модели лучше предсказывает распределение значений.

Построим диаграммы распределения остатков: для первой и второй модели.

ggplot(swiss, aes(x = lm1_fitted, y = lm1_resid)) + geom_point(size = 3) + geom_hline(y=0, col = 'red',

lwd = 1)

ggplot(swiss, aes(x = lm2_fitted, y = lm2_resid)) + geom_point(size = 3) + geom_hline(y=0, col = 'red',

lwd = 1)

Видно, что во второй модели остатки распределены более равномерно.

Следующее допущение - независимость остатков. Независимость остатков предполагает, что все данные, которые мы используем, не сгруппированы по каким-то отдельным категориям.

ggplot(swiss, aes(x = obs_number, y = lm1_resid)) + geom_point(size = 3) + geom_smooth()

ggplot(swiss, aes(x = obs_number, y = lm2_resid)) + geom_point(size = 3) + geom_smooth()

Следующее допущение - гомоскедастичность. То есть наши наблюдения должны быть равномерно распределены, без каких-либо разбросов.

ggplot(swiss, aes(x = lm1_fitted, y = lm1_resid)) + geom_point(size = 3)

ggplot(swiss, aes(x = lm2_fitted, y = lm2_resid)) + geom_point(size = 3)

Функция gvlma() из библиотеки gvlma позволяет получить оценку выполнения основных допущений линейной регрессии. В качестве аргумента она принимает объект, в который сохранена модель.

Можно задать формулу модели прямо в функции gvlma. Чтобы увидеть основные статистики, нужно выполнить команду summary для объекта, созданного с помощью функции gvlma.

x <- gvlma(Y ~ X, data = mydata)

summary(x)

Следующее допущение - нормальность распределения остатков.

ggplot(swiss, aes(x = lm1_resid)) + geom_histogram(binwidth = 4, fill = 'white', col =

'black')

qqnorm(lm1$residuals) qqline(lm1$residuals)

shapiro.test(lm1$residuals)

ggplot(swiss, aes(x = lm2_resid)) + geom_histogram(binwidth = 4, fill = 'white', col =

'black')

qqnorm(lm2$residuals) qqline(lm2$residuals)

shapiro.test(lm2$residuals)

Ещё одной проблемой регрессионных моделей может стать мультиколлинеарность - ситуация, когда предикторы очень сильно коррелируют между собой. Иногда корреляция между двумя предикторами может достигать 1, например, когда два предиктора - это одна и та же переменная, измеренная в разных шкалах (x1 - рост в метрах, x2 - рост в сантиметрах)

Проверить данные на мультиколлинеарность можно по графику pairs() и посчитав корреляцию между всеми предикторами c помощью функции cor.

Задание 11.1. Напишите функцию, которая на вход получает dataframe с двумя количественными переменными, а возвращает стандартизованные коэффициенты для регрессионной модели, в которой первая переменная датафрейма выступает в качестве зависимой, а вторая в качестве независимой.

Пример работы функции.

> beta.coef(mtcars[,c(1,3)]) -7.036582e-17 -8.475514e-01

Задание 11.2. Напишите функцию resid.norm, которая тестирует распределение остатков от модели на нормальность при помощи функции shapiro.test и создает гистограмму при помощи функции ggplot() с красной заливкой "red", если распределение остатков значимо отличается от нормального (p < 0.05), и с зелёной заливкой "green" - если распределение остатков значимо не отличается от нормального.

На вход функция получает регрессионную модель. Функция возвращает переменную, в которой сохранен график ggplot. Задание 11.3. Напишите функцию high.corr, которая принимает на вход датасет с произвольным числом количественных переменных и возвращает имена двух переменных с максимальным абсолютным значением коэффициента корреляции .

Примеры работы функции:

> high.corr(swiss)

[1] "Examination" "Education"

> high.corr(iris[,-5])

[1] "Petal.Length" "Petal.Width"

Соседние файлы в папке R Language лабы (Сковорцов)