Я борюсь с проблемой программирования. Цель состоит в том, чтобы найти оптимальную среднюю совокупность нескольких столбцов, чтобы этот столбец агрегирования максимизировал корреляцию с другим столбцом.
В качестве игрушечного примера рассмотрим следующие данные:
set.seed(123)
df <- cbind(data.frame(FIRM = rnorm(36, 0, 0.05)),
data.frame(matrix(rnorm(36 * 50, 0, 0.05), 36, 50)))
Таким образом: цель состоит в том, чтобы найти оптимальную комбинацию из 50 «X» столбцов, чтобы при взятии средних значений этих столбцов корреляция со столбцом «FIRM» была максимальной. Однако, хотя это лишь небольшой пример, уже существует 50 возможных факторных комбинаций.
Часть проблемы заключается в том, что реальный набор данных намного больше (т.е. около 20 000 оптимизаций "FIRM", с более чем 5000 возможных столбцов "X" для агрегации на оптимизацию). До сих пор я начинал с поэтапной оптимизации, но, учитывая размер набора данных, это очень неэффективно. Я надеялся получить некоторое представление о лучшем способе кодирования этой проблемы.
До сих пор я написал некоторый код, который принимает любую линейную комбинацию и максимизирует эту корреляцию с исходным столбцом. Однако теперь я хотел бы отрегулировать это так, чтобы код не взвешивал столбцы с любыми другими весами, отличными от 1 или 0.
Код, который у меня есть на данный момент:
set.seed(123)
firm <- rnorm(36, 0, 0.05)
peers <- matrix(rnorm(36 * 50, 0, 0.05), 36, 50)
#Function to maximize
cor.model <- function(w = rep(1 / ncol(peers), ncol(peers))){
f_score <- peers %*% (w / sum(w))
x <- f_score
y <- firm
correl <- cor(x,y)
return(correl)
}
#Output
out <- optim(par = rep(1 / ncol(peers), ncol(peers)),
fn = cor.model,
method = "L-BFGS-B",
lower = rep(0, ncol(peers)), # W_i >= 0 for all i
upper = rep(1, ncol(peers)), # W_i <= 1 for all i)
control = list(fnscale = -1))
out$par/sum(out$par)
cor(firm, rowSums(peers))
cor(firm, rowSums(t(as.vector(out$par/sum(out$par))*t(peers))))
Большое спасибо!