Линейная регрессия - одно из самых фундаментальных знаний в статистике, вот как выполнить и интерпретировать ее в R

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

Когда я начал изучать более сложные алгоритмы машинного обучения, я иногда зацикливался на построении самой причудливой модели для решения проблемы, когда на самом деле простая линейная модель могла бы легко выполнить эту работу. Лишь когда я начал обновлять свои знания о линейной регрессии, я заново оценил ее простоту и легкость использования.

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

Введение

Чтобы эта статья была как можно более краткой, я не буду описывать все мелкие детали линейной регрессии, а вместо этого предлагаю вам ровно столько, чтобы вы получили хорошее представление о том, как ее выполнять и интерпретировать в R. Я также кратко коснусь тема ANOVA, то есть дисперсионный анализ, а также коэффициент детерминации или более известный как R-квадрат.

С учетом сказанного, поехали!

Линейная регрессия - это линейная модель, которая отображает взаимосвязь между переменной ответа и одной объясняющей переменной (простая линейная регрессия) или несколькими независимыми переменными (множественная линейная регрессия).

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

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

Обратите внимание, что итоговая оценка экзамена в этом примере представляет собой нашу переменную ответа, поскольку это переменная, которую мы исследуем. С другой стороны, часы, потраченные на изучение, называются объясняющей переменной, поскольку это переменная, которая будет влиять и «объяснять» результат переменной ответа.

Линия наилучшего соответствия

Но подождите, пока мы обсуждали только точки данных, которые отображаются на графике. Как на самом деле возникает линия регрессии?

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

Идея состоит в том, чтобы провести линию через все точки данных так, чтобы линия минимизировала совокупные расстояния или, в терминах регрессии, остатки между наблюдаемыми значениями и подобранными значениями. Этот процесс называется подгонкой линии наилучшего соответствия.

Я настоятельно рекомендую посмотреть видео ниже для более наглядного объяснения этой конкретной концепции.

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

Пример использования

Теперь, когда мы разобрались со всеми основами, давайте теперь посмотрим, как мы можем выполнить простую линейную регрессию в R.

Предположим, у нас есть фрейм данных 6x2, который измеряет предполагаемый вес ребенка в разные периоды времени во время беременности.

Построение точек данных

Во-первых, давайте сохраним этот фрейм данных в переменной с именем baby.

# Load data
baby = read.table("baby weights.txt", header = T)
# Show data
baby

Затем мы можем нанести эти 6 точек данных на график, используя диаграмму рассеяния.

# Plot data
plot(baby, main = "Estimated baby weights during pregnancy", xlab = "Gestation period (weeks)", ylab = "Weight (kg)")

Main, xlab и ylab - это просто аргументы в функции plot в R, которая определяет основной заголовок, x- метка оси и метка оси Y графика соответственно. Ниже приводится результат этого сюжета.

Похоже, что существует положительная взаимосвязь между нашей независимой переменной, периодом беременности и переменной ответа, весом. Другими словами, чем дольше ребенок находится в утробе матери, тем он становится тяжелее. Звучит логично.

Мы можем изучить корреляцию между двумя переменными с помощью функции cor в R и дополнительно проверить, является ли она статистически значимой.

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

# Attach data
attach(baby)
# Compute correlation between gestation period and baby weight
cor(gestation, weight)
# Test whether correlation coefficient is zero
cor.test(gestation, weight)

Между двумя переменными существует очень сильная положительная корреляция. Вывод также ясно указывает на то, что это значительный результат. Таким образом, теперь мы можем приступить к построению линейной линии через эти точки данных.

Подбор модели линейной регрессии

Подобрать модель линейной регрессии в R чрезвычайно просто. Здесь следует обратить внимание на функцию lm, что означает линейную модель.

Здесь мы собираемся подобрать линейную модель, которая регрессирует вес ребенка по оси Y относительно периода беременности по оси X. Порядок здесь важен и его стоит запомнить: переменная ответа всегда стоит перед независимыми переменными.

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

# Fit linear model
model = lm(weight ~ gestation)
# Examine model
model
summary(model)

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

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

# Add regression line
abline(model, col = "red", lty = "dashed")

Подходящие значения

Подгоняемые значения имеют те же значения x, что и наблюдаемые данные, за исключением того, что они лежат точно на линии регрессии.

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

# Obtain fitted values 
model$fitted.values
fitted(model)
predict(model)
# Add fitted values to regression line 
points(gestation, fitted(model), col = "blue", pch = 16)

Дисперсионный анализ (ANOVA) и R-квадрат

Дисперсия - это статистическая мера разброса между числами в наборе данных. В частности, насколько далеко каждая точка данных находится от среднего значения. Следовательно, дисперсионный анализ - это изучение дисперсии.

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

