Я новичок в R. Поэтому мой код, вероятно, не настолько эффективен.Любая помощь, которая заставляет мой код работать быстрее, очень ценится.
У меня есть гигантская целевая функция для оптимизации.В базовом случае у меня есть около 400 переменных для оценки.Мой код состоит из трех частей.Первый кусок выглядит следующим образом.Это не последняя функция, которую я пытаюсь оценить.Это функция, которую вызывает моя цель.В основном это создает вектор, который имеет 7 элементов для каждого значения х.
L=5
additive<-function(x){
c(1,x,x^2,max(x-1/L,0)^2,max(x-2/L,0)^2,max(x-3/L,0)^2,max(x-4/L,0)^2)
}
Вторая часть - это целевая функция, которую я хочу оптимизировать, которая выглядит следующим образом.
v=rep(0,dim)
o=rep(0,insample)
# Objective Function
obj <- function(beta,x){
beta=matrix(beta,L+2,dim)
for (t in 1:insample){
index=which(market_norm_design_matrix$date ==
unique(market_norm_design_matrix$date)[t])
for (i in 1:dim){
v[i]=sum(t(t(sapply(x[index,i+6],additive))%*%beta[,i]/length(index)+x[index,6]/dim)%*%x[index,2])
}
o[t]=((1+sum(v))^(1-r))/(1-r)
}
return(-mean(o))
}
dim
и insample
- предварительно выбранный параметр.На данный момент они 2
и 2
.Но в конце концов я хочу dim=59
и insample=60
или 120
.v
и o
- это вектор, который содержит некоторые промежуточные результаты.бета - это параметр, который я пытаюсь оценить, а x
- это данные.
У меня есть слои петель.Во внешнем цикле t
идет от 1
до insample
.index
- это вектор, содержащий номера строк, с которыми я хочу что-то сделать.Он поступает из набора данных под названием market_norm_design_matrix
, в котором содержится около 1500 наблюдений за каждый месяц.Эти месяцы обозначаются именем переменной «дата».Поэтому, когда t=1
, index
будет содержать количество строк в первом месяце, т.е. index = c(1,2,...,1500)
.При t=2
, index = c(1501,1502,...,3000)
и тд.Как только у нас есть индекс, теперь мы идем во внутренний цикл.
Во внутреннем цикле
sapply(x[index,i+6],additive)
собирается сгенерировать матрицу, размеры которой (length(index),7)
,
t(sapply(x[index,i+6],additive))%*%beta[,i]/length(index)
делают эту вещь вектором, и я будусохрани остальное.
The last piece of the code is:
start_time <- Sys.time()
optim(matrix(rep(0,dim*
(L+2)),ncol=dim),obj,x=as.matrix(market_norm_design_matrix),method =
"BFGS",control=list(trace=TRUE))
end_time <- Sys.time()
end_time-start_time
which is for pure estimation purpose.
Надеюсь, я проделал разумную работу, представив свою модель.Теперь вопрос в том, что он работает так медленно.Для игрушечного футляра я установил L=5
, dim=2
и insample=2
.В этом случае у меня есть 2 * 7 = 14 переменных для оценки, и я использую данные только за первые 2 месяца.Это заняло около 2 минут.Когда я увеличиваю dim=20
, это занимает больше часа.Моя цель - установить dim=59
и insample=60
или 120
, если это возможно, но теперь это выглядит как миф.
Заранее спасибо!