Tuesday, April 12, 2011

Линейная регрессия с примерами на R

Меня давно преследует идея пройтись по ключевым алгоритмам data mining, систематизировать имеющиеся знания и составить некий обзор с примерами. Собственно, этой статьей и ознаменую начало данной серии. Для примеров будет использоваться программная среда R, о которой я уже писал в одном из прошлых постов.

Линейная регрессия

Строго говоря, линейная регрессия не является алгоритмом data mining. Это один из методов пришедших из статистики. В статистике, под регрессией, обычно подразумевают прогнозирование, в той или иной форме. Существует множество различных типов регрессий, но в основе любого из них лежит одна и та же идея: построить модель, связывающую предсказываемое значение с исходными данными (предикторами), минимизируя ошибку.

Линейная регрессия это простейший вариант регрессии. Рассмотрим, для примера, линейную регрессию с одним предиктором и одним предсказываемым значением. Такую регрессию легко нарисовать на графике X-Y. Для этого по оси абсцисс X мы отмечаем значения предиктора, а по оси ординат Y значения предсказываемой величины. Тогда простая линейная регрессия это прямая, проведенная таким образом, чтобы минимизировать расхождение между истинными значениями предсказываемой величины и точками на линии, соответствующими значениям предикторов.
На языке математики, мы можем описать нашу линейную модель в виде уравнения: Y = a+b*X, где X – это предиктор или исходные данные, а Y – это предсказываемая величина. А саму задачу переформулировать в виде: найти коэффициенты a и b минимизирующие величину ошибки.
Когда модель построена, а коэффициенты найдены мы можем использовать полученное уравнение для предсказания неизвестных нам значений.

Пример:

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

Цена Акции = K * Цена барреля нефти + Некая константа

Если мы можем определить константу и коэффициент, то мы можем по цене на нефть предсказывать цену акции. Если возникает отклонение, то можно купить спред и на этом заработать, в теории, естественно.

А теперь практика, возьмем R, и проведем линейную регрессию цен акций компании Роснефть по цене на нефть. Исходные данные можно взять здесь:
data <- read.csv('C:\\ rosn.txt', sep='\t') #читаем данные из файла
fit <- lm(data$ROSN ~ data$BRN ) #строим линейную регрессию
summary(fit) #печатаем результат
Результат:
На рисунке, интересующие нас коэффициенты, обозначены (1). Подставив их в уравнение регрессии, получим выражение: ROSN = 61.405 + 1.944*Brent Помимо значений, собственно, коэффициентов, R показывает нам величины ошибок, или стандартного отклонения, для каждого коэффициента. Но это не все... Например, нам может быть интересно, объясняют ли вообще хоть что-нибудь наши коэффициенты. Чтобы проверить это, мы, выдвигаем нулевую гипотезу, что, к примеру, коэффициент 61.405 является лишь результатом погрешности и его значением можно пренебречь. Для проверки такой гипотезы, используется t-критерий Стьюдента. Здесь R за нас делает всю работу, вычисляя как саму величину t так и степень значимости нашей гипотезы Pr(>|t|). Так, в нашем случае величина (2) 0.0036 означает что мы на 100*(1-0.0036) = 99.64% уверены в том, что свободный член в нашем выражении отличен от нуля. Далее мы можем проверить, насколько точно наша модель описывает данные. Для этого используются коэффициенты R2 (3). Чем ближе величина этих значений к 1, тем лучше. 1 это идеальный результат, означающий, что модель на 100% описывает данные. И, наконец, последнее, что мы можем проверить, это то, насколько предсказываемая величина зависит от предикторов. Для этого выдвигается нулевая гипотеза, что предсказываемая величина вообще не зависит от предикторов. Для этой гипотезы определяется p-значение (4). В нашем случае, оно получилось равным 2.65*10^-8. Т.е. мы можем быть уверенны на 99.99999735%, что предсказываемая величина действительно зависит от предикторов. Обычно, имеет смысл смотреть на этот параметр в первую очередь, ведь он определяет, насколько вообще наша модель адекватна. Да, кстати, график чуть выше, как раз показывает наши данные и результат линейной регрессии.

Что если мои данные не описываются прямой линией?

Линейная регрессия с одним предиктором это простейший вариант регрессии, на практике возможен целый ряд усложнений позволяющих решать гораздо более сложные задачи: 1) добавление нескольких предикторов – дополнительные предикторы могут добавить в модель больше информации и, тем самым, улучшить результаты. Уравнение линейной регрессии, в таком случае может иметь следующий вид: Y = a + b1*X1 + … bn*Xn 2)предварительное преобразование предикторов - Возведение предикторов в степень либо извлечение корней является одним из способов увеличить возможности линейной регрессии. На практике, нередко приходится проводить большое количество различных преобразований с целью выяснить, какое из них даст наилучшую оценку. 3)в уравнение модели могут быть добавлены члены содержащие произведение предикторов 4)часто возникает задача предсказания вероятности возникновения события. Т.е. предсказываемая величина принимает лишь два значения 1 и 0 или да и нет. Для решения такого рода задач применяется логистическая регрессия. К счастью, все эти и множество других дополнений реализованы в R и готовы к использованию. Информацию о том, как ими пользоваться можно почерпнуть набрав
> ?lm
в командном интерфейсе R.

5 comments:

  1. спасибо за статью. Только начинаю работать в R. Подскажите пожалуйста как получить картинку, которая выше? Что задать в plot?

    ReplyDelete
    Replies
    1. Автору за статью спасибо.
      В plot() указываете данные, а в функции abline() полученную модель. Например:
      model <- lm(data$y~data$x)
      plot(data$y~data$x, xlab="x", ylab="y")
      abline(model)

      Delete
    2. Большое спасибо!

      Delete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Благодарю за статью.
    Доходчиво - понятно.
    Есть вопрос, если у меня несколько переменных, мне нужно сделать проверку на мультиколинеарность.
    Как в R это можно провернуть?

    ReplyDelete