2

我正在尝试使用optimize()以下函数(Clopper-Pearson 下限)找到 n 的最小值:

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 中的全局最小值以及如何在任何时间间隔内找到?

4

1 回答 1

2

我已经非常简要地查看了您链接的维基百科页面,并且在您的公式中没有看到任何明显的拼写错误(尽管我觉得它应该是 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")但最好的答案肯定是针对具体情况的。

于 2016-06-10T21:38:20.217 回答