Представьте себе, что у вас есть процесс, который следует за биномиальным распределением: для каждого проведенного испытания событие происходит или не происходит, называемое «успехами» и «провалами». Если в эксперименте вы хотите измерить частоту, с которой происходят успехи, то наилучшая оценка дается простоk/N, дляkуспехи изNиспытаний. Однако наша уверенность в этой оценке будет определяться тем, сколько испытаний было проведено и сколько успехов было отмечено. Статические функции<binomial_distribution<>::find_lower_bound_on_p
>и<binomial_distribution<>::find_upper_bound_on_p
>позволяют рассчитать доверительные интервалы для оценки частоты возникновения.
Образец программыbinomial_confidence_limits.cppиллюстрирует их использование. Он начинается с определения процедуры, которая будет печатать таблицу пределов доверия для различных степеней уверенности:
#include <iostream>
#include <iomanip>
#include <boost/math/distributions/binomial.hpp>
void confidence_limits_on_frequency(unsigned trials, unsigned successes)
{
using namespace std;
using namespace boost::math;
cout <<
"___________________________________________\n"
"2-Sided Confidence Limits For Success Ratio\n"
"___________________________________________\n\n";
cout << setprecision(7);
cout << setw(40) << left << "Number of Observations" << "= " << trials << "\n";
cout << setw(40) << left << "Number of successes" << "= " << successes << "\n";
cout << setw(40) << left << "Sample frequency of occurrence" << "= " << double(successes) / trials << "\n";
Процедура теперь определяет таблицу уровней значимости: это вероятности того, что истинная частота возникновения лежит за пределами расчетного интервала:
double alpha[] = { 0.5, 0.25, 0.1, 0.05, 0.01, 0.001, 0.0001, 0.00001 };
Ниже приводится довольно красивая печать заголовка таблицы:
cout << "\n\n"
"_______________________________________________________________________\n"
"Confidence Lower CP Upper CP Lower JP Upper JP\n"
" Value (%) Limit Limit Limit Limit\n"
"_______________________________________________________________________\n";
А теперь для важной части — самих интервалов — для каждого значенияальфамы призываем<find_lower_bound_on_p
>и<find_lower_upper_on_p
>получить нижние и верхние границы соответственно. Обратите внимание, что, поскольку мы вычисляем двусторонний интервал, мы должны разделить значение альфа на два.
Обратите внимание, что вычисление двух отдельныходнобоких границ, каждая с уровнем риска α это не то же самое, что вычисление двухстороннего интервала. Если бы мы вычислили два односторонних интервала, каждый с риском того, что истинное значение находится за пределами интервала α тогда:
- Риск того, что он меньше нижней границы, составляет α.
и
- Риск того, что он больше верхней границы, также составляет α.
Таким образом, риск, что он находится за пределамиверхней или нижней границы, составляетдваждыальфа, и вероятность того, что он находится внутри границ, поэтому не так высока, как можно было бы подумать. Вот почему α/2 следует использовать в расчетах ниже.
Напротив, если бы мы вычислили односторонний интервал, например:«Вычислим нижнюю границу так, чтобы мы были на P% уверены, что истинная частота возникновения больше некоторого значения», тогда мы бынеразделились на два.
Наконец, заметим, что<binomial_distribution
>предоставляет выбор из двух методов для расчета, мы распечатываем результаты обоих методов в этом примере:
for(unsigned i = 0; i < sizeof(alpha)/sizeof(alpha[0]); ++i)
{
cout << fixed << setprecision(3) << setw(10) << right << 100 * (1-alpha[i]);
double l = binomial_distribution<>::find_lower_bound_on_p(
trials, successes, alpha[i]/2);
double u = binomial_distribution<>::find_upper_bound_on_p(
trials, successes, alpha[i]/2);
cout << fixed << setprecision(5) << setw(15) << right << l;
cout << fixed << setprecision(5) << setw(15) << right << u;
l = binomial_distribution<>::find_lower_bound_on_p(
trials, successes, alpha[i]/2,
binomial_distribution<>::jeffreys_prior_interval);
u = binomial_distribution<>::find_upper_bound_on_p(
trials, successes, alpha[i]/2,
binomial_distribution<>::jeffreys_prior_interval);
cout << fixed << setprecision(5) << setw(15) << right << l;
cout << fixed << setprecision(5) << setw(15) << right << u << std::endl;
}
cout << endl;
}
И это все, что нужно. Давайте посмотрим некоторые результаты выборки для соотношения успеха 2 к 10, сначала для 20 испытаний:
___________________________________________
2-Sided Confidence Limits For Success Ratio
___________________________________________
Number of Observations = 20
Number of successes = 4
Sample frequency of occurrence = 0.2
_______________________________________________________________________
Confidence Lower CP Upper CP Lower JP Upper JP
Value (%) Limit Limit Limit Limit
_______________________________________________________________________
50.000 0.12840 0.29588 0.14974 0.26916
75.000 0.09775 0.34633 0.11653 0.31861
90.000 0.07135 0.40103 0.08734 0.37274
95.000 0.05733 0.43661 0.07152 0.40823
99.000 0.03576 0.50661 0.04655 0.47859
99.900 0.01905 0.58632 0.02634 0.55960
99.990 0.01042 0.64997 0.01530 0.62495
99.999 0.00577 0.70216 0.00901 0.67897
Как вы можете видеть, даже на уровне 95% достоверности границы действительно довольно широки (этот пример выбран для того, чтобы его можно было легко сравнить с тем, который приведен вNIST/SEMATECH e-Handbook of Statistical Methods).Здесь. Следует также отметить, что метод расчета Клоппера-Пирсона (CP выше) дает гораздо более пессимистические оценки, чем метод Джеффриса Приора (JP выше).
Сравните это с результатами программы 2000 испытаний:
___________________________________________
2-Sided Confidence Limits For Success Ratio
___________________________________________
Number of Observations = 2000
Number of successes = 400
Sample frequency of occurrence = 0.2000000
_______________________________________________________________________
Confidence Lower CP Upper CP Lower JP Upper JP
Value (%) Limit Limit Limit Limit
_______________________________________________________________________
50.000 0.19382 0.20638 0.19406 0.20613
75.000 0.18965 0.21072 0.18990 0.21047
90.000 0.18537 0.21528 0.18561 0.21503
95.000 0.18267 0.21821 0.18291 0.21796
99.000 0.17745 0.22400 0.17769 0.22374
99.900 0.17150 0.23079 0.17173 0.23053
99.990 0.16658 0.23657 0.16681 0.23631
99.999 0.16233 0.24169 0.16256 0.24143
Теперь, даже когда уровень достоверности очень высок, пределы действительно довольно близки к экспериментально рассчитанному значению 0,2. Кроме того, разница между двумя методами расчета в настоящее время очень мала.