【发布时间】:2015-09-21 10:17:26
【问题描述】:
我需要优化以下object 函数。 qgpd 来自包fExtremes。
var.asym <- function(alpha1, alpha2, xi, beta, n){
term11 <- alpha1*(1-alpha1)^(2*xi-1)
term12 <- alpha1*(1-alpha1)^(xi-1)*(1-alpha2)^xi
term22 <- alpha2*(1-alpha2)^(2*xi-1)
Sigma <- matrix(c(term11, term12, term12, term22), nrow=2, byrow=TRUE)
Sigma*beta^2/n
}
mop.jacob.inv <- function(alpha1, alpha2, xi, beta){
term11 <- -qgpd(alpha1, xi, beta)/xi - beta*(1-alpha1)^xi*log(1-alpha1)/xi
term12 <- qgpd(alpha1, xi, beta)/beta
term21 <- -qgpd(alpha2, xi, beta)/xi - beta*(1-alpha2)^xi*log(1-alpha2)/xi
term22 <- qgpd(alpha2, xi, beta)/beta
jacob <- matrix(c(term11, term12, term21, term22), nrow=2, byrow=TRUE)
jacob.inv <- solve(jacob)
jacob.inv
}
var.asym2 <- function(alpha1, alpha2) var.asym(alpha1, alpha2, 0.2, 1, 1000)
mop.jacob.inv2 <- function(alpha1, alpha2) mop.jacob.inv(alpha1, alpha2, 0.2, 1)
# Function to be optimised:
object <- function(alpha1, alpha2){
term1 <- mop.jacob.inv2(alpha1, alpha2)%*%var.asym2(alpha1, alpha2)%*%t(mop.jacob.inv2(alpha1, alpha2))
sum(diag(term1))
}
为了最小化 object,我有一个额外的约束 0 < alpha1 < alpha2 < 1。我的问题是我是否可以使用R 中的通用optim 函数来做到这一点。如果是这样,语法是什么,即如何在R 中设置问题?还有其他和/或更好的方法吗?如果没有,有没有办法在R 中做到这一点?谢谢。
更新:
在评论的帮助下,我有以下几点:
object <- function(alpha1, alpha2){
term1 <- mop.jacob.inv2(alpha1, alpha2)%*%var.asym2(alpha1, alpha2)%*%t(mop.jacob.inv2(alpha1, alpha2))
1/sum(diag(term1))*(alpha1>0)*(alpha2>alpha1)*(alpha2<1)
}
optim(c(0.01, 0.75), object)
然后我收到错误Error in stopifnot(min(p, na.rm = TRUE) >= 0) : argument "alpha2" is missing, with no default。出了什么问题?
【问题讨论】:
-
您可以将
sum(diag(term1))与(alpha1>0)*(alpha2>alpha1)*(alpha2<1)相乘,这样当不满足条件时,您的目标函数为0。如果object是肯定的并且您正在寻找最大值,这应该可以工作。如果没有,您可以相应地调整上述因素。 -
@nicola 谢谢。
object确实是积极的。但我需要最小化而不是最大化它。我该如何调整? -
只需将
1/sum(diag(term1))乘以上述因子即可。 -
@nicola 我试过你的方法(见有问题的更新)。我收到错误消息
Error in stopifnot(min(p, na.rm = TRUE) >= 0) : argument "alpha2" is missing, with no default。怎么了? -
请始终指出您正在使用的软件包。我找不到
qgpd函数。是来自evir包吗?
标签: r optimization constraints