我是R的新手。所以我的许多代码可能效率不高。任何使我的代码运行更快的帮助都将受到赞赏。
我有一个巨大的目标函数需要优化。在基准情况下,我需要估计约400个变量。我的代码分为三部分。第一部分看起来像这样。这不是我要估计的最终功能。这是我的目标调用的函数。基本上,它创建一个矢量,每个x值包含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
是向量,用于包含一些中间结果。 beta是我要估计的参数,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分钟。当我增加dim=20
时,需要一个多小时。我的目标是在可能的情况下设置dim=59
和insample=60
或120
,但现在看起来像是一个神话。
提前谢谢!