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

机器算法验证 回归 多重回归 多元分析 特征选择 模型选择
2022-03-12 03:46:19

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

关于如何做到这一点的一些(可能是幼稚的)想法:

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

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

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

看起来这将是一个足够普遍的问题,以至于会有一个标准的方法。

一个非常有帮助的答案是不仅提到一种标准方法,而且还概述了它的工作方式和原因。或者,如果没有一种标准方法,而是有多种具有不同优点和缺点的方法,那么一个非常有用的答案就是讨论它们的优缺点。

whuber 下面的评论表明最后一段中的要求过于宽泛。相反,我会接受主要方法的列表作为一个很好的答案,也许每个方法都有一个非常简短的描述。一旦我有了条款,我就可以自己挖掘每个细节。

4个回答

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

您可以考虑使用像 LASSO 这样的方法,通过选择最小化参数向量的一个范数的解决方案来规范最小二乘。事实证明,这在实践中具有最小化参数向量中非零条目数量的效果。尽管 LASSO 在某些统计领域很流行,但在压缩传感领域中已经考虑了许多其他相关方法。

在使用 R 进行数据挖掘的第 5 章中,作者展示了一些选择最有用的预测变量的方法。(在生物信息学的背景下,每个样本行有 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=TRUE)
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=TRUE)[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并且在一起使用时很有可能变得更好(这在金融领域很有可能),那么这可能是一个好方法。

这个问题通常称为子集选择,有很多不同的方法。有关相关文章的概述,请参阅 Google Scholar