Сокращение количества переменных в множественной регрессии


9

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

Некоторые (возможно, наивные) мысли о том, как это сделать:

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

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

Существует ли стандартный подход для решения этой проблемы уменьшения числа переменных в множественной регрессии?

Кажется, что это было бы достаточно распространенной проблемой, что был бы стандартный подход.

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

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


1
Майк, вы можете просмотреть 3-ю главу ESL , если вы с ней не знакомы. Страница по указанной ссылке указывает на бесплатный, легальный PDF текст.
кардинал

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

3
Этот ответ дает конкретный пример одной из (многих) проблем, связанных с методом 1. Комментарий @cardinal к ответу Фрэнка Харрелла позволяет понять суть проблемы, связанной с методом 2: все, что вы делаете с независимыми переменными, не учитывая их отношения с зависимой переменной, рискует быть неуместным или хуже. Что касается стандартных или «канонических» ответов, то спросить их здесь все равно, что попросить обсудить все методы поиска рациональных точек на эллиптических кривых с их плюсами и минусами :-).
whuber

2
Как отмечают другие здесь, способ 1 приведет к проблемам. Для интуитивно понятного объяснения того, почему это так / описание другой проблемы с этим подходом, вы можете прочитать это: stats.stackexchange.com/questions/20836/…
- Восстановить Монику

1
Спасибо whuber и gung за объяснения проблем с первой идеей.
Майк Спиви

Ответы:



6

Метод 1 не работает. Метод 2 имеет надежду в зависимости от того, как вы это делаете. Лучше вводить главные компоненты в порядке убывания объясненной дисперсии. Более понятный подход состоит в том, чтобы выполнить кластеризацию переменных, затем уменьшить каждый кластер до единой оценки (не используя Y), а затем согласовать модель с оценками кластера.


+1. Под «кластеризацией переменных» вы подразумеваете факторный анализ - это стратегия, которую я мог бы использовать (также прежде, чем взглянуть на y). Я думаю о кластерном анализе как о группе наблюдений, а не переменных, но у меня есть только поверхностные знания о кластерном анализе.
gung - Восстановить Монику

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

1
Кроме того, похоже, что ОП не (вполне) описывает регрессию главных компонентов в своем методе 2.
Кардинал

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

1
Переменная кластеризация связана с факторным анализом, но проще. Переменные сгруппированы по тому, как они соотносятся друг с другом. См. varclusФункцию в Hmiscпакете R или PROC VARCLUS в SAS. Сокращение данных может помочь с поднабором переменных, если вы проявите некоторую осторожность; Вы можете удалить весь кластер, если его значение равно 0,3. С основными компонентами есть такие методы, как снижение заряда батареи, когда вы по существу аппроксимируете ПК с подмножеством составляющих их переменных. P
Фрэнк Харрелл

3

В главе 5 Data Mining with R автор показывает несколько способов выбора наиболее полезных предикторов. (В контексте биоинформатики, где каждая строка выборки содержит более 12 000 столбцов!)

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

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

set.seed(99)

d=data.frame(
  y=c(1:20),
  x1=log(c(1:20)),
  x2=sample(1:100,20),
  x3=c(1:20)*c(11:30),
  x4=runif(20),
  x5=-c(1:20),
  x6=rnorm(20),
  x7=c(1:20),
  x8=rnorm(20,mean=100,sd=20),
  x9=jitter(c(1:20)),
  x10=jitter(rep(3.14,20))
  )

library(randomForest)
rf=randomForest(y~.,d,importance=T)
print(importance(rf))
#         %IncMSE IncNodePurity
# x1  12.19922383    130.094641
# x2  -1.90923082      6.455262
# ...

i=importance(rf)
best3=rownames(i)[order(i[,"%IncMSE"],decreasing=T)[1:3]]
print(best3)
#[1] "x1" "x5" "x9"

reduced_dataset=d[,c(best3,'y')]

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

Вот некоторый код, использующий те же примеры данных, что и выше, для выбора 3 из 10 столбцов:

library(Hmisc)
d_without_answer=d[,names(d)!='y']
vc=varclus(as.matrix(d_without_answer))
print(cutree(vc$hclust,3))
# x1  x2  x3  x4  x5  x6  x7  x8  x9 x10 
#  1   2   1   3   1   1   1   2   1   3 

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


2

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


Спасибо. Я посмотрю ЛАССО. (Похоже, это тоже упоминается в справочном материале кардиналов).
Майк Спиви,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.