2

次の関数の n の最小値を見つけるために使用しようとしてoptimize()います (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から疑われるものではありません。それで、私の2つの質問は、Rでグローバル最小値を適切に見つける方法と、任意の間隔でそうする方法ですか?

4

1 に答える 1

2

リンクしたウィキペディアのページをざっと見ましたが、数式に明らかなタイプミスは見当たりません (ただし、0.025=alpha/2 ではなく 0.975=1-alpha/2 にすべきだと思います)。ただし、コード化した関数を非常に広いスケールで評価すると、混乱を招く極小値が存在しないことが示唆されます。私の強い推測は、あなたのロジックが間違っているか (つまり、n->0 が実際には正しい答えです)、またはタイプミスのためにコーディングしていると思われるものをコーディングしていないことです (おそらくウィキペディアの記事で、可能性は低いと思われますが) または thinko.

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 に答える