Як знайти інтервал довіри для загальної кількості подій


9

У мене є детектор, який буде виявляти подію з певною вірогідністю p . Якщо детектор каже, що відбулася подія, то це завжди так, тому немає помилкових позитивних результатів. Коли я запускаю його деякий час, я виявляю k події. Я хотів би порахувати, яка загальна кількість подій, що сталися, були виявлені чи іншим чином, з певною впевненістю, скажімо, 95%.

Наприклад, скажімо, я виявив 13 подій. Мені хотілося б порахувати, що відбулося між 13 та 19 подіями з 95% впевненістю, виходячи з p .

Ось що я спробував поки що:

Імовірність виявлення k подій, якщо їх було n, становить:

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

Сума, що перевищує n від k до нескінченності, становить:

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

Я вирішив би використати негативний біноміальний розподіл , який повертає ймовірність того, що до k_th успіху буде X відмов, коли постійна ймовірність успіху p.

Використовуючи приклад

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), ви можете застосувати закон Байєса.

Ви знаєте, що ймовірність виникнення k подій, враховуючи, що n насправді сталося, регулюється біноміальним розподілом

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

Те, що ви дійсно хочете знати, - це ймовірність того, що n подій насправді відбулися, враховуючи, що ви спостерігали k. Байєс лежав:

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% спостережень. Для оцінки цього інтервалу можна використовувати метод Фельдмана-Кузена . Якщо у вас є доступ до ROOT, то для цього розрахунку є клас.ktrue

Ви могли б обчислити верхню та нижню межі за допомогою Фельдмана-Кузена з некоректованої кількості подій а потім масштабувати їх до 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

Сказавши це, щойно у вас є оцінка ви можете обчислити ймовірність того, що ви будете спостерігати різні реалізації, такі як 14, 15 тощо, використовуючи двочленний pdf.p


Ну я вже знаю с. Я також знаю кількість виявлених подій: k. Тож загальні події десь біля k / p. Я хотів би знайти інтервал навколо k / p, тому я можу сказати на 95% впевнений, що загальна кількість подій знаходиться всередині нього. Це має більше сенсу?
Statec

Я вважаю, що ОП намагається обчислити інтервал для N у вибірці двочленів, де p відомий. Має сенс спробувати це зробити.
Glen_b -Встановіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.