총 이벤트 수에 대한 신뢰 구간을 찾는 방법


9

확률이 p 인 이벤트를 감지하는 검출기가 있습니다. 탐지기가 이벤트가 발생했다고 말하면 항상 그런 경우이므로 오 탐지가 없습니다. 한동안 실행하면 k 개의 이벤트가 감지됩니다. 발생한 총 이벤트 수, 감지 또는 기타 방법으로 95 %라고 확신합니다.

예를 들어 13 개의 이벤트가 감지되었다고 가정하겠습니다. p를 기준으로 95 % 신뢰도로 13에서 19 사이의 사건이 있음을 계산할 수 있기를 원합니다 .

지금까지 시도한 내용은 다음과 같습니다.

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_th 성공 전에 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

따라서 inerval은 [k + qnbinom (.025, k, p), k + qnbinom (.975, k, p)]입니다 (예제 번호 [21,38] 사용)


5

n, p (n)에 대한 분포를 선택한다고 가정하면 Bayes 법칙을 적용 할 수 있습니다.

n이 실제로 발생했을 때 발생하는 k 개의 사건 확률이 이항 분포에 의해 결정된다는 것을 알고 있습니다.

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

실제로 알고 싶은 것은 k를 관찰하면 n 개의 이벤트가 실제로 발생할 확률입니다. 베이 즈 (Bayes)

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에서 마이그레이션되었다는 것을 감안할 때 파이썬의 장난감 샘플 코드는 아래에 첨부되어 있습니다

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

이벤트 를 측정 하고 탐지 효율이 측정 결과를 "true"카운트 까지 자동으로 수정할 수 있습니다 .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;
}

고마워요. 나는 이것이 내가 찾고있는 대답이라고 생각합니다.
Statec

2

나는 당신이 신뢰 구간의 목적을 오해했다고 생각합니다. 신뢰 구간을 통해 매개 변수의 실제 값이있는 위치를 평가할 수 있습니다. 따라서 귀하의 경우에 대한 신뢰 구간을 구성 할 수 있습니다.p. 데이터 간격을 구성하는 것은 의미가 없습니다.

일단 당신이 추정하면 p 이항 pdf를 사용하여 14, 15 등과 같은 다른 실현을 관찰 할 확률을 계산할 수 있습니다.


글쎄, 난 이미 알고 또한 감지 된 이벤트의 양을 알고 있습니다. k. 총 이벤트 수는 k / p 정도입니다. k / p 주위의 간격을 찾아서 총 이벤트 수가 그 안에 있음을 95 % 확신 할 수 있습니다. 더 이해가 되나요?
Statec

OP가 이항 샘플링에서 N에 대한 간격을 계산하려고한다고 생각합니다 .p는 알려져 있습니다. 그것을 시도하는 것이 합리적입니다.
Glen_b-복지국 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.