【发布时间】:2016-11-14 20:40:10
【问题描述】:
我的数据集示例如下所示:
df = data.frame(cbind(a = c(1,3,5), b = c(4,1,7), c = c(1,9,10)))
y = c(8, 9, 20)
我想找出 a、b 和 c 的最佳组合,使所选列的总和与 y 之间的相关性最大化。
例如,找出所有这些组合中最强的相关性:
cor(df$a, y)
cor(df$b, y)
cor(df$c, y)
cor(df$a+df$b, y)
cor(df$a+df$c, y)
cor(df$b+df$c, y)
cor(df$a+df$b+df$c, y)
我目前的方法是:
combination = list()
for(i in 1:3){combination[[i]]=c(NA,1)}
names(combination) = c("a", "b", "c")
combi = arrange(expand.grid(combination), a)
combi = mutate(combi, cor = NA)
for (i in 1:2^3){
x = as.numeric(combi[i,])
col = x*c(1:3)
col = col[!is.na(col)]
if(length(col)>1){
t = rowSums(df[, col])
combi[i, 4] = cor(t,y)
}
if(length(col)==1){
t = df[, col]
combi[i, 4] = cor(t,y)
}
if(length(col)==0){
combi[i, 4] = NA
}
}
是否有评估所有可能组合的简单方法?当列的总数增加时,找到所有组合变得非常痛苦。我应该在这里使用什么样的策略来在有限的步骤内找到最佳组合(只是局部优化)?向前/向后逐步选择怎么样?
在这种情况下没有模型。通过说向前/向后逐步选择,我的意思是一种类似于人们对回归模型所做的方法: 不要一次搜索所有可能的列组合,而是从每一列单独开始,然后找到具有最强相关性的列。然后,仅考虑包含此列的组合。
非常感谢您的任何建议!
【问题讨论】:
-
你不能在 Stack Overflow 上索要包。 “要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。”
-
我不确定您所说的“前进/后退/逐步选择”是什么意思。您可以使用,例如,
MASS::stepAIC进行线性模型选择,但这将是线性组合,没有您所有系数都为 1 的约束。 -
我认为这里的关键问题不是找到所有组合,而是在有限的步骤中有效评估所有组合的策略。
标签: r optimization selection combinations