Значения, которые генерирует BLOG, представляют собой точечные оценки после генерации случайных выборок из условной вероятностной графической модели с использованием алгоритма взвешивания правдоподобия (LWA). Отличия от аналитических значений в примере поста, вероятно, связаны с шумом от процесса случайной выборки.
Что может сбивать с толку, так это то, что BLOG по умолчанию инициализирует генератор случайных чисел с тем же фиксированным начальным числом, и поэтому результаты могут показаться обманчивыми, как будто они детерминированы. Если вы добавите флаг --randomize
в вызов run, вы увидите результаты использования других случайных начальных чисел.
Я не знаю теоретических свойств LWA (например, насколько сильно он ограничивает задние средние значения), но, по крайней мере, для наивной схемы генеративной выборки, средства, которые вы генерируете, находятся в пределах 95% ДИ. Вот пример Python, имитирующий 1000 прогонов 10K выборок.
import numpy as np
from scipy.stats import binom
np.random.seed(2019)
N, K = 10000, 1000
tp = np.empty(K)
for i in range(K):
t = binom(n=N, p=0.01).rvs()
f = N - t
detect_t = binom(n=t, p=0.800).rvs()
detect_f = binom(n=f, p=0.096).rvs()
tp[i] = detect_t / (detect_f + detect_t)
np.quantile(tp, [0.025, 0.5, 0.975])
# array([0.06177242, 0.07714902, 0.09462359])