Optim真的很慢

时间:2018-12-05 19:46:41

标签: r performance loops

我是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))
}

diminsample是预先选择的参数。目前,它们是22。但是最终我想要dim=59insample=60120vo是向量,用于包含一些中间结果。 beta是我要估计的参数,x是数据。

我有几层循环。在外部循环中,t1insampleindex是一个向量,其中包含我要处理的行号。它来自名为market_norm_design_matrix的数据集,该数据集每个月约有1500次观察。这些月份由变量名称“日期”指示。因此,当t=1时,index将包含第一个月的行数,即index = c(1,2,...,1500)。当t=2index = 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=5dim=2insample=2。在这种情况下,我需要估算2 * 7 = 14的变量,而我仅使用前两个月的数据。花了大约2分钟。当我增加dim=20时,需要一个多小时。我的目标是在可能的情况下设置dim=59insample=60120,但现在看起来像是一个神话。

提前谢谢!

0 个答案:

没有答案