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

时间:2012-03-06 21:41:28

标签: r optimization correlation

我可以在Excel中轻松完成此操作,但我的数据集已经太大了。在excel中,我会使用求解器。

Column A,B,C,D = random numbers 
Column E = random number (which I want to maximize the correlation to) 
Column F = A*x+B*y+C*z+D*j where x,y,z,j are coefficients resulted from solver In a separate cell, I would have correl(E,F)

在求解器中,我会通过改变变量x,y和设置某些约束来将correl(C,D)的目标设置为max:

1.  A,B,C,D have to be between 0 and 1
2.  A+B+C+D = 1

我怎样才能在R中这样做?谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

由于大多数优化例程在没有约束的情况下效果最佳, 你可以改变(重新参数化)寻找的问题 四个数字,x,y,z,j, 约束在0和1之间,总计为1, 找到三个实数q1,q2,q3的问题 (没有约束)。 例如,如果我们有一个映射实线R的函数s 到区间(0,1), 以下是诀窍:

  x = s(q1)
  y = (1-x) * s(q2)
  z = (1-x-y) * s(q3)
  j = 1-x-y-z

从两个方面理解可能更容易: 在这种情况下,点集(x,y,z) 坐标在0和1之间,总计为1 是一个三角形,s(q1),s(q2)形成一个坐标系 对于那个三角形中的点。

# Sample data
A <- rnorm(100)
B <- rnorm(100)
C <- rnorm(100)
D <- rnorm(100)
E <- rnorm(100)
f <- function(p) cor(p[1]*A + p[2]*B + p[3]*C + p[4]*D, E)

# Unconstrained optimization
optim(
  c(1,1,1,1)/4, # Starting values
  f,            # Function to maximize
  control=list(fnscale=-1) # Maximize (default is to minimize)
)

# Transform the parameters
sigmoid <- function(x) exp(x) / ( 1 + exp(x) )
convert <- function(p) {
  q1 <- sigmoid(p[1])
  q2 <- (1-q1) * sigmoid(p[2])
  q3 <- (1-q1-q2) * sigmoid(p[3])
  q4 <- 1-q1-q2-q3 
  c(q1,q2,q3,q4)
}

# Optimization
g <- function(p) f(convert(p))
p <- optim(c(0,0,0,0), g, control=list(fnscale=-1))
convert(p$par)

答案 1 :(得分:2)

这可能不是第一次通过的最简单方法,但我写了一个函数,它使用包BB来反算方程组。您可以下载它:http://home.comcast.net/~cgwcgw/ktsolve.R

更新

当然,comcast的主页早已不复存在。去CRAN获得“ktsolve”包

源文件顶部的注释中有相当易于理解的文档。基本上,你创建一个函数,其输出是你所有方程的结果,提供ktsolve一组“知识”和一个“未知数”的变量列表,而不是像商业应用程序“TK!Solver “它找到了你的答案。 如果你决定试一试,请随时给我发电子邮件以获得使用它的帮助。

答案 2 :(得分:0)

看起来你可能想要做的是linear regression。这会找到将预测变量乘以(在这种情况下,您的预测变量为A,B,C和D)的系数,以便生成的拟合值与实际值具有最小的可能平方差。这与最大化拟合值和实际值之间的相关性并不完全相同,但它完成相同的工作。这是一个例子 - a,b,c和d的系数等于你的x y z j

> a <- rnorm(10)
> b <- rnorm(10)
> c <- rnorm(10)
> d <- rnorm(10)
> e <- rnorm(10)
> lm(e~ a + b + c +d)

Call:
lm(formula = e ~ a + b + c + d)

Coefficients:
(Intercept)            a            b            c            d  
    -0.2881      -0.1898      -0.7282       0.2121       0.2758  

但是,这个线性模型有一个额外的参数,即截距。截距是一个常量,添加到所有拟合值,因此拟合值实际上是:     fit = constant + a * x + b * y + c * z + d * j

您可以通过运行以下命令来运行线性回归,而无需插入截距:

  

lm(e~-1 + a + b + c + d)