可以在R中只进行一次优化调用吗?

时间:2017-07-24 13:37:41

标签: r function for-loop optimization sapply

我试图在15次试验(p)中为两个二项分布找到两个q,共有5次成功(s)。

  • 对于两个二项分布中的第一个,我想要 左边的“5” (即 0到5 )累积概率“。05”alpha)。

  • 对于两个二项分布的第二个,我想 右边的“5” (即 5到15 )累积概率“。05”alpha)。

问题

我可以通过调用p两次找到两个optimize()(见下文)。但我想知道是否有一种方法可以进行一次optimize()调用以获得相同的答案?

q = 5 ; s = 15 ; alpha = .05

f1 <- function (q, s, p, alpha) {
  abs((pbinom(q = q, s = s, p)) - alpha)
  }

CI[1] = optimize(f1, interval = c(0, 1), alpha = alpha, s = s, q = q, tol = 1e-12)[[1]] 
## 0.5774437 (answer is correct)

f2 <- function(q, s, p, alpha){
  abs((pbinom(q = q - 1, s = s, p, lower.tail = FALSE)) - alpha)
  }

CI[2] = optimize(f2, interval = c(0, 1), alpha = alpha, s = s, q = q, tol = 1e-12)[[1]]
## 0.141664 (answer is correct)

1 个答案:

答案 0 :(得分:1)

您可以在此处为f mapply添加其他参数。使用mapply,您可以并行向函数提供多个参数。在这里,我们提供lower.tail参数和q参数。请注意,mapply只是一个便利函数,一旦将附加参数添加到函数中,就可以得到与for循环类似的东西。

f <- function(q, s, p, alpha, lower.tail = TRUE){
    abs((pbinom(q = q, s = s, p, lower.tail = lower.tail)) - alpha)
}

mapply(function(q, x) optimize(f, interval = c(0, 1), alpha = alpha, s = s,
                               q = q, tol = 1e-12, lower.tail=x),
       c(q, q-1), c(TRUE, FALSE))

返回具有所需值的矩阵

          [,1]        [,2]        
minimum   0.5774437   0.141664    
objective 4.32016e-09 1.626525e-10