【问题标题】:R. Add conditions within optimization functionR. 在优化函数中添加条件
【发布时间】:2019-01-03 12:42:48
【问题描述】:

我有如下优化功能,和这个类似: 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. 

我不确定如何在优化的上下文中执行此操作。

【问题讨论】:

标签: r dataframe optimization


【解决方案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))]

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

【讨论】:

  • 嗨@Xinz,非常感谢您的回复。当我有这些参数值时:p1=0.002577, p2=0, n1= 388, n2=390, pE=0.01282;我得到 a=0.9999339 和 Mopt = -154.933,但 Mopt 不应该达到这个值
  • @Lucas 似乎函数optimize 是基于启发式算法并且需要连续函数。所以我建议你使用反向答案中的耗尽方法。
  • 非常感谢@Xinz。您的脚本运行速度确实很慢。它已经运行了 3 个小时以上。例如,如果我将 seq(0,1,1e-7) 更改为 seq(0,1,1e-4) 可以吗?
  • @Lucas 是的,这完全取决于您需要的精度。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多