Пример моего набора данных выглядит следующим образом:комбинаторной оптимизации в R
df = data.frame(cbind(a = c(1,3,5), b = c(4,1,7), c = c(1,9,10)))
y = c(8, 9, 20)
Я хочу, чтобы выяснить, лучшее сочетание, б и с, что обеспечивает максимальную корреляцию между суммой выбранных столбцов и у.
Например, найти самую сильную корреляцию между всеми этими комбинациями:
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
}
}
Есть простой способ оценить все возможные комбинации? Когда общее число столбцов увеличивается, становится очень трудно найти все комбинации. Какую стратегию я должен использовать здесь, чтобы найти наилучшую комбинацию (только локальную оптимизацию) в рамках ограниченных шагов? Как насчет пошагового выбора вперед/назад?
В этом случае модели не существует. Говоря вперед/назад пошаговый выбор, я имею в виду аналогичный метод, как то, что люди делают с регрессионными моделями: Вместо поиска всех возможных комбинаций столбцов все сразу начинайте с каждого столбца индивидуально и найдите тот, который имеет самую сильную корреляцию. Затем рассмотрите только комбинации, которые включают этот столбец.
Большое вам спасибо за советы!
Вы не можете запрашивать пакеты на переполнение стека. «Вопросы, предлагающие нам рекомендовать или находить книгу, инструмент, библиотеку программного обеспечения, учебник или другой ресурс вне сайта, не соответствуют теме« Переполнение стека », поскольку они склонны привлекать упрямые ответы и спам». –
Возможный дубликат: [r Все комбинации всех размеров?] (Http://stackoverflow.com/q/17817897/903061). – Gregor
Я не уверен, что вы подразумеваете под «прямым/обратным/ступенчатым выбором». Вы можете использовать, например, 'MASS :: stepAIC' для выбора линейной модели, но это будет линейные комбинации без вашего ограничения, что все коэффициенты равны 1. – Gregor