R自定义约束优化函数

R自定义约束优化函数,r,optimization,constraints,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

目标:使用“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))

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

  • 用(sigma1+sigma2)替换所有可能出现的sigma2,以确保sigma2现在表示添加到sigma1的量
  • 在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
    }
    

    希望这有帮助。

    将问题参数化,使sigma2是添加到sigma1的量,并将代码中当前的sigma2替换为(exp(sigma2)+sigma1)太好了!谢谢。如果必须约束的话,我能做的是:对函数进行参数化,这样就可以插入上界和下界。对
    optim
    lower
    upper
    参数使用
    L-BFGS-B
    方法。
    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
    
    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
    
    > exp(2.391921) + 1.737843
    [1] 12.67232