R-квадрат - это процент вариации переменной отклика, который объясняет линейная модель. Чем выше значения R-квадрата, тем меньше разница между наблюдаемыми значениями и подобранными значениями.

Однако одного R-квадрата недостаточно для определения того, подходит ли линия регрессии. Мы также должны принять во внимание контекст исследования, а также статистическую значимость каждой независимой переменной в регрессионной модели.

# ANOVA
anova(model)

Значение p 0,0003661 из F-теста подтверждает, что существует линейная зависимость между сроком беременности и весом. Этот результат согласуется с нашим ранее проведенным корреляционным тестом.

Мы также можем видеть, что сумма квадратов регрессии составляет 2,92129, а остаточная сумма квадратов составляет 0,09371, что дает общую сумму квадратов 3,015.

Есть два способа вычислить сумму квадратов. Один основан на основных принципах, а другой - на выводе функции anova.

x = gestation; y = weight
# Total sum of squares
(SStot = sum((y - mean(y))^2)
sum(anova(model)[,2])
# Residual sum of squares
(SSres = sum((y-fitted(model))^2))
anova(model)[2,2]
# Regression sum of squares
(SSreg = sum((fitted(model)-mean(y))^2))
anova(model)[1,2]

Точно так же есть три способа вычислить коэффициент детерминации или R-квадрат, и все три из них дают одинаковый результат 0,9689173.

  1. Из вывода сводки
  2. Квадрат корреляции
  3. Разделение суммы квадратов регрессии на общую сумму квадратов
# Method 1
summary(model)$r.squared
# Method 2
cor(gestation, weight)^2
# Method 3
SSreg / SStot 

Коэффициент пересечения и регрессии

Поскольку в этом конкретном исследовании у нас есть только одна объясняющая переменная, всего у нас есть два коэффициента: один для точки пересечения, а другой - для наклона.

Вспомните вывод функции summary.

Мы можем видеть, что параметр наклона имеет p-значение 0,000366, что означает, что он статистически значим или, другими словами, ненулевой.

Чтобы сделать еще один шаг вперед, мы также можем создать доверительный интервал для точки пересечения и параметра наклона.

# Confidence interval for intercept and regression coefficient 
confint(model, level = 0.99)

Делать прогнозы

Цель подбора линейной модели - делать прогнозы с разумной точностью.

В этом разделе мы рассмотрим два разных способа делать прогнозы, используя простую линейную модель.

  1. По первым принципам
  2. Использование функции прогноз

Кроме того, мы также можем создавать доверительные интервалы и интервалы прогнозирования для этих прогнозов, чтобы оценить их точность.

Предположим, мы хотим спрогнозировать вес ребенка на 33 неделе. Вот как это можно сделать двумя разными способами.

# First principles
coef(model)[1] + coef(model)[2] * 33
# Using predict function
newdata = data.frame(gestation = 33)
predict(model, newdata)
# Confidence interval 
predict(model, newdata, interval = "confidence", level = 0.9)
# Prediction interval
predict(model, newdata, interval = "predict", level = 0.9)

Оба метода должны дать одно и то же значение прогноза 2,141429.

Остатки

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

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

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

Есть два способа получить остатки:

  1. Использование функции остаток
  2. Вычтите подобранные значения из наблюдаемых значений.
# Method 1
resid(model)[1]
# Method 2
weight - fitted(model)

Далее мы рассмотрим, как визуализировать тенденции остатков. Здесь мы можем использовать разные графики, и каждый график может предоставить нам разную информацию о поведении остатков.

# Plot residuals vs fitted
plot(model, 1)

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

Другой график, который мы можем использовать, называется графиком QQ, который представляет собой диаграмму рассеяния, на которой два набора квантилей сопоставляются друг с другом. В нашем случае нас интересует, подчиняются ли остатки нормальному распределению, и поэтому мы построим квантили остатков в сравнении с квантилями нормального распределения.

Если наши остатки действительно нормально распределены, мы должны ожидать увидеть график, диагональный от нижнего левого угла до верхнего правого.

# QQ plot
plot(model, 2)

Диагональная линия появляется очень близко к большинству точек данных, кроме точки 2. Это может означать, что стоит исключить точку 2 из набора данных, чтобы получить более точную линейную модель.

Вывод

Молодцы, что дочитали эту статью до конца. Надеюсь, вы узнали немного больше о концепции линейной регрессии, а также о том, как ее выполнять и интерпретировать в R.

Напомним, в этой статье мы рассмотрели:

  • Что такое линейная модель
  • Как подобрать лучшую линию
  • Дисперсионный анализ и R-квадрат
  • Значение коэффициента пересечения и регрессии
  • Как делать прогнозы с помощью линейной модели
  • Остатки

Обязательно ознакомьтесь с другими моими статьями, если вам интересно узнать о науке о данных и машинном обучении.

Удачного обучения!