在R中,如何找到最佳变量以最小化两个数据集之间的相关性

时间:2012-03-17 22:07:42

标签: r optimization

  

可能重复:
  In R, how do I find the optimal variable to maximize or minimize correlation between several datasets

这可以在Excel中完成,但我的数据集太大了。在excel中,我会使用求解器。

我有5个变量,我想重新创建这5个变量的加权平均值,以便它们与第6个变量的相关性最低。

A,B,C,D,E列=随机数

列F =随机数(我想最小化相关性)

列G = A wi1 + B wi2 + C * 2i3 + D * wi4 + wi5 * E

其中wi1到wi5是求解器产生的系数在一个单独的单元格中,我会有相关的(F,G)

这一切都是在考虑到以下限制的情况下实现的: 1. A,B,C,D,E必须介于0和1之间 2. A + B + C + D + E = 1

我想打印这个结果,这样我就可以拥有一个有效的前沿类型图表。 我怎么能在R中这样做?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

我看了文森特提到的另一个帖子,我想我有更好的解决方案。我希望这是正确的。正如文森特所指出的那样,你最大的问题是这种非线性问题的优化工具在处理约束方面没有很大的灵活性。在这里,您有两种类型的约束:1)您的所有权重必须为>= 0,以及2)它们必须总和为1

optim函数有一个lower选项,可以处理您的第一个约束。对于第二个约束,您必须有点创造性:您可以通过在函数内缩放它们来使权重加到最小,即将相关函数重写为function(w) cor(X %*% w / sum(w), Y)

# create random data
n.obs <- 100
n.var <- 6
X <- matrix(runif(n.obs * n.var), nrow = n.obs, ncol = n.var)
Y <- matrix(runif(n.obs), nrow = n.obs, ncol = 1)

# function to minimize
correl <- function(w)cor(X %*% w / sum(w), Y)
# inital guess
w0 <- rep(1 / n.var, n.var)
# optimize
opt <- optim(par = w0, fn = correl, method = "L-BFGS-B", lower = 0)
optim.w <- opt$par / sum(opt$par)