我试图使用optimize()
来找到以下函数的最小值n(Clopper-Pearson下界):
f <- function (n, p=0.5)
(1 + (n - p*n + 1) /
(p*n*qf(p= .025, df1= 2*p, df2= 2*(n - p + 1))))^-1
以下是我尝试优化它的方法:
n_clop <- optimize(f.1, c(300,400), maximum = FALSE, p=0.5)
n_clop
我在[300,400]的间隔内做了这个,因为我怀疑它内部的值,但最终我想在0和无穷大之间进行优化。似乎这个命令正在产生一个局部最小值,因为无论它在哪个区间产生该区间的下限作为最小值 - 这不是我怀疑clopper-pearson。那么,我的两个问题是如何在R中正确找到全局最小值以及如何在任何时间间隔内找到它?
答案 0 :(得分:2)
我非常短暂地查看了Wikipedia page you linked并且没有看到你的公式中有任何明显的拼写错误(虽然我觉得它应该是0.975 = 1- alpha / 2而不是0.025 = alpha / 2?)。但是,评估您在非常广泛的范围内编码的功能表明,没有任何局部最小值会让您烦恼。我的强烈猜测是,你的逻辑是错误的(即,n-> 0真的是正确的答案),或者由于输入错误而你没有编码你认为你编码的东西(可能在维基百科的文章中,虽然这似乎不太可能)或思想。
f <- function (n, p=0.5)
(1 + (n - p*n + 1) /
(p*n*qf(p= .025, df1= 2*p, df2= 2*(n - p + 1))))^-1
确认您在所选时间间隔内获得正确答案:
curve(f(x),c(300,400))
评估范围广(n = 0.00001至1000000):
curve(f(10^x),c(-5,7))
正如@MrFlick建议的那样,全局优化很难。你可以从optim(...method="SANN")
开始,但最好的答案绝对是针对特定情况的。