イベントの総数の信頼区間を見つける方法


9

ある確率pでイベントを検出する検出器があります。検出器がイベントが発生したと言った場合、それは常に当てはまるので、誤検知はありません。しばらく実行した後、k個のイベントが検出されました。発生したイベントの総数が何であるか、検出されたか、その他の方法で計算したいと思います。ある程度の自信を持って、たとえば95%です。

たとえば、13個のイベントが検出されたとします。13から19までのイベントがあり、pに基づいて95%の信頼性があると計算できるようにしたいと思います。

これが私がこれまでに試したことです:

合計がnの場合、k個のイベントを検出する確率は次のとおりです。

binomial(n, k) * p^k * (1 - p)^(n - k)

kから無限大までのnの合計は、次のとおりです。

1/p

つまり、合計n個のイベントが存在する確率は次のとおりです。

f(n) = binomial(n, k) * p^(k + 1) * (1 - p)^(n - k)

したがって、95%になりたい場合f(k) + f(k+1) + f(k+2) ... + f(k+m)は、少なくとも0.95である最初の部分合計を見つける必要があり[k, k+m]ます。答えはです。これは正しいアプローチですか?また、答えには閉じた式がありますか?

回答:


11

私は負の二項分布を使用することを選択します。これは、成功の一定の確率がpである場合、k番目の成功の前にX回の失敗がある確率を返します。

例を使う

k=17 # number of successes
p=.6 # constant probability of success

失敗の平均とsdは、

mean.X <- k*(1-p)/p
sd.X <- sqrt(k*(1-p)/p^2) 

故障Xの分布は、ほぼその形状になります。

plot(dnbinom(0:(mean.X + 3 * sd.X),k,p),type='l')

したがって、失敗の数は(95%の信頼性で)およそ

qnbinom(.025,k,p)
[1] 4

そして

qnbinom(.975,k,p)
[1] 21

したがって、あなたの不平等は[k + qnbinom(.025、k、p)、k + qnbinom(.975、k、p)]になります(例の数値[21,38]を使用)


5

n、p(n)の分布を選択する場合、ベイズの法則を適用できます。

n個が実際に発生した場合にk個のイベントが発生する確率は、二項分布によって支配されることを知っています。

p(k|n)=(nk)pk(1p)(nk)

あなたが本当に知りたいことは、あなたがkを観察したとすると、n個のイベントが実際に発生する確率です。ベイズ・レイによって:

p(n|k)=p(k|n)p(n)p(k)

総確率の定理を適用すると、次のように記述できます。

p(n|k)=p(k|n)p(n)np(k|n)p(n)

したがって、分布に関する詳細情報がないと、これ以上先に進むことはできません。p(n)

しかし、あなたがのために配布ピックアップしたい場合は対象の値が存在しこれよりも大きい、または十分にゼロに近い、あなたが少し良く行うことができますが。たとえば、の分布が範囲で均一であると仮定します。この場合:p(n)np(n)=0n[0,nmax]

p(n)=1nmax

ベイズの定式化は、次のように簡素化されます。

p(n|k)=p(k|n)np(k|n)

問題の最後の部分については、累積合計を実行し、累積確率分布関数を生成して、0.95の限界に達するまで繰り返すのが最善のアプローチであることに同意します。p(n|k)

この質問がSOから移行したとすると、Pythonのおもちゃのサンプルコードは以下に添付されています

import numpy.random

p = 0.8
nmax = 200

def factorial(n):
    if n == 0:
        return 1
    return reduce( lambda a,b : a*b, xrange(1,n+1), 1 )

def ncr(n,r):
    return factorial(n) / (factorial(r) * factorial(n-r))

def binomProbability(n, k, p):
    p1 = ncr(n,k)
    p2 = p**k
    p3 = (1-p)**(n-k)
    return p1*p2*p3

def posterior( n, k, p ):
    def p_k_given_n( n, k ):
        return binomProbability(n, k, p)
    def p_n( n ):
        return 1./nmax
    def p_k( k ):
        return sum( [ p_n(nd)*p_k_given_n(nd,k) for nd in range(k,nmax) ] )
    return (p_k_given_n(n,k) * p_n(n)) / p_k(k)


observed_k   = 80
p_n_given_k  = [ posterior( n, observed_k, p ) for n in range(0,nmax) ]
cp_n_given_k = numpy.cumsum(p_n_given_k)
for n in xrange(0,nmax):
    print n, p_n_given_k[n], cp_n_given_k[n]

3

イベントを測定し、検出効率がことがわかっている場合、測定結果を「真の」カウントまで自動的に修正できます。kpktrue=k/p

あなたの質問は、観測の95%が該当するの範囲を見つけることです。Feldman-Cousinsメソッドを使用して、この間隔を推定できます。ROOTにアクセスできる場合は、この計算を行うクラスがあります。ktrue

Feldman-Cousinsを使用して、修正されていないイベント数から上限と下限を計算し、 100%に拡大します。このようにして、測定されなかったスケーリングされた数値ではなく、実際の測定数が不確実性を決定します。k1/p

{
gSystem->Load("libPhysics");

const double lvl = 0.95;
TFeldmanCousins f(lvl);

const double p = 0.95;
const double k = 13;
const double k_true = k/p;

const double k_bg = 0;

const double upper = f.CalculateUperLimit(k, k_bg) / p;
const double lower = f.GetLowerLimit() / p;

std::cout << "["
  lower <<"..."<<
  k_true <<"..."<<
  upper <<
  "]" << std::endl;
}

ありがとうございます。これが私が探していた答えだと思います。
ステートク

2

信頼区間の目的を誤解されたと思います。信頼区間により、パラメーターの真の値がどこにあるかを評価できます。したがって、あなたのケースでは、信頼区間を作成できます。データの間隔を構成しても意味がありません。p

そうは言っても、推定値が得られたら、2項分布の確率密度関数を使用して、14、15などの異なる実現を観察する確率を計算できます。p


まあ私はすでにpを知っています。検出されたイベントの量も知っています。したがって、イベントの合計はk / pあたりになります。k / pあたりの間隔を確認したいので、イベントの総数がその内部にあることを95%確認できます。それはもっと理にかなっていますか?
ステートク

OPは、pが既知である二項サンプリングでNの間隔を計算しようとしていると思います。そうしようとするのは理にかなっています。
Glen_b-2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.