优化会重现初始值吗?

时间:2015-05-31 02:13:20

标签: r optimization

我试图在R

中使用optimx最大化以下功能
#Initial Parameter Values
beta1=0.5
beta2=0.5
lambda1=0.5
lambda2=0.5
delta=5

loglik=function(par) {sum(log(lambda1*PDF1+lambda2*PDF2))+delta*(lambda1+lambda2-1)}

G2=optimx(c(0.5,0.5,0.5,0.5,2),fn=loglik,gr=NULL, lower=-Inf, upper=Inf, hessian=FALSE)

但每次优化都会重现我提供给系统的初始值,例如,这是我使用上述初始值进行优化的响应。

             p1  p2  p3  p4 p5    value fevals gevals niter convcode  kkt1 kkt2
Nelder-Mead 0.5 0.5 0.5 0.5  2 5144.569      6     NA    NA        0 TRUE   NA
BFGS        0.5 0.5 0.5 0.5  2 5144.569      1      1    NA        0 TRUE   NA
            xtimes
Nelder-Mead      0
BFGS             0

任何人都可以告诉我们最新情况吗?

1 个答案:

答案 0 :(得分:3)

注意:我在答案中为内置optimx切换了optim。这不会改变内容。我还在PDF1PDF2的功能正文中关注了您的意图,将beta1beta2关闭。

你误解了optimx,以及老实说,功能如何运作。

以下是loglik

的定义
loglik <- function(par) {
  sum(log(lambda1*beata1 + lambda2*beta2)) + delta*(lambda1 + lambda2 - 1)
}

现在观看

> loglik(1)
[1] -0.6931472
> loglik(2)
[1] -0.6931472
> loglik("I like cats.")
[1] -0.6931472

你还没有定义一个函数,而是一个常数。您可以通过观察您定义的函数不参考其参数par来看到这一点。相反,它会忽略par,只是在其封闭环境中查找它包含的变量。

你很可能打算这样做

loglik <- function(par) {
  sum(log(par[3]*par[1] + par[4]*par[2])) + par[5]*(par[3] + par[4] - 1)
}

之后,优化按预期工作

optim(c(0.5,0.5,0.5,0.5,2), fn=loglik, gr=NULL, lower=-Inf, upper=Inf, hessian=FALSE)
$par
[1]  0.6466066  0.8102440 -0.2802594  0.2236580  2.6381565

$value
[1] -40.91057

$counts
function gradient 
     501       NA 

$convergence
[1] 1

汇总代码1 表示收敛

  

1   表示已达到迭代限制maxit。

确实,有很多警告

warnings()
1: In log(par[3] * par[1] + par[4] * par[2]) : NaNs produced
2: In log(par[3] * par[1] + par[4] * par[2]) : NaNs produced

您必须对此进行排序,我不知道您通过此次通话实际尝试完成的任务。

  

谢谢,但问题是PDF1和PDF2也是由

定义的功能      

PDF1 = function(beta1){BiCopPDF(u,v,par = abs(beta1),family = 5)}

     

     

PDF2 = function(beta2){BiCopPDF(u,v,par = beta2,family = 3)}

     

我该如何管理?

您必须在中调用您正在优化的功能中的PDF1PDF2 。如果我理解正确,这将导致类似:

loglik <- function(par) {
  sum(log( par[3]*PDF1(par[1]) + par[4]*PDF2(par[2]) )) + par[5]*(par[3] + par[4] - 1)
}