【问题标题】:How to minimize correlation of variable with data frame in R?如何最小化变量与R中数据框的相关性?
【发布时间】:2017-03-17 17:10:26
【问题描述】:

我有一个变量ZZ,其整数级别为 1、2 或 3,我希望尽可能使该变量与数据框中的其余变量不相关。

我实际上是在尝试通过选择值 1、2 或 3 来重新创建该变量,以最小化它与其他数据框变量的相关性。

如何在 R 中完成此任务?我不清楚如何在 R 中实现这种选择整数进行优化的机制。

我的函数计算相关性绝对值的总和。

mincorr <- function(x){
  abs(cor(df[, x], df$PS))+ abs(cor(df[, x], df$PROG))+ abs(cor(df[, x], df$RX))

}

这是我的部分数据的示例:

df <- read.table(text="PS   PROG    RX  ZZ
2   2   1   1
2   3   2   2
2   2   2   1
1   2   1   1
2   2   2   2
2   2   2   3
3   2   1   1
2   2   2   1
2   2   1   2
2   2   1   2", header=T)

我认为,由于可能值(1-3)的范围很小,我可以进行网格搜索。

library(NMOF)
gridSearch(mincorr("ZZ"), list(seq(1,3)))$minlevels

当然,上面的代码失败了。我是否需要以某种方式将 ZZ 的每一行指定为列表中的约束?我的数据集不是太大 - 700 行,但我认为这可能会变得难以管理。任何其他方法来做到这一点也非常感谢。

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    这是一个非常原始但可能的解决方案:我们可以使用模拟退火来扰动目标向量,从而使相关系数最小化。

    tmpx <- sort(sample(1:3, size = 100, replace = T))
    df <- data.frame(x = tmpx,
                     y = sample(tmpx, prob = (1:length(tmpx))^2),
                     z = sample(tmpx, prob = (length(tmpx):1)^3))
    
    objective_fun <- function(x, df) {
      sum(cor(x, df)^2)
    }
    
    objective_sann_simple_swap <- function(x, df) {
      idx <- sample(seq_along(x), size = 2) 
      xx <- x
      xx[idx] <- x[rev(idx)]
      return(xx)
    }
    
    optimRes <- optim(par = df$x, 
                      fn = objective_fun, 
                      gr = objective_sann_simple_swap, 
                      method = "SANN", 
                      df = subset(df, select = - x))
    
    newx <- optimRes$par
    cor(newx, df)
    

    基本上otim 调用objective_sann_simple_swapSANN 的每次迭代中发生了魔法,即我们随机交换两个元素。 (如果您有其他想法,可以在这里输入)。新向量根据目标函数objective_fun 进行评估。如果它“优化”了目标值(与 0 的相关性),那么这个新向量很有可能被保留以产生“后代”。 (阅读如何Simulated Annealing works)。

    基本上就是这样。对更大的向量使用更多的迭代(优化中的控制参数,请参阅?optim 的 SANN 部分)。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多