Я использую пакет 'lars' в R со следующим кодом:
> library(lars)
> set.seed(3)
> n <- 1000
> x1 <- rnorm(n)
> x2 <- x1+rnorm(n)*0.5
> x3 <- rnorm(n)
> x4 <- rnorm(n)
> x5 <- rexp(n)
> y <- 5*x1 + 4*x2 + 2*x3 + 7*x4 + rnorm(n)
> x <- cbind(x1,x2,x3,x4,x5)
> cor(cbind(y,x))
y x1 x2 x3 x4 x5
y 1.00000000 0.74678534 0.743536093 0.210757777 0.59218321 0.03943133
x1 0.74678534 1.00000000 0.892113559 0.015302566 -0.03040464 0.04952222
x2 0.74353609 0.89211356 1.000000000 -0.003146131 -0.02172854 0.05703270
x3 0.21075778 0.01530257 -0.003146131 1.000000000 0.05437726 0.01449142
x4 0.59218321 -0.03040464 -0.021728535 0.054377256 1.00000000 -0.02166716
x5 0.03943133 0.04952222 0.057032700 0.014491422 -0.02166716 1.00000000
> m <- lars(x,y,"step",trace=T)
Forward Stepwise sequence
Computing X'X .....
LARS Step 1 : Variable 1 added
LARS Step 2 : Variable 4 added
LARS Step 3 : Variable 3 added
LARS Step 4 : Variable 2 added
LARS Step 5 : Variable 5 added
Computing residuals, RSS etc .....
У меня есть набор данных с 5 непрерывными переменными, и я пытаюсь подогнать модель к одной (зависимой) переменной y. Двое из моих предикторов тесно связаны друг с другом (x1, x2).
Как вы можете видеть в приведенном выше примере, функция lars с опцией 'stepwise' сначала выбирает переменную, которая наиболее коррелирует с y. Следующая переменная для входа в модель - это та, которая наиболее коррелирует с остатками. Действительно, это х4:
> round((cor(cbind(resid(lm(y~x1)),x))[1,3:6]),4)
x2 x3 x4 x5
0.1163 0.2997 0.9246 0.0037
Теперь, если я сделаю вариант «Лассо»:
> m <- lars(x,y,"lasso",trace=T)
LASSO sequence
Computing X'X ....
LARS Step 1 : Variable 1 added
LARS Step 2 : Variable 2 added
LARS Step 3 : Variable 4 added
LARS Step 4 : Variable 3 added
LARS Step 5 : Variable 5 added
Он добавляет обе коррелированные переменные в модель на первых двух шагах. Это противоположно тому, что я прочитал в нескольких статьях. Большинство из них говорят, что если есть группа переменных, среди которых корреляции очень высоки, то «лассо» имеет тенденцию выбирать только одну переменную из группы случайным образом.
Может ли кто-нибудь привести пример такого поведения? Или объясните, почему мои переменные x1, x2 добавляются в модель одна за другой (вместе)?
R
вызов, который делает OP, и на соответствующий вывод, который он предоставляет, вы увидите, что он действительно использует лассо. Как я уверен, вы знаете, небольшая настройка алгоритма lars дает путь регуляризации лассо.Ответы:
Проблема коллинеарности переоценена!
Томас, вы сформулировали общую точку зрения, что, если предикторы коррелируют, даже самый лучший метод выбора переменных просто выбирает один случайный из множества. К счастью, это способ недооценивать способность регресса раскрывать правду! Если у вас есть правильный тип объясняющих переменных (экзогенных), множественная регрессия обещает найти эффект от каждой переменной, поддерживающей остальные переменные. Теперь, если переменные идеально коррелированы, то это буквально невозможно. Если переменные коррелируют, это может быть сложнее, но с размером типичного набора данных сегодня это не намного сложнее.
Коллинеарность - это малоинформационная проблема. Посмотрите на эту пародию на коллинеарность от Art Goldberger в блоге Дэйва Джайлза . То, как мы говорим о коллинеарности, будет звучать глупо, если применять его к среднему значению вместо коэффициента частичной регрессии.
Все еще не убежден? Пришло время для некоторого кода.
Я создал сильно коррелированные переменные x1 и x2, но на графике ниже вы можете видеть, что, когда x1 равен -1, мы все еще видим изменчивость в x2.
Теперь пришло время добавить «правду»:
Может ли обычная регрессия быть успешной в условиях коллинеарной проблемы?
Ах, да, это может:
Теперь я не говорил о LASSO, на котором сосредоточился ваш вопрос. Но позвольте мне спросить вас об этом. Если регрессия старой школы и обратная ликвидация не одурачены коллинеарностью, почему вы думаете, что LASSO современного уровня сделает это?
источник
Ответ Бена вдохновил меня пойти еще дальше по пути, который он указал, что произойдет, если «правда», y, окажется в других ситуациях.
В исходном примере y зависит от двух сильно коррелированных переменных x1 и x2. Предполагая, что есть другая переменная, х3, скажем,
«Истина» у теперь определяется следующим образом
Что будет с регрессией?
Существует сильный эффект коллинеарности. Стандартная ошибка x2 слишком велика. Однако, линейная регрессия идентифицирует x2 как незначимую переменную.
Как насчет другого случая регрессии?
Переменная x2 несущественна, и ее рекомендуется удалить с помощью линейной регрессии.
Из приведенных выше результатов коллинеарность не является проблемой в линейной регрессии, и проверка VIF не очень полезна.
Давайте посмотрим на другую ситуацию. x3 = c (1: N) # N определено ранее, N = 1000, x3 не в том же масштабе, что и x1.
«Истина» у определяется так же, как и выше
Что будет с регрессией?
Существует сильный эффект коллинеарности. Стандартные ошибки x1, x2 слишком велики. Линейная регрессия не может определить важную переменную x1.
Как насчет другого случая регрессии?
Переменная x2 несущественна, и ее рекомендуется удалить с помощью линейной регрессии.
Примечание: регрессия у на х1 и х3. Обратите внимание, что стандартная ошибка x1 составляет всего 0,03.
Основываясь на приведенных выше результатах, я пришел к выводу, что
источник