对于R和更先进的统计方法我是相当新的,并且我试图用它来取代以前使用SAS的最大对数似然优化过程。实际上,我试图在几千个方程中优化大约100 +/-变量。而且,即使存在~100个变量,对于任何给定的等式,大多数变量都不被使用。所以,我的输入(mu)看起来像下面的1000列和100行。在下面的等式中,我们正在优化u,其中k是矩阵mu中的值(等式中的指数k)。
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 nColumn),每个等式产生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获得最大可能性(I&#39;我也试过Nelder-Mead)。至少可以说,设置功能的方式非常慢。
rst <- optimx(PsCurrent$Ps,f_prb,lower=lb,upper=ub,method="L-BFGS-B")
做一些研究我发现在R中可能有更好的方法来制定功能,使其更快。具体来说,this reference显示出明显的改善。不幸的是,我在R的编程技巧并没有引导我翻译如何将我的功能放在一种更快的格式中,我希望我可以从这个论坛的专家那里得到一些见解(我确定我会得到一个Duh!时刻)。任何建议都将非常感谢。
答案 0 :(得分:0)
我能够分开工作,以获得我满意的结果。有关信息,我最初是在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是优化值的向量。