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



可能重复:
在R中,我如何找到最佳变量来最大化或最小化几个数据集之间的相关性

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

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

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

F列=随机数(我想将其相关性降至最低)

G列=Awi1+Bwi2+C*2i3+D*wi4+wi5*E

其中wi1到wi5是求解器产生的系数。在单独的单元格中,我将具有correla(F,G)

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

我想打印这个结果,这样我就可以有一个有效的边界类型图表。如何在R中执行此操作?谢谢你的帮助。

我查看了Vincent提到的另一个线程,我认为我有一个更好的解决方案。我希望它是正确的。正如Vincent所指出的,最大的问题是,用于此类非线性问题的优化工具在处理约束时没有提供很大的灵活性。这里有两种类型的约束:1)所有权重必须为>= 0,2)它们必须求和为1

optim函数有一个lower选项,可以处理您的第一个约束。对于第二个约束,你必须有点创造性:你可以通过在要最小化的函数内缩放权重来迫使权重总和为1,即将相关函数重写为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)