Скрининговая (мульти) коллинеарность в регрессионной модели - PullRequest
63 голосов
/ 15 июня 2010

Я надеюсь, что этот вопрос не будет вопросом «спроси и ответь» ... вот так: (мульти) коллинеарность относится к чрезвычайно высоким корреляциям между предикторами в регрессионной модели. Как их вылечить ... ну, иногда вам не нужно "лечить" коллинеарность, поскольку она влияет не на саму модель регрессии, а на интерпретацию влияния отдельных предикторов.

Один из способов определения коллинеарности состоит в том, чтобы поместить каждый предиктор в качестве зависимой переменной, а другие предикторы в качестве независимых переменных, определить R 2 , и, если он больше 0,9 (или .95), мы можем считать предиктор избыточным. Это один "метод" ... а как насчет других подходов? Некоторые из них отнимают много времени, например исключают из модели предикторы и следят за изменениями b-коэффициентов - они должны заметно отличаться.

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

Ответы [ 5 ]

39 голосов
/ 15 июня 2010

Функция kappa() может помочь.Вот смоделированный пример:

> set.seed(42)
> x1 <- rnorm(100)
> x2 <- rnorm(100)
> x3 <- x1 + 2*x2 + rnorm(100)*0.0001    # so x3 approx a linear comb. of x1+x2
> mm12 <- model.matrix(~ x1 + x2)        # normal model, two indep. regressors
> mm123 <- model.matrix(~ x1 + x2 + x3)  # bad model with near collinearity
> kappa(mm12)                            # a 'low' kappa is good
[1] 1.166029
> kappa(mm123)                           # a 'high' kappa indicates trouble
[1] 121530.7

и мы идем дальше, делая третий регрессор все более и более коллинеарным:

> x4 <- x1 + 2*x2 + rnorm(100)*0.000001  # even more collinear
> mm124 <- model.matrix(~ x1 + x2 + x4)
> kappa(mm124)
[1] 13955982
> x5 <- x1 + 2*x2                        # now x5 is linear comb of x1,x2
> mm125 <- model.matrix(~ x1 + x2 + x5)
> kappa(mm125)
[1] 1.067568e+16
> 

Это использовало приближения, подробности см. help(kappa).

34 голосов
/ 15 июня 2010

Просто добавьте к тому, что Дирк сказал о методе Number of Condition, эмпирическое правило заключается в том, что значения CN > 30 indicate severe collinearity. Другие методы, кроме номера условия, включают:

1) определитель ковариации матрица, которая колеблется от 0 (идеально Коллинеарность) до 1 (без коллинеарности)

# using Dirk's example
> det(cov(mm12[,-1]))
[1] 0.8856818
> det(cov(mm123[,-1]))
[1] 8.916092e-09

2) Использование факта, что определитель диагональной матрицы является произведением собственных значений => Наличие одного или нескольких небольших собственных значений указывает на коллинеарность

> eigen(cov(mm12[,-1]))$values
[1] 1.0876357 0.8143184

> eigen(cov(mm123[,-1]))$values
[1] 5.388022e+00 9.862794e-01 1.677819e-09

3) Значение фактора инфляции дисперсии (VIF). VIF для предиктора i равен 1 / (1-R_i ^ 2), где R_i ^ 2 - это R ^ 2 из регрессии предиктора i против оставшихся предикторов. Коллинеарность присутствует, когда VIF по меньшей мере для одной независимой переменной велик. Правило большого пальца: VIF > 10 is of concern. Для реализации в R см. здесь . Я также хотел бы прокомментировать, что использование R ^ 2 для определения коллинеарности должно идти рука об руку с визуальным исследованием диаграмм рассеяния, поскольку один выброс может «вызвать» коллинеарность там, где его нет, или скрыть коллинеарность там, где он существует ,

18 голосов
/ 15 июня 2010

Вам может понравиться справочная карточка Вито Риччи «Функции R для регрессионного анализа» http://cran.r -project.org / doc / contrib / Ricci-refcard-regression.pdf

Это краткоперечисляет много полезных функций, связанных с регрессией в R, включая диагностические функции.В частности, он перечисляет функцию vif из пакета car, которая может оценивать мультиколлинеарность.http://en.wikipedia.org/wiki/Variance_inflation_factor

Рассмотрение мультиколлинеарности часто идет рука об руку с вопросами оценки переменной значимости.Если это относится к вам, возможно, проверьте пакет relaimpo: http://prof.beuth -hochschule.de / groemping / relaimpo /

8 голосов
/ 26 июля 2014

Поскольку пока нет упоминания о VIF, я добавлю свой ответ.Коэффициент инфляции дисперсии> 10 обычно указывает на серьезную избыточность между переменными предиктора.VIF указывает коэффициент, на который будет увеличиваться дисперсия коэффициента переменной, если он не был сильно коррелирован с другими переменными.

vif() доступен в пакете cars и применяется к объекту класса(лм).Возвращает vif x1, x2.,,xn в объекте lm().Рекомендуется исключить переменные с vif> 10 или ввести преобразования для переменных с vif> 10.

8 голосов
/ 15 июня 2010

См. Также раздел 9.4 в этой книге: Практическая регрессия и анова с использованием R [Faraway 2002] .

Коллинеарность может быть обнаружена несколькими способами:

  1. Изучение матрицы корреляции предикторов покажет большие попарные коллинеарности.

  2. Регрессия x_i для всех других предикторов дает R ^ 2_i.Повторите для всех предикторов.R ^ 2_i, близкое к единице, указывает на проблему - может быть найдена нарушающая линейная комбинация.

  3. Изучите собственные значения t(X) %*% X, где X обозначает матрицу модели;Небольшие собственные значения указывают на проблему.Можно показать, что 2-нормальное число условий представляет собой отношение наибольшего к наименьшему ненулевому единичному значению матрицы ($ \ kappa = \ sqrt {\ lambda_1 / \ lambda_p} $; см. ?kappa);\kappa >= 30 считается большим.

...