blob: 34df764b4af9cc7f22d9a75cc51aa80ec930e329 [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Negative Binomial Distribution</title>
<link rel="stylesheet" href="../../../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<link rel="home" href="../../../../index.html" title="Math Toolkit">
<link rel="up" href="../dists.html" title="Distributions">
<link rel="prev" href="lognormal_dist.html" title="Log Normal Distribution">
<link rel="next" href="nc_beta_dist.html" title="Noncentral Beta Distribution">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="lognormal_dist.html"><img src="../../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../dists.html"><img src="../../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../../index.html"><img src="../../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="nc_beta_dist.html"><img src="../../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="titlepage"><div><div><h5 class="title">
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist"></a><a class="link" href="negative_binomial_dist.html" title="Negative Binomial Distribution">
Negative Binomial Distribution</a>
</h5></div></div></div>
<p>
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">distributions</span><span class="special">/</span><span class="identifier">negative_binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></pre>
<p>
</p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">RealType</span> <span class="special">=</span> <span class="keyword">double</span><span class="special">,</span>
<span class="keyword">class</span> <a class="link" href="../../../policy.html" title="Policies">Policy</a> <span class="special">=</span> <a class="link" href="../../../policy/pol_ref/pol_ref_ref.html" title="Policy Class Reference">policies::policy&lt;&gt;</a> <span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">negative_binomial_distribution</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">negative_binomial_distribution</span><span class="special">&lt;&gt;</span> <span class="identifier">negative_binomial</span><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">RealType</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../../policy.html" title="Policies">Policy</a><span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">negative_binomial_distribution</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="keyword">typedef</span> <span class="identifier">RealType</span> <span class="identifier">value_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">Policy</span> <span class="identifier">policy_type</span><span class="special">;</span>
<span class="comment">// Constructor from successes and success_fraction:
</span> <span class="identifier">negative_binomial_distribution</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">r</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">p</span><span class="special">);</span>
<span class="comment">// Parameter accessors:
</span> <span class="identifier">RealType</span> <span class="identifier">success_fraction</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">RealType</span> <span class="identifier">successes</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="comment">// Bounds on success fraction:
</span> <span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_lower_bound_on_p</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">trials</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">successes</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">probability</span><span class="special">);</span> <span class="comment">// alpha
</span> <span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_upper_bound_on_p</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">trials</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">successes</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">probability</span><span class="special">);</span> <span class="comment">// alpha
</span>
<span class="comment">// Estimate min/max number of trials:
</span> <span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_minimum_number_of_trials</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">k</span><span class="special">,</span> <span class="comment">// Number of failures.
</span> <span class="identifier">RealType</span> <span class="identifier">p</span><span class="special">,</span> <span class="comment">// Success fraction.
</span> <span class="identifier">RealType</span> <span class="identifier">probability</span><span class="special">);</span> <span class="comment">// Probability threshold alpha.
</span> <span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_maximum_number_of_trials</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">k</span><span class="special">,</span> <span class="comment">// Number of failures.
</span> <span class="identifier">RealType</span> <span class="identifier">p</span><span class="special">,</span> <span class="comment">// Success fraction.
</span> <span class="identifier">RealType</span> <span class="identifier">probability</span><span class="special">);</span> <span class="comment">// Probability threshold alpha.
</span><span class="special">};</span>
<span class="special">}}</span> <span class="comment">// namespaces
</span></pre>
<p>
The class type <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span></code>
represents a <a href="http://en.wikipedia.org/wiki/Negative_binomial_distribution" target="_top">negative_binomial
distribution</a>: it is used when there are exactly two mutually
exclusive outcomes of a <a href="http://en.wikipedia.org/wiki/Bernoulli_trial" target="_top">Bernoulli
trial</a>: these outcomes are labelled "success" and "failure".
</p>
<p>
For k + r Bernoulli trials each with success fraction p, the negative_binomial
distribution gives the probability of observing k failures and r successes
with success on the last trial. The negative_binomial distribution assumes
that success_fraction p is fixed for all (k + r) trials.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The random variable for the negative binomial distribution is the number
of trials, (the number of successes is a fixed property of the distribution)
whereas for the binomial, the random variable is the number of successes,
for a fixed number of trials.
</p></td></tr>
</table></div>
<p>
It has the PDF:
</p>
<p>
<span class="inlinemediaobject"><img src="../../../../../equations/neg_binomial_ref.png"></span>
</p>
<p>
The following graph illustrate how the PDF varies as the success fraction
<span class="emphasis"><em>p</em></span> changes:
</p>
<p>
<span class="inlinemediaobject"><img src="../../../../../graphs/negative_binomial_pdf_1.png" align="middle"></span>
</p>
<p>
Alternatively, this graph shows how the shape of the PDF varies as the
number of successes changes:
</p>
<p>
<span class="inlinemediaobject"><img src="../../../../../graphs/negative_binomial_pdf_2.png" align="middle"></span>
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.related_distributions"></a><h5>
<a name="id1038389"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.related_distributions">Related
Distributions</a>
</h5>
<p>
The name negative binomial distribution is reserved by some to the case
where the successes parameter r is an integer. This integer version is
also called the <a href="http://mathworld.wolfram.com/PascalDistribution.html" target="_top">Pascal
distribution</a>.
</p>
<p>
This implementation uses real numbers for the computation throughout
(because it uses the <span class="bold"><strong>real-valued</strong></span> incomplete
beta function family of functions). This real-valued version is also
called the Polya Distribution.
</p>
<p>
The Poisson distribution is a generalization of the Pascal distribution,
where the success parameter r is an integer: to obtain the Pascal distribution
you must ensure that an integer value is provided for r, and take integer
values (floor or ceiling) from functions that return a number of successes.
</p>
<p>
For large values of r (successes), the negative binomial distribution
converges to the Poisson distribution.
</p>
<p>
The geometric distribution is a special case where the successes parameter
r = 1, so only a first and only success is required. geometric(p) = negative_binomial(1,
p).
</p>
<p>
The Poisson distribution is a special case for large successes
</p>
<p>
poisson(&#955;) = lim <sub>r &#8594; &#8734;</sub> &#8203; negative_binomial(r, r / (&#955; + r)))
</p>
<p>
</p>
<div class="caution"><table border="0" summary="Caution">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../../../doc/src/images/caution.png"></td>
<th align="left">Caution</th>
</tr>
<tr><td align="left" valign="top">
<p>
The Negative Binomial distribution is a discrete distribution: internally
functions like the <code class="computeroutput"><span class="identifier">cdf</span></code>
and <code class="computeroutput"><span class="identifier">pdf</span></code> are treated
"as if" they are continuous functions, but in reality the
results returned from these functions only have meaning if an integer
value is provided for the random variate argument.
</p>
<p>
The quantile function will by default return an integer result that
has been <span class="emphasis"><em>rounded outwards</em></span>. That is to say lower
quantiles (where the probability is less than 0.5) are rounded downward,
and upper quantiles (where the probability is greater than 0.5) are
rounded upwards. This behaviour ensures that if an X% quantile is
requested, then <span class="emphasis"><em>at least</em></span> the requested coverage
will be present in the central region, and <span class="emphasis"><em>no more than</em></span>
the requested coverage will be present in the tails.
</p>
<p>
This behaviour can be changed so that the quantile functions are
rounded differently, or even return a real-valued result using <a class="link" href="../../../policy/pol_overview.html" title="Policy Overview">Policies</a>. It is
strongly recommended that you read the tutorial <a class="link" href="../../../policy/pol_tutorial/understand_dis_quant.html" title="Understanding Quantiles of Discrete Distributions">Understanding
Quantiles of Discrete Distributions</a> before using the quantile
function on the Negative Binomial distribution. The <a class="link" href="../../../policy/pol_ref/discrete_quant_ref.html" title="Discrete Quantile Policies">reference
docs</a> describe how to change the rounding policy for these
distributions.
</p>
</td></tr>
</table></div>
<p>
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.member_functions"></a><h5>
<a name="id1038500"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.member_functions">Member
Functions</a>
</h5>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.construct"></a><h6>
<a name="id1038513"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.construct">Construct</a>
</h6>
<pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">r</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">p</span><span class="special">);</span>
</pre>
<p>
Constructor: <span class="emphasis"><em>r</em></span> is the total number of successes,
<span class="emphasis"><em>p</em></span> is the probability of success of a single trial.
</p>
<p>
Requires: <code class="computeroutput"><span class="identifier">r</span> <span class="special">&gt;</span>
<span class="number">0</span></code> and <code class="computeroutput"><span class="number">0</span>
<span class="special">&lt;=</span> <span class="identifier">p</span>
<span class="special">&lt;=</span> <span class="number">1</span></code>.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.accessors"></a><h6>
<a name="id1038622"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.accessors">Accessors</a>
</h6>
<pre class="programlisting"><span class="identifier">RealType</span> <span class="identifier">success_fraction</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// successes / trials (0 &lt;= p &lt;= 1)
</span></pre>
<p>
Returns the parameter <span class="emphasis"><em>p</em></span> from which this distribution
was constructed.
</p>
<pre class="programlisting"><span class="identifier">RealType</span> <span class="identifier">successes</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// required successes (r &gt; 0)
</span></pre>
<p>
Returns the parameter <span class="emphasis"><em>r</em></span> from which this distribution
was constructed.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.lower_bound_on_parameter_p"></a><h6>
<a name="id1038707"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.lower_bound_on_parameter_p">Lower
Bound on Parameter p</a>
</h6>
<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_lower_bound_on_p</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">failures</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">successes</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">probability</span><span class="special">)</span> <span class="comment">// (0 &lt;= alpha &lt;= 1), 0.05 equivalent to 95% confidence.
</span></pre>
<p>
Returns a <span class="bold"><strong>lower bound</strong></span> on the success
fraction:
</p>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">failures</span></dt>
<dd><p>
The total number of failures before the r th success.
</p></dd>
<dt><span class="term">successes</span></dt>
<dd><p>
The number of successes required.
</p></dd>
<dt><span class="term">alpha</span></dt>
<dd><p>
The largest acceptable probability that the true value of the success
fraction is <span class="bold"><strong>less than</strong></span> the value
returned.
</p></dd>
</dl>
</div>
<p>
For example, if you observe <span class="emphasis"><em>k</em></span> failures and <span class="emphasis"><em>r</em></span>
successes from <span class="emphasis"><em>n</em></span> = k + r trials the best estimate
for the success fraction is simply <span class="emphasis"><em>r/n</em></span>, but if you
want to be 95% sure that the true value is <span class="bold"><strong>greater
than</strong></span> some value, <span class="emphasis"><em>p<sub>min</sub></em></span>, then:
</p>
<pre class="programlisting"><span class="identifier">p</span><sub>min</sub> <span class="special">=</span> <span class="identifier">negative_binomial_distribution</span><span class="special">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span>
<span class="identifier">failures</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="number">0.05</span><span class="special">);</span>
</pre>
<p>
<a class="link" href="../../stat_tut/weg/neg_binom_eg/neg_binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial Distribution">See
negative binomial confidence interval example.</a>
</p>
<p>
This function uses the Clopper-Pearson method of computing the lower
bound on the success fraction, whilst many texts refer to this method
as giving an "exact" result in practice it produces an interval
that guarantees <span class="emphasis"><em>at least</em></span> the coverage required,
and may produce pessimistic estimates for some combinations of <span class="emphasis"><em>failures</em></span>
and <span class="emphasis"><em>successes</em></span>. See:
</p>
<p>
<a href="http://www.ucs.louisiana.edu/~kxk4695/Discrete_new.pdf" target="_top">Yong
Cai and K. Krishnamoorthy, A Simple Improved Inferential Method for Some
Discrete Distributions. Computational statistics and data analysis, 2005,
vol. 48, no3, 605-621</a>.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.upper_bound_on_parameter_p"></a><h6>
<a name="id1038975"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.upper_bound_on_parameter_p">Upper
Bound on Parameter p</a>
</h6>
<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_upper_bound_on_p</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">trials</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">successes</span><span class="special">,</span>
<span class="identifier">RealType</span> <span class="identifier">alpha</span><span class="special">);</span> <span class="comment">// (0 &lt;= alpha &lt;= 1), 0.05 equivalent to 95% confidence.
</span></pre>
<p>
Returns an <span class="bold"><strong>upper bound</strong></span> on the success
fraction:
</p>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">trials</span></dt>
<dd><p>
The total number of trials conducted.
</p></dd>
<dt><span class="term">successes</span></dt>
<dd><p>
The number of successes that occurred.
</p></dd>
<dt><span class="term">alpha</span></dt>
<dd><p>
The largest acceptable probability that the true value of the success
fraction is <span class="bold"><strong>greater than</strong></span> the value
returned.
</p></dd>
</dl>
</div>
<p>
For example, if you observe <span class="emphasis"><em>k</em></span> successes from <span class="emphasis"><em>n</em></span>
trials the best estimate for the success fraction is simply <span class="emphasis"><em>k/n</em></span>,
but if you want to be 95% sure that the true value is <span class="bold"><strong>less
than</strong></span> some value, <span class="emphasis"><em>p<sub>max</sub></em></span>, then:
</p>
<pre class="programlisting"><span class="identifier">p</span><sub>max</sub> <span class="special">=</span> <span class="identifier">negative_binomial_distribution</span><span class="special">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span>
<span class="identifier">r</span><span class="special">,</span> <span class="identifier">k</span><span class="special">,</span> <span class="number">0.05</span><span class="special">);</span>
</pre>
<p>
<a class="link" href="../../stat_tut/weg/neg_binom_eg/neg_binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial Distribution">See
negative binomial confidence interval example.</a>
</p>
<p>
This function uses the Clopper-Pearson method of computing the lower
bound on the success fraction, whilst many texts refer to this method
as giving an "exact" result in practice it produces an interval
that guarantees <span class="emphasis"><em>at least</em></span> the coverage required,
and may produce pessimistic estimates for some combinations of <span class="emphasis"><em>failures</em></span>
and <span class="emphasis"><em>successes</em></span>. See:
</p>
<p>
<a href="http://www.ucs.louisiana.edu/~kxk4695/Discrete_new.pdf" target="_top">Yong
Cai and K. Krishnamoorthy, A Simple Improved Inferential Method for Some
Discrete Distributions. Computational statistics and data analysis, 2005,
vol. 48, no3, 605-621</a>.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.estimating_number_of_trials_to_ensure_at_least_a_certain_number_of_failures"></a><h6>
<a name="id1039239"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.estimating_number_of_trials_to_ensure_at_least_a_certain_number_of_failures">Estimating
Number of Trials to Ensure at Least a Certain Number of Failures</a>
</h6>
<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_minimum_number_of_trials</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">k</span><span class="special">,</span> <span class="comment">// number of failures.
</span> <span class="identifier">RealType</span> <span class="identifier">p</span><span class="special">,</span> <span class="comment">// success fraction.
</span> <span class="identifier">RealType</span> <span class="identifier">alpha</span><span class="special">);</span> <span class="comment">// probability threshold (0.05 equivalent to 95%).
</span></pre>
<p>
This functions estimates the number of trials required to achieve a certain
probability that <span class="bold"><strong>more than k failures will be observed</strong></span>.
</p>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">k</span></dt>
<dd><p>
The target number of failures to be observed.
</p></dd>
<dt><span class="term">p</span></dt>
<dd><p>
The probability of <span class="emphasis"><em>success</em></span> for each trial.
</p></dd>
<dt><span class="term">alpha</span></dt>
<dd><p>
The maximum acceptable risk that only k failures or fewer will
be observed.
</p></dd>
</dl>
</div>
<p>
For example:
</p>
<pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;::</span><span class="identifier">find_minimum_number_of_trials</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.05</span><span class="special">);</span>
</pre>
<p>
Returns the smallest number of trials we must conduct to be 95% sure
of seeing 10 failures that occur with frequency one half.
</p>
<p>
<a class="link" href="../../stat_tut/weg/neg_binom_eg/neg_binom_size_eg.html" title="Estimating Sample Sizes for the Negative Binomial.">Worked
Example.</a>
</p>
<p>
This function uses numeric inversion of the negative binomial distribution
to obtain the result: another interpretation of the result, is that it
finds the number of trials (success+failures) that will lead to an <span class="emphasis"><em>alpha</em></span>
probability of observing k failures or fewer.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.estimating_number_of_trials_to_ensure_a_maximum_number_of_failures_or_less"></a><h6>
<a name="id1039463"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.estimating_number_of_trials_to_ensure_a_maximum_number_of_failures_or_less">Estimating
Number of Trials to Ensure a Maximum Number of Failures or Less</a>
</h6>
<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">RealType</span> <span class="identifier">find_maximum_number_of_trials</span><span class="special">(</span>
<span class="identifier">RealType</span> <span class="identifier">k</span><span class="special">,</span> <span class="comment">// number of failures.
</span> <span class="identifier">RealType</span> <span class="identifier">p</span><span class="special">,</span> <span class="comment">// success fraction.
</span> <span class="identifier">RealType</span> <span class="identifier">alpha</span><span class="special">);</span> <span class="comment">// probability threshold (0.05 equivalent to 95%).
</span></pre>
<p>
This functions estimates the maximum number of trials we can conduct
and achieve a certain probability that <span class="bold"><strong>k failures
or fewer will be observed</strong></span>.
</p>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">k</span></dt>
<dd><p>
The maximum number of failures to be observed.
</p></dd>
<dt><span class="term">p</span></dt>
<dd><p>
The probability of <span class="emphasis"><em>success</em></span> for each trial.
</p></dd>
<dt><span class="term">alpha</span></dt>
<dd><p>
The maximum acceptable <span class="emphasis"><em>risk</em></span> that more than
k failures will be observed.
</p></dd>
</dl>
</div>
<p>
For example:
</p>
<pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;::</span><span class="identifier">find_maximum_number_of_trials</span><span class="special">(</span><span class="number">0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">-</span><span class="number">1.0</span><span class="special">/</span><span class="number">1000000</span><span class="special">,</span> <span class="number">0.05</span><span class="special">);</span>
</pre>
<p>
Returns the largest number of trials we can conduct and still be 95%
sure of seeing no failures that occur with frequency one in one million.
</p>
<p>
This function uses numeric inversion of the negative binomial distribution
to obtain the result: another interpretation of the result, is that it
finds the number of trials (success+failures) that will lead to an <span class="emphasis"><em>alpha</em></span>
probability of observing more than k failures.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.non_member_accessors"></a><h5>
<a name="id1039695"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.non_member_accessors">Non-member
Accessors</a>
</h5>
<p>
All the <a class="link" href="../nmp.html" title="Non-Member Properties">usual non-member
accessor functions</a> that are generic to all distributions are supported:
<a class="link" href="../nmp.html#math.dist.cdf">Cumulative Distribution Function</a>,
<a class="link" href="../nmp.html#math.dist.pdf">Probability Density Function</a>, <a class="link" href="../nmp.html#math.dist.quantile">Quantile</a>, <a class="link" href="../nmp.html#math.dist.hazard">Hazard
Function</a>, <a class="link" href="../nmp.html#math.dist.chf">Cumulative Hazard Function</a>,
<a class="link" href="../nmp.html#math.dist.mean">mean</a>, <a class="link" href="../nmp.html#math.dist.median">median</a>,
<a class="link" href="../nmp.html#math.dist.mode">mode</a>, <a class="link" href="../nmp.html#math.dist.variance">variance</a>,
<a class="link" href="../nmp.html#math.dist.sd">standard deviation</a>, <a class="link" href="../nmp.html#math.dist.skewness">skewness</a>,
<a class="link" href="../nmp.html#math.dist.kurtosis">kurtosis</a>, <a class="link" href="../nmp.html#math.dist.kurtosis_excess">kurtosis_excess</a>,
<a class="link" href="../nmp.html#math.dist.range">range</a> and <a class="link" href="../nmp.html#math.dist.support">support</a>.
</p>
<p>
However it's worth taking a moment to define what these actually mean
in the context of this distribution:
</p>
<div class="table">
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.meaning_of_the_non_member_accessors_"></a><p class="title"><b>Table&#160;12.&#160;Meaning of the non-member accessors.</b></p>
<div class="table-contents"><table class="table" summary="Meaning of the non-member accessors.">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Function
</p>
</th>
<th>
<p>
Meaning
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<a class="link" href="../nmp.html#math.dist.pdf">Probability Density Function</a>
</p>
</td>
<td>
<p>
The probability of obtaining <span class="bold"><strong>exactly
k failures</strong></span> from k+r trials with success fraction
p. For example:
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">pdf</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">p</span><span class="special">),</span> <span class="identifier">k</span><span class="special">)</span></pre>
<p>
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="../nmp.html#math.dist.cdf">Cumulative Distribution Function</a>
</p>
</td>
<td>
<p>
The probability of obtaining <span class="bold"><strong>k failures
or fewer</strong></span> from k+r trials with success fraction p
and success on the last trial. For example:
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">p</span><span class="special">),</span> <span class="identifier">k</span><span class="special">)</span></pre>
<p>
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="../nmp.html#math.dist.ccdf">Complement of the Cumulative
Distribution Function</a>
</p>
</td>
<td>
<p>
The probability of obtaining <span class="bold"><strong>more than
k failures</strong></span> from k+r trials with success fraction
p and success on the last trial. For example:
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">p</span><span class="special">),</span> <span class="identifier">k</span><span class="special">))</span></pre>
<p>
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="../nmp.html#math.dist.quantile">Quantile</a>
</p>
</td>
<td>
<p>
The <span class="bold"><strong>greatest</strong></span> number of failures
k expected to be observed from k+r trials with success fraction
p, at probability P. Note that the value returned is a real-number,
and not an integer. Depending on the use case you may want
to take either the floor or ceiling of the real result. For
example:
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">p</span><span class="special">),</span> <span class="identifier">P</span><span class="special">)</span></pre>
<p>
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="../nmp.html#math.dist.quantile_c">Quantile from the complement
of the probability</a>
</p>
</td>
<td>
<p>
The <span class="bold"><strong>smallest</strong></span> number of failures
k expected to be observed from k+r trials with success fraction
p, at probability P. Note that the value returned is a real-number,
and not an integer. Depending on the use case you may want
to take either the floor or ceiling of the real result. For
example:
</p>
<pre class="programlisting"><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">p</span><span class="special">),</span> <span class="identifier">P</span><span class="special">))</span></pre>
<p>
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.accuracy"></a><h5>
<a name="id1041456"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.accuracy">Accuracy</a>
</h5>
<p>
This distribution is implemented using the incomplete beta functions
<a class="link" href="../../../special/sf_beta/ibeta_function.html" title="Incomplete Beta Functions">ibeta</a>
and <a class="link" href="../../../special/sf_beta/ibeta_function.html" title="Incomplete Beta Functions">ibetac</a>:
please refer to these functions for information on accuracy.
</p>
<a name="math_toolkit.dist.dist_ref.dists.negative_binomial_dist.implementation"></a><h5>
<a name="id1041482"></a>
<a class="link" href="negative_binomial_dist.html#math_toolkit.dist.dist_ref.dists.negative_binomial_dist.implementation">Implementation</a>
</h5>
<p>
In the following table, <span class="emphasis"><em>p</em></span> is the probability that
any one trial will be successful (the success fraction), <span class="emphasis"><em>r</em></span>
is the number of successes, <span class="emphasis"><em>k</em></span> is the number of failures,
<span class="emphasis"><em>p</em></span> is the probability and <span class="emphasis"><em>q = 1-p</em></span>.
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Function
</p>
</th>
<th>
<p>
Implementation Notes
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
pdf
</p>
</td>
<td>
<p>
pdf = exp(lgamma(r + k) - lgamma(r) - lgamma(k+1)) * pow(p,
r) * pow((1-p), k)
</p>
<p>
Implementation is in terms of <a class="link" href="../../../special/sf_beta/beta_derivative.html" title="Derivative of the Incomplete Beta Function">ibeta_derivative</a>:
</p>
<p>
(p/(r + k)) * ibeta_derivative(r, static_cast&lt;RealType&gt;(k+1),
p) The function <a class="link" href="../../../special/sf_beta/beta_derivative.html" title="Derivative of the Incomplete Beta Function">ibeta_derivative</a>
is used here, since it has already been optimised for the lowest
possible error - indeed this is really just a thin wrapper
around part of the internals of the incomplete beta function.
</p>
</td>
</tr>
<tr>
<td>
<p>
cdf
</p>
</td>
<td>
<p>
Using the relation:
</p>
<p>
cdf = I<sub>p</sub>(r, k+1) = ibeta(r, k+1, p)
</p>
<p>
= ibeta(r, static_cast&lt;RealType&gt;(k+1), p)
</p>
</td>
</tr>
<tr>
<td>
<p>
cdf complement
</p>
</td>
<td>
<p>
Using the relation:
</p>
<p>
1 - cdf = I<sub>p</sub>(k+1, r)
</p>
<p>
= ibetac(r, static_cast&lt;RealType&gt;(k+1), p)
</p>
</td>
</tr>
<tr>
<td>
<p>
quantile
</p>
</td>
<td>
<p>
ibeta_invb(r, p, P) - 1
</p>
</td>
</tr>
<tr>
<td>
<p>
quantile from the complement
</p>
</td>
<td>
<p>
ibetac_invb(r, p, Q) -1)
</p>
</td>
</tr>
<tr>
<td>
<p>
mean
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">r</span><span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">p</span><span class="special">)/</span><span class="identifier">p</span></code>
</p>
</td>
</tr>
<tr>
<td>
<p>
variance
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">r</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">p</span><span class="special">)</span>
<span class="special">/</span> <span class="identifier">p</span>
<span class="special">*</span> <span class="identifier">p</span></code>
</p>
</td>
</tr>
<tr>
<td>
<p>
mode
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">floor</span><span class="special">((</span><span class="identifier">r</span><span class="special">-</span><span class="number">1</span><span class="special">)</span>
<span class="special">*</span> <span class="special">(</span><span class="number">1</span> <span class="special">-</span>
<span class="identifier">p</span><span class="special">)/</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
</tr>
<tr>
<td>
<p>
skewness
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="special">(</span><span class="number">2</span>
<span class="special">-</span> <span class="identifier">p</span><span class="special">)</span> <span class="special">/</span>
<span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">r</span> <span class="special">*</span>
<span class="special">(</span><span class="number">1</span>
<span class="special">-</span> <span class="identifier">p</span><span class="special">))</span></code>
</p>
</td>
</tr>
<tr>
<td>
<p>
kurtosis
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="number">6</span> <span class="special">/</span>
<span class="identifier">r</span> <span class="special">+</span>
<span class="special">(</span><span class="identifier">p</span>
<span class="special">*</span> <span class="identifier">p</span><span class="special">)</span> <span class="special">/</span>
<span class="identifier">r</span> <span class="special">*</span>
<span class="special">(</span><span class="number">1</span>
<span class="special">-</span> <span class="identifier">p</span>
<span class="special">)</span></code>
</p>
</td>
</tr>
<tr>
<td>
<p>
kurtosis excess
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="number">6</span> <span class="special">/</span>
<span class="identifier">r</span> <span class="special">+</span>
<span class="special">(</span><span class="identifier">p</span>
<span class="special">*</span> <span class="identifier">p</span><span class="special">)</span> <span class="special">/</span>
<span class="identifier">r</span> <span class="special">*</span>
<span class="special">(</span><span class="number">1</span>
<span class="special">-</span> <span class="identifier">p</span>
<span class="special">)</span> <span class="special">-</span><span class="number">3</span></code>
</p>
</td>
</tr>
<tr>
<td>
<p>
parameter estimation member functions
</p>
</td>
<td>
<p>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">find_lower_bound_on_p</span></code>
</p>
</td>
<td>
<p>
ibeta_inv(successes, failures + 1, alpha)
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">find_upper_bound_on_p</span></code>
</p>
</td>
<td>
<p>
ibetac_inv(successes, failures, alpha) plus see comments in
code.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">find_minimum_number_of_trials</span></code>
</p>
</td>
<td>
<p>
ibeta_inva(k + 1, p, alpha)
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">find_maximum_number_of_trials</span></code>
</p>
</td>
<td>
<p>
ibetac_inva(k + 1, p, alpha)
</p>
</td>
</tr>
</tbody>
</table></div>
<p>
Implementation notes:
</p>
<div class="itemizedlist"><ul type="disc">
<li>
The real concept type (that deliberately lacks the Lanczos approximation),
was found to take several minutes to evaluate some extreme test values,
so the test has been disabled for this type.
</li>
<li>
Much greater speed, and perhaps greater accuracy, might be achieved
for extreme values by using a normal approximation. This is NOT been
tested or implemented.
</li>
</ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2006 , 2007, 2008, 2009, 2010 John Maddock, Paul A. Bristow,
Hubert Holin, Xiaogang Zhang, Bruno Lalande, Johan R&#229;de, Gautam Sewani and
Thijs van den Berg<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="lognormal_dist.html"><img src="../../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../dists.html"><img src="../../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../../index.html"><img src="../../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="nc_beta_dist.html"><img src="../../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>