R 为优化L-BFGS-B效率对大型2D数据帧进行矢量化
我对R和更先进的统计方法相当陌生,我正试图用它来取代以前使用SAS的最大对数似然优化过程。实际上,我正试图在数千个方程上优化大约100个+/-变量。此外,即使有大约100个变量,对于任何给定的方程,大多数变量都不使用。因此,我的输入mu将如下所示,有1000个列和100个以上的行。在下面的方程式中,我们正在优化u,其中k是方程式中矩阵μ指数k的值R 为优化L-BFGS-B效率对大型2D数据帧进行矢量化,r,R,我对R和更先进的统计方法相当陌生,我正试图用它来取代以前使用SAS的最大对数似然优化过程。实际上,我正试图在数千个方程上优化大约100个+/-变量。此外,即使有大约100个变量,对于任何给定的方程,大多数变量都不使用。因此,我的输入mu将如下所示,有1000个列和100个以上的行。在下面的方程式中,我们正在优化u,其中k是方程式中矩阵μ指数k的值 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 ...Xm 0 0 1 2 0 0
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 ...Xm
0 0 1 2 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 1 0 0 0 0 0
0 0 1 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0
.
.
.
我的目标函数如下:n_t=nrow和n_d n列,每个方程的结果是1或0实体是好是坏
f_prb <- function(mu) {
y <- 0
for(j in 1:n_d) {
tmp_val <- 1
for(i in 1:n_t) {
tmp_val <- tmp_val*(mu[i]**k_mat[i,j])
}
y <- y+x[j,1]*log(tmp_val)+(1-x[j,1])*log(1-tmp_val)
}
y <- -y
}
初始估计值以PsCurrent$Ps为单位,上限和下限为0.1和0.99,所有u必须<1和>0,我使用optimx L-BFGS-B作为最大可能性,我也尝试过Nelder Mead。至少可以说,设置函数的方式非常慢
rst <- optimx(PsCurrent$Ps,f_prb,lower=lb,upper=ub,method="L-BFGS-B")
做了一些研究,我发现在R中可能有更好的方法来表达函数,使其更快。具体表现为明显的改善。不幸的是,我在R语言中的编程技能并不能让我翻译如何将我的函数转换为一种更快的格式,我希望我能从这个论坛的专家那里得到一些见解,我相信我会得到一个好消息!片刻如果有任何建议,我将不胜感激。我能够逐段解决这个问题,结果令我满意。作为参考,我最初从dfoptim中的Nelder Mead实现开始,因为这是一个有界优化。对于我的测试示例,这是在24小时内完成的。当我在optimx中切换到L-BFGS-B时,相同的实现时间减少到了大约8小时。通过下面的矢量化,我可以把时间缩短到22分钟 我的新目标是:
f_prb <- function(mu) {
#apply exponent to survival estimates
kMatExp <- mu ** k_mat
#calculate the product of the columns
kMatProd <- apply(kMatExp,2,prod)
#take log of the results
kMatProdLog <- log(kMatProd)
#set up the inverse values
kMatProdInv <- 1 - kMatProd
kMatProdInvLog <- log(kMatProdInv)
xInv <- 1 - x
#combine inverse and non inverse survival estimates
kMatFinal <- x * kMatProdLog + xInv * kMatProdInvLog
#get the sum of the estimates
y <- -sum(kMatFinal$gb)
}
注意,向量x是结果生存1或0,mu是优化值的向量