我试图在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
任何人都可以告诉我们最新情况吗?
答案 0 :(得分:3)
注意:我在答案中为内置optimx
切换了optim
。这不会改变内容。我还在PDF1
和PDF2
的功能正文中关注了您的意图,将beta1
和beta2
关闭。
你误解了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)}
我该如何管理?
您必须在中调用您正在优化的功能中的PDF1
和PDF2
。如果我理解正确,这将导致类似:
loglik <- function(par) {
sum(log( par[3]*PDF1(par[1]) + par[4]*PDF2(par[2]) )) + par[5]*(par[3] + par[4] - 1)
}