Python, вычисляющий биномиальное значение P: этот код выглядит правильно?
У меня есть этот набор данных:
ItemNumber Successes Trials Prob
15 14 95 0.047
9625 20 135 0.047
19 14 147 0.047
24 12 120 0.047
20 15 133 0.047
22 8 91 0.047
9619 16 131 0.047
10006 8 132 0.047
25 15 127 0.047
Я хочу определить кумулятивное значение p биномиального распределения для каждого элемента, чтобы понять вероятность наблюдения равного или большего числа вхождений элемента.
Я использовал этот код:
import sys
import scipy
from scipy.stats.distributions import binom
import sys
for line in open(sys.argv[1], 'r').readlines():
line = line.strip().split()
Item,num_succ,num_trials,prob = line[0],int(line[1]),int(line[2]),float(line[3])
print Item + "\t" + str(num_succ) + "\t" + str(num_trials) + "\t" + str(prob) + "\t" + str(1 - (binom.cdf(num_succ, num_trials, prob)))
Вывод выглядит так:
Item NumSucc NumTrials Prob Binomial
15 14 95 0.047 3.73e-05
9625 20 135 0.047 1.48e-06
19 14 147 0.047 0.004
24 12 120 0.047 0.0043
20 15 133 0.047 0.00054
22 8 91 0.047 0.027
9619 16 131 0.047 0.0001
10006 8 132 0.047 0.169
25 15 127 0.047 0.0003
Проблема: Когда я выбираю строку и проверяю полученное совокупное значение бинома p по онлайн-инструменту, например так: http://stattrek.com/online-calculator/binomial.aspx, результаты не совпадают.
Например,
Для позиции 20 (# успеха = 15, # испытаний = 133, вероятность = 0,047):
My Binomial P Val = 0.00054
StatTrek P Val = 0.0015
Тем не менее, из StatTrek я вижу, что то, что я посмотрел, - это совокупная вероятность: P(X> 15), но, поскольку я хочу "равный или больший", то на самом деле я хочу вычислить P(X>). = 15) (что составляет 0,0015).
Я изо всех сил пытаюсь правильно отредактировать приведенный выше код, чтобы изменить значение P, возвращаемое из "найти количество инцидентов больше, чем", чтобы "найти количество инцидентов больше или равно". Если бы кто-то мог продемонстрировать, я был бы признателен. Если вы посмотрите на этот вопрос, я пытался последовать комментарию Владимира.
2 ответа
Биноминальное распределение является дискретным распределением. Поэтому верно следующее P(X>14) = P(X>=15).
Поэтому, если binom.cdf вычисляет вероятность для P(X > N) (не так ли? Я не нашел документацию для него), вы должны изменить его на P(X > N - 1), если хотите проверить на P(X >= N).
Если вы хотите вычислить значение p_value для каждой записи, используйте этот код, который намного проще:
#alternative : {‘two-sided’, ‘greater’, ‘less’},
from scipy.stats import binom_test
binom_test(x= number_of_occurance, n = number_of_trail, p= probability, alternative= 'greater')