R定制约束优化功能

时间:2017-06-08 16:06:27

标签: r optimization constraints

目标:使用“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总是更大的sigma1”?

1 个答案:

答案 0 :(得分:1)

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

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

    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
    

    然后你需要&#34;回转换&#34;:使用新代码的旧版sigma2的实际值是

    > exp(2.391921) + 1.737843
    [1] 12.67232
    

    希望这有帮助。