Если статистическое распределение являетсядискретным, то случайная величина может иметь только целые значения — это оставляет нам проблему при вычислении квантилей — мы можем либо игнорировать дискретность распределения и возвращать реальное значение, либо округляться до целого числа. Как это происходит, вычисление целых значений может быть значительно быстрее, чем вычисление реального значения, поэтому есть определенные преимущества для возврата целого числа, но затем нам нужно решить, как лучше округлять результат. Политика<discrete_quantile
>определяет, как работают дискретные квантили и как округляются целые результаты:
enum discrete_quantile_policy_type
{
real,
integer_round_outwards,
integer_round_inwards,
integer_round_down,
integer_round_up,
integer_round_nearest
};
template <discrete_quantile_policy_type>
struct discrete_quantile;
Значения<discrete_quantile
>могут иметь следующие значения:
Игнорирует дискретность распределения и возвращает реальный результат. Например:
#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using namespace boost::math::policies;
typedef negative_binomial_distribution<
double,
policy<discrete_quantile<real> >
> dist_type;
double x = quantile(dist_type(20, 0.3), 0.05);
double y = quantile(complement(dist_type(20, 0.3), 0.05));
Результаты в<x=
27.3898
>и<y
=68.1584
>.
Это политика по умолчанию: целочисленное значение возвращается так, что:
- Нижние квантили (где вероятность меньше 0,5) округлены вниз.
- Верхние квантили (где вероятность больше 0,5) округляются.
Это, как правило, самая безопасная политика округления, поскольку она гарантирует, что как один, так и два боковых интервала гарантированно будут иметьпо крайней мерезапрашиваемое покрытие. Например:
#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial;
double x = quantile(negative_binomial(20, 0.3), 0.05);
double y = quantile(complement(negative_binomial(20, 0.3), 0.05));
Результаты в<x=
27
>(округлено от 27.3898) и<y=
69
>(округлено от 68.1584).
Переменные x и y теперь определены так, что:
cdf(negative_binomial(20), x) <= 0.05
cdf(negative_binomial(20), y) >= 0.95
Другими словами, мы гарантируемпо меньшей мере 90% покрытия в центральном регионе в целом, а такжене более 5% покрытия в каждом хвосте.
Это противоположноinteger_round_outwards: Целое значение возвращается так, что:
- Нижние квантили (где вероятность меньше 0,5) округленывверх.
- Верхние квантили (где вероятность больше 0,5) округленывниз.
Например:
#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using namespace boost::math::policies;
typedef negative_binomial_distribution<
double,
policy<discrete_quantile<integer_round_inwards> >
> dist_type;
double x = quantile(dist_type(20, 0.3), 0.05);
double y = quantile(complement(dist_type(20, 0.3), 0.05));
Результаты в<x=
28
>(округлено от 27.3898) и<y=68
>(округлено от 68.1584).
Переменные x и y теперь определены так, что:
cdf(negative_binomial(20), x) >= 0.05
cdf(negative_binomial(20), y) <= 0.95
Другими словами, мы гарантируемне более 90% покрытия в центральном регионе в целом, а такжепо крайней мере 5% покрытия в каждом хвосте.
Всегда округляется до целого числа, независимо от того, верхний или нижний квантиль.
Всегда округляется до целого числа, независимо от того, верхний или нижний квантиль.
Всегда округляется до ближайшего целого числа, независимо от того, верхний или нижний квантиль. Это обеспечит запрашиваемое покрытиев среднем случае, но для любого конкретного примера может привести к значительно большему или меньшему охвату, чем запрашиваемая сумма. Например:
Например:
#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using namespace boost::math::policies;
typedef negative_binomial_distribution<
double,
policy<discrete_quantile<integer_round_nearest> >
> dist_type;
double x = quantile(dist_type(20, 0.3), 0.05);
double y = quantile(complement(dist_type(20, 0.3), 0.05));
Результаты в<x=
27
>(округлено от 27.3898) и<y=68
>(округлено от 68.1584).