R.在优化函数中添加条件

时间:2019-01-03 02:38:45

标签: r dataframe optimization

我具有以下优化功能,类似于此功能: R. Run optimization function in data frame

main <- function(p1, p2, n1, n2, pE) {

  # FIND MINIMUM a
  func <- function(a) {
    Mopt <- (p1-a*pE)/(1-a) 
    f_n <- (Mopt-p2)^2-Mopt*(1-Mopt)/(n1-1) - p2*(1-p2)/(n2-1)
    f_d <- Mopt*(1-p2)+p2*(1-Mopt)
    f_v <- f_n/f_d
    }
    opt <- optimize(func, seq(0, 1,by=0.01), maximum=FALSE)$minimum
  }

此处,“ main”的参数是数据框中的列。该函数返回获得最小f_v值所需的最小值“ a”。我想在函数中添加一些条件,换句话说,就是要强制某些对象获取一定范围内的值,以便获得最小的f_v。例如,Mopt必须遵循:

0 < Mopt < 1

和(1-a)必须遵循:

(1 - a) > 0. 

我不确定如何在优化的情况下执行此操作。

1 个答案:

答案 0 :(得分:1)

我认为只需添加条件即可。代码可能是这样的。

func <- function(a) {
  a = min(a, 1-1e-7);
  Mopt <- max(min((p1-a*pE)/(1-a), 1-1e-7), 1e-7);
  #here means a<1 and 0<Mopt<1. 1e-7 ensures the inequality. It can be 1e-6 or 1e-8 depends on the precision you need

  f_n <- (Mopt-p2)^2-Mopt*(1-Mopt)/(n1-1) - p2*(1-p2)/(n2-1)
  f_d <- Mopt*(1-p2)+p2*(1-Mopt)
  f_v <- f_n/f_d
  }
opt <- seq(0, 1, 1e-7)[which.min(sapply(seq(0, 1, 1e-7), func))]

添加: 上面的代码将返回正确的$objective,但可能无法搜索minimum。要搜索最小值,功能应为

func <- function(a) {
  if ((1-a)<1e-7) return(Inf);
  #Ensure the optimization is reached in the range of condition

  Mopt <-(p1-a*pE)/(1-a);
  if (Mopt<1e-7 || Mopt>(1-1e-7)) return(Inf);
  #Ensure the optimization is reached in the range of condition

  f_n <- (Mopt-p2)^2-Mopt*(1-Mopt)/(n1-1) - p2*(1-p2)/(n2-1)
  f_d <- Mopt*(1-p2)+p2*(1-Mopt)
  f_v <- f_n/f_d
  }
opt <- seq(0, 1, 1e-7)[which.min(sapply(seq(0, 1, 1e-7), func))]

这非常耗时,但是在不需要多次重复计算时可用。