【问题标题】:R customized constraints optim functionR自定义约束优化功能
【发布时间】:2017-11-10 11:02:39
【问题描述】:

目标:用“optim”函数估计sigma1和sigma2,而sigma2必须大于sigma1

模拟数据(y)

我有以下类型的数据 y:

N<-50

delta<-matrix(rep(0, N*N), nrow=N, ncol=N)
 for(i in 1:(N )){
  for (j in 1:N)
    if (i == j+1 | i == j-1){
    delta[i,j] <- 1;
    }
 }

sigma1<-5
sigma2<-10
diagonal=2*sigma1^2+sigma2^2
nondiag<--sigma1^2*delta
Lambda_i<-(diag(diagonal,N)+-nondiag)/diagonal
sig<-as.matrix(diagonal*Lambda_i)
sig

mu<-rep(0, N)
y<-as.vector(mvnfast::rmvn(1,mu, sig))

创建最大似然函数

mle<-function(par){
  sigma1<-par[1]
  sigma2<-par[2]
  diagonal=2*sigma1^2+sigma2^2
  nondiag<--sigma1^2*delta
  Lambda_i<-(diag(diagonal,N)+-nondiag)/diagonal
  sig<-as.matrix(diagonal*Lambda_i)


  #lokli
  loglik<--as.numeric(mvnfast::dmvn(matrix(y, byrow=T, ncol=N),mu, sig, log=T))
  loglik
}

优化

par <- c(5,5)
fit<-optim(par,mle,hessian=T,
       method="L-BFGS-B",lower=c(0.01,0.01),
       upper=c(30,30))
fit$par

问题:如何在优化过程中设置约束:“sigma2 always Greater sigma1”?

【问题讨论】:

  • 参数化问题,使 sigma2 是添加到 sigma1 的数量,并将代码中的当前 sigma2 替换为 (exp(sigma2) +sigma1)

标签: r optimization constraints


【解决方案1】:

只是为了跟进我的评论。我们可以使用两个技巧:

  1. 用 (sigma1 + sigma2) 替换所有可能出现的 sigma2,以确保 sigma2 现在代表添加到 sigma1 的数量
  2. 在 sigma2 上使用 exp 以确保它是非负数。

可能性变成

mlenew<-function(par){
  sigma1<-par[1]
  sigma2<-par[2]
  diagonal=2*sigma1^2+(sigma1 + exp(sigma2))^2
  nondiag<--sigma1^2*delta
  Lambda_i<-(diag(diagonal,N)+-nondiag)/diagonal
  sig<-as.matrix(diagonal*Lambda_i)
  #lokli
  loglik<--as.numeric(mvnfast::dmvn(matrix(y, byrow=T, ncol=N),mu, sig, log=T))
  loglik
}

如果我运行你的代码,我会得到

> fit<-optim(par,mle,hessian=T,
+        method="L-BFGS-B",lower=c(0.01,0.01),
+        upper=c(30,30))
> fit$par
[1]  1.738656 12.672040

有了我得到的新代码

> fit<-optim(par,mlenew,hessian=T,
+        method="L-BFGS-B",lower=c(0.01,0.01),
+        upper=c(30,30))
> fit$par
[1] 1.737843 2.391921

然后你需要“反向转换”:旧版本sigma2使用新代码的实际值为

> exp(2.391921) + 1.737843
[1] 12.67232

希望这会有所帮助。

【讨论】:

  • 太棒了!谢谢。
  • 如果约束必须是:a
  • 对函数进行参数化,以便您可以插入上限和下限。对optimlowerupper 参数使用L-BFGS-B 方法。
猜你喜欢
  • 2021-03-30
  • 2012-12-08
  • 2011-07-23
  • 1970-01-01
  • 2017-08-01
  • 2021-07-29
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多