减少多元回归中的变量数量


9

我有一个庞大的数据集,其中包含数百个金融变量的值,这些变量可以用于多元回归,以预测指数基金随时间的行为。我想将变量的数量减少到十个左右,同时仍保留尽可能多的预测能力。 补充:减少的变量集必须是原始变量集的子集,以保留原始变量的经济意义。因此,例如,我不应该以原始变量的线性组合或聚合结局。

有关如何执行此操作的一些想法(可能是幼稚的):

  1. 对每个变量执行简单的线性回归,然后选择具有最大值的十个变量。当然,不能保证十个最佳个体变量的组合将是十个最佳组。R2
  2. 执行主成分分析,并尝试查找与前几个主轴关联最大的十个原始变量。

我认为我不能执行分层回归,因为变量不是真正嵌套的。尝试使用十个变量的所有可能组合在计算上是不可行的,因为组合太多。

是否有标准方法来解决减少多元回归中变量数量的问题?

似乎这将是一个足够普遍的问题,因此将存在一种标准方法。

一个非常有用的答案将是不仅提及标准方法,而且概述其工作方式和原因。或者,如果没有一种标准的方法,而是多种方法各有优缺点,那么讨论其优缺点的答案将非常有用。

Whuber在下面的评论表明,最后一段中的要求太宽泛。相反,我会接受一个主要方法列表作为一个好的答案,也许对每个方法都有一个非常简短的描述。一旦有了条款,我就可以挖掘每个人的详细信息。


1
Mike,如果您不熟悉ESL的第3章,则可以进行浏览。提供的链接页面指向文本的免费合法PDF。
主教

您能澄清一下,是只保留十个原始变量吗?还是对使用一小部分原始变量线性组合的方法感兴趣(后者类似于传统的主成分回归法)会给你)。
主教

3
此答复给出了方法1的(许多)问题之一的具体示例。@cardinal对Frank Harrell的答复的评论使方法2的问题变得很棘手:您仅对独立变量进行任何处理,而无需考虑它们的影响与因变量的关系,风险无关紧要或更糟。就标准或“规范”答案而言,在此处要求一个问题有点像是要求讨论所有在椭圆曲线上找到有理点的方法的优点和缺点:-)。
Whuber

2
如此处其他人所指出的,方法1将导致问题。要以直观的方式了解到为什么如此正确/对该方法的另一个问题进行了描述,您可能需要阅读以下内容:stats.stackexchange.com/questions/20836/…–
gung-Reinstate Monica

1
感谢whuber和gung对第一个想法的问题的解释。
Mike Spivey,2012年

Answers:



6

方法1不起作用。方法2的希望取决于您的操作方式。最好按解释的方差降序输入主成分。一种更可解释的方法是进行变量聚类,然后将每个聚类减少到单个分数(不使用Y),然后使用聚类分数拟合模型。


+1。“变量聚类”是指因子分析 -这是我可能会使用的一种策略(在查看y之前)。我认为聚类分析是对观察结果进行分组,而不是对变量进行分组,但是我对聚类分析只有肤浅的知识。
gung-恢复莫妮卡

1
似乎没有先验的理由相信预测变量的最大方差方向必然与响应高度相关。也许我误会或误解了您的评论。你能澄清一下吗?
主教

1
此外,它听起来就像是OP不(完全)描述了主成分回归在他的方法2
卡迪纳尔

我在原始帖子中并不完全清楚,但是我需要原始变量的子集。因此,直接进行主成分分析或聚类并不是我真正想要的。
Mike Spivey

1
变量聚类与因子分析有关,但更简单。变量按照它们之间的相互关系进行分组。请参见varclusR Hmisc包中的功能,或SAS中的PROC VARCLUS。如果谨慎一点,数据减少可以帮助设置变量。如果值为0.3,则可以删除整个群集。对于主要组件,有一些技术,例如减少电池电量,实际上是用组成变量的子集近似地估计PC。P
Frank Harrell'2

3

在使用R进行数据挖掘的第5章中,作者展示了一些选择最有用的预测变量的方法。(在生物信息学的背景下,每个样本行都有12,000+列!)

他首先使用了一些基于统计分布的过滤器。例如,如果您有六个预测变量均具有相同的均值和标准差,则只需保留其中一个即可。

然后,他演示了如何使用随机森林来查找最有用的预测变量。这是一个独立的抽象示例。您可以看到我有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个组中随机选择一个。

这是一些代码,使用与上述相同的示例数据,从10列中选择3列:

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在某些统计界很流行,但在压缩感测领域也考虑了许多其他相关方法。


谢谢。我将查找LASSO。(看起来也像参考主教给出的那样。)
Mike Spivey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.