]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | <html> |
2 | <head> | |
3 | <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> | |
4 | <title>Geometric Distribution Examples</title> | |
5 | <link rel="stylesheet" href="../../../math.css" type="text/css"> | |
6 | <meta name="generator" content="DocBook XSL Stylesheets V1.77.1"> | |
7 | <link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1"> | |
8 | <link rel="up" href="../weg.html" title="Worked Examples"> | |
9 | <link rel="prev" href="binom_eg/binom_size_eg.html" title="Estimating Sample Sizes for a Binomial Distribution."> | |
10 | <link rel="next" href="neg_binom_eg.html" title="Negative Binomial Distribution Examples"> | |
11 | </head> | |
12 | <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> | |
13 | <table cellpadding="2" width="100%"><tr> | |
14 | <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> | |
15 | <td align="center"><a href="../../../../../../../index.html">Home</a></td> | |
16 | <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> | |
17 | <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> | |
18 | <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> | |
19 | <td align="center"><a href="../../../../../../../more/index.htm">More</a></td> | |
20 | </tr></table> | |
21 | <hr> | |
22 | <div class="spirit-nav"> | |
23 | <a accesskey="p" href="binom_eg/binom_size_eg.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../weg.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="neg_binom_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> | |
24 | </div> | |
25 | <div class="section"> | |
26 | <div class="titlepage"><div><div><h4 class="title"> | |
27 | <a name="math_toolkit.stat_tut.weg.geometric_eg"></a><a class="link" href="geometric_eg.html" title="Geometric Distribution Examples">Geometric Distribution | |
28 | Examples</a> | |
29 | </h4></div></div></div> | |
30 | <p> | |
31 | For this example, we will opt to #define two macros to control the error | |
32 | and discrete handling policies. For this simple example, we want to avoid | |
33 | throwing an exception (the default policy) and just return infinity. We | |
34 | want to treat the distribution as if it was continuous, so we choose a | |
35 | discrete_quantile policy of real, rather than the default policy integer_round_outwards. | |
36 | </p> | |
37 | <pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_OVERFLOW_ERROR_POLICY</span> <span class="identifier">ignore_error</span> | |
38 | <span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DISCRETE_QUANTILE_POLICY</span> <span class="identifier">real</span> | |
39 | </pre> | |
40 | <div class="caution"><table border="0" summary="Caution"> | |
41 | <tr> | |
42 | <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td> | |
43 | <th align="left">Caution</th> | |
44 | </tr> | |
45 | <tr><td align="left" valign="top"><p> | |
46 | It is vital to #include distributions etc <span class="bold"><strong>after</strong></span> | |
47 | the above #defines | |
48 | </p></td></tr> | |
49 | </table></div> | |
50 | <p> | |
51 | After that we need some includes to provide easy access to the negative | |
52 | binomial distribution, and we need some std library iostream, of course. | |
53 | </p> | |
54 | <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">geometric</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> | |
55 | <span class="comment">// for geometric_distribution</span> | |
56 | <span class="keyword">using</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">geometric_distribution</span><span class="special">;</span> <span class="comment">//</span> | |
57 | <span class="keyword">using</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">geometric</span><span class="special">;</span> <span class="comment">// typedef provides default type is double.</span> | |
58 | <span class="keyword">using</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">pdf</span><span class="special">;</span> <span class="comment">// Probability mass function.</span> | |
59 | <span class="keyword">using</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">cdf</span><span class="special">;</span> <span class="comment">// Cumulative density function.</span> | |
60 | <span class="keyword">using</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">quantile</span><span class="special">;</span> | |
61 | ||
62 | <span class="preprocessor">#include</span> <span class="special"><</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">></span> | |
63 | <span class="comment">// for negative_binomial_distribution</span> | |
64 | <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">negative_binomial</span><span class="special">;</span> <span class="comment">// typedef provides default type is double.</span> | |
65 | ||
66 | <span class="preprocessor">#include</span> <span class="special"><</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">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> | |
67 | <span class="comment">// for negative_binomial_distribution</span> | |
68 | <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">normal</span><span class="special">;</span> <span class="comment">// typedef provides default type is double.</span> | |
69 | ||
70 | <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> | |
71 | <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> | |
72 | <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">noshowpoint</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">fixed</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">right</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">left</span><span class="special">;</span> | |
73 | <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span> | |
74 | <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setprecision</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">;</span> | |
75 | ||
76 | <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span> | |
77 | <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span> | |
78 | </pre> | |
79 | <p> | |
80 | It is always sensible to use try and catch blocks because defaults policies | |
81 | are to throw an exception if anything goes wrong. | |
82 | </p> | |
83 | <p> | |
84 | Simple try'n'catch blocks (see below) will ensure that you get a helpful | |
85 | error message instead of an abrupt (and silent) program abort. | |
86 | </p> | |
87 | <h5> | |
88 | <a name="math_toolkit.stat_tut.weg.geometric_eg.h0"></a> | |
89 | <span class="phrase"><a name="math_toolkit.stat_tut.weg.geometric_eg.throwing_a_dice"></a></span><a class="link" href="geometric_eg.html#math_toolkit.stat_tut.weg.geometric_eg.throwing_a_dice">Throwing | |
90 | a dice</a> | |
91 | </h5> | |
92 | <p> | |
93 | The Geometric distribution describes the probability (<span class="emphasis"><em>p</em></span>) | |
94 | of a number of failures to get the first success in <span class="emphasis"><em>k</em></span> | |
95 | Bernoulli trials. (A <a href="http://en.wikipedia.org/wiki/Bernoulli_distribution" target="_top">Bernoulli | |
96 | trial</a> is one with only two possible outcomes, success of failure, | |
97 | and <span class="emphasis"><em>p</em></span> is the probability of success). | |
98 | </p> | |
99 | <p> | |
100 | Suppose an 'fair' 6-face dice is thrown repeatedly: | |
101 | </p> | |
102 | <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">success_fraction</span> <span class="special">=</span> <span class="number">1.</span><span class="special">/</span><span class="number">6</span><span class="special">;</span> <span class="comment">// success_fraction (p) = 0.1666</span> | |
103 | <span class="comment">// (so failure_fraction is 1 - success_fraction = 5./6 = 1- 0.1666 = 0.8333)</span> | |
104 | </pre> | |
105 | <p> | |
106 | If the dice is thrown repeatedly until the <span class="bold"><strong>first</strong></span> | |
107 | time a <span class="emphasis"><em>three</em></span> appears. The probablility distribution | |
108 | of the number of times it is thrown <span class="bold"><strong>not</strong></span> | |
109 | getting a <span class="emphasis"><em>three</em></span> (<span class="emphasis"><em>not-a-threes</em></span> | |
110 | number of failures to get a <span class="emphasis"><em>three</em></span>) is a geometric | |
111 | distribution with the success_fraction = 1/6 = 0.1666 ̇. | |
112 | </p> | |
113 | <p> | |
114 | We therefore start by constructing a geometric distribution with the one | |
115 | parameter success_fraction, the probability of success. | |
116 | </p> | |
117 | <pre class="programlisting"><span class="identifier">geometric</span> <span class="identifier">g6</span><span class="special">(</span><span class="identifier">success_fraction</span><span class="special">);</span> <span class="comment">// type double by default.</span> | |
118 | </pre> | |
119 | <p> | |
120 | To confirm, we can echo the success_fraction parameter of the distribution. | |
121 | </p> | |
122 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"success fraction of a six-sided dice is "</span> <span class="special"><<</span> <span class="identifier">g6</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> | |
123 | </pre> | |
124 | <p> | |
125 | So the probability of getting a three at the first throw (zero failures) | |
126 | is | |
127 | </p> | |
128 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.1667</span> | |
129 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.1667</span> | |
130 | </pre> | |
131 | <p> | |
132 | Note that the cdf and pdf are identical because the is only one throw. | |
133 | If we want the probability of getting the first <span class="emphasis"><em>three</em></span> | |
134 | on the 2nd throw: | |
135 | </p> | |
136 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.1389</span> | |
137 | </pre> | |
138 | <p> | |
139 | If we want the probability of getting the first <span class="emphasis"><em>three</em></span> | |
140 | on the 1st or 2nd throw (allowing one failure): | |
141 | </p> | |
142 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"pdf(g6, 0) + pdf(g6, 1) = "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">0</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> | |
143 | </pre> | |
144 | <p> | |
145 | Or more conveniently, and more generally, we can use the Cumulative Distribution | |
146 | Function CDF. | |
147 | </p> | |
148 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"cdf(g6, 1) = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.3056</span> | |
149 | </pre> | |
150 | <p> | |
151 | If we allow many more (12) throws, the probability of getting our <span class="emphasis"><em>three</em></span> | |
152 | gets very high: | |
153 | </p> | |
154 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"cdf(g6, 12) = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">12</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.9065 or 90% probability.</span> | |
155 | </pre> | |
156 | <p> | |
157 | If we want to be much more confident, say 99%, we can estimate the number | |
158 | of throws to be this sure using the inverse or quantile. | |
159 | </p> | |
160 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"quantile(g6, 0.99) = "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">0.99</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 24.26</span> | |
161 | </pre> | |
162 | <p> | |
163 | Note that the value returned is not an integer: if you want an integer | |
164 | result you should use either floor, round or ceil functions, or use the | |
165 | policies mechanism. | |
166 | </p> | |
167 | <p> | |
168 | See <a class="link" href="../../pol_tutorial/understand_dis_quant.html" title="Understanding Quantiles of Discrete Distributions">understanding | |
169 | discrete quantiles</a>. | |
170 | </p> | |
171 | <p> | |
172 | The geometric distribution is related to the negative binomial    <code class="computeroutput"><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> | |
173 | <span class="identifier">p</span><span class="special">);</span></code> | |
174 | with parameter <span class="emphasis"><em>r</em></span> = 1. So we could get the same result | |
175 | using the negative binomial, but using the geometric the results will be | |
176 | faster, and may be more accurate. | |
177 | </p> | |
178 | <pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">nb</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">success_fraction</span><span class="special">);</span> | |
179 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.1389</span> | |
180 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.3056</span> | |
181 | </pre> | |
182 | <p> | |
183 | We could also the complement to express the required probability as 1 - | |
184 | 0.99 = 0.01 (and get the same result): | |
185 | </p> | |
186 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"quantile(complement(g6, 1 - p)) "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">g6</span><span class="special">,</span> <span class="number">0.01</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 24.26</span> | |
187 | </pre> | |
188 | <p> | |
189 | Note too that Boost.Math geometric distribution is implemented as a continuous | |
190 | function. Unlike other implementations (for example R) it <span class="bold"><strong>uses</strong></span> | |
191 | the number of failures as a <span class="bold"><strong>real</strong></span> parameter, | |
192 | not as an integer. If you want this integer behaviour, you may need to | |
193 | enforce this by rounding the parameter you pass, probably rounding down, | |
194 | to the nearest integer. For example, R returns the success fraction probability | |
195 | for all values of failures from 0 to 0.999999 thus: | |
196 | </p> | |
197 | <pre class="programlisting">   R> formatC(pgeom(0.0001,0.5, FALSE), digits=17) " 0.5" | |
198 | </pre> | |
199 | <p> | |
200 | So in Boost.Math the equivalent is | |
201 | </p> | |
202 | <pre class="programlisting"> <span class="identifier">geometric</span> <span class="identifier">g05</span><span class="special">(</span><span class="number">0.5</span><span class="special">);</span> <span class="comment">// Probability of success = 0.5 or 50%</span> | |
203 | <span class="comment">// Output all potentially significant digits for the type, here double.</span> | |
204 | ||
205 | <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_NO_CXX11_NUMERIC_LIMITS</span> | |
206 | <span class="keyword">int</span> <span class="identifier">max_digits10</span> <span class="special">=</span> <span class="number">2</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">digits</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special"><></span> <span class="special">>()</span> <span class="special">*</span> <span class="number">30103UL</span><span class="special">)</span> <span class="special">/</span> <span class="number">100000UL</span><span class="special">;</span> | |
207 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"BOOST_NO_CXX11_NUMERIC_LIMITS is defined"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> | |
208 | <span class="preprocessor">#else</span> | |
209 | <span class="keyword">int</span> <span class="identifier">max_digits10</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">max_digits10</span><span class="special">;</span> | |
210 | <span class="preprocessor">#endif</span> | |
211 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Show all potentially significant decimal digits std::numeric_limits<double>::max_digits10 = "</span> | |
212 | <span class="special"><<</span> <span class="identifier">max_digits10</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> | |
213 | <span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">max_digits10</span><span class="special">);</span> <span class="comment">//</span> | |
214 | ||
215 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">g05</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// returns 0.5000346561579232, not exact 0.5.</span> | |
216 | </pre> | |
217 | <p> | |
218 | To get the R discrete behaviour, you simply need to round with, for example, | |
219 | the <code class="computeroutput"><span class="identifier">floor</span></code> function. | |
220 | </p> | |
221 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">g05</span><span class="special">,</span> <span class="identifier">floor</span><span class="special">(</span><span class="number">0.0001</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// returns exactly 0.5</span> | |
222 | </pre> | |
223 | <pre class="programlisting"><code class="computeroutput"><span class="special">></span> <span class="identifier">formatC</span><span class="special">(</span><span class="identifier">pgeom</span><span class="special">(</span><span class="number">0.9999999</span><span class="special">,</span><span class="number">0.5</span><span class="special">,</span> <span class="identifier">FALSE</span><span class="special">),</span> <span class="identifier">digits</span><span class="special">=</span><span class="number">17</span><span class="special">)</span> <span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="string">" 0.25"</span></code> | |
224 | <code class="computeroutput"><span class="special">></span> <span class="identifier">formatC</span><span class="special">(</span><span class="identifier">pgeom</span><span class="special">(</span><span class="number">1.999999</span><span class="special">,</span><span class="number">0.5</span><span class="special">,</span> <span class="identifier">FALSE</span><span class="special">),</span> <span class="identifier">digits</span><span class="special">=</span><span class="number">17</span><span class="special">)[</span><span class="number">1</span><span class="special">]</span> <span class="string">" 0.25"</span> <span class="identifier">k</span> <span class="special">=</span> <span class="number">1</span></code> | |
225 | <code class="computeroutput"><span class="special">></span> <span class="identifier">formatC</span><span class="special">(</span><span class="identifier">pgeom</span><span class="special">(</span><span class="number">1.9999999</span><span class="special">,</span><span class="number">0.5</span><span class="special">,</span> <span class="identifier">FALSE</span><span class="special">),</span> <span class="identifier">digits</span><span class="special">=</span><span class="number">17</span><span class="special">)[</span><span class="number">1</span><span class="special">]</span> <span class="string">"0.12500000000000003"</span> <span class="identifier">k</span> <span class="special">=</span> <span class="number">2</span></code> | |
226 | </pre> | |
227 | <p> | |
228 | shows that R makes an arbitrary round-up decision at about 1e7 from the | |
229 | next integer above. This may be convenient in practice, and could be replicated | |
230 | in C++ if desired. | |
231 | </p> | |
232 | <h5> | |
233 | <a name="math_toolkit.stat_tut.weg.geometric_eg.h1"></a> | |
234 | <span class="phrase"><a name="math_toolkit.stat_tut.weg.geometric_eg.surveying_customers_to_find_one_"></a></span><a class="link" href="geometric_eg.html#math_toolkit.stat_tut.weg.geometric_eg.surveying_customers_to_find_one_">Surveying | |
235 | customers to find one with a faulty product</a> | |
236 | </h5> | |
237 | <p> | |
238 | A company knows from warranty claims that 2% of their products will be | |
239 | faulty, so the 'success_fraction' of finding a fault is 0.02. It wants | |
240 | to interview a purchaser of faulty products to assess their 'user experience'. | |
241 | </p> | |
242 | <p> | |
243 | To estimate how many customers they will probably need to contact in order | |
244 | to find one who has suffered from the fault, we first construct a geometric | |
245 | distribution with probability 0.02, and then chose a confidence, say 80%, | |
246 | 95%, or 99% to finding a customer with a fault. Finally, we probably want | |
247 | to round up the result to the integer above using the <code class="computeroutput"><span class="identifier">ceil</span></code> | |
248 | function. (We could also use a policy, but that is hardly worthwhile for | |
249 | this simple application.) | |
250 | </p> | |
251 | <p> | |
252 | (This also assumes that each customer only buys one product: if customers | |
253 | bought more than one item, the probability of finding a customer with a | |
254 | fault obviously improves.) | |
255 | </p> | |
256 | <pre class="programlisting"><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> | |
257 | <span class="identifier">geometric</span> <span class="identifier">g</span><span class="special">(</span><span class="number">0.02</span><span class="special">);</span> <span class="comment">// On average, 2 in 100 products are faulty.</span> | |
258 | <span class="keyword">double</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">0.95</span><span class="special">;</span> <span class="comment">// 95% confidence.</span> | |
259 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" quantile(g, "</span> <span class="special"><<</span> <span class="identifier">c</span> <span class="special"><<</span> <span class="string">") = "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">c</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> | |
260 | ||
261 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"To be "</span> <span class="special"><<</span> <span class="identifier">c</span> <span class="special">*</span> <span class="number">100</span> | |
262 | <span class="special"><<</span> <span class="string">"% confident of finding we customer with a fault, need to survey "</span> | |
263 | <span class="special"><<</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">c</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" customers."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 148</span> | |
264 | <span class="identifier">c</span> <span class="special">=</span> <span class="number">0.99</span><span class="special">;</span> <span class="comment">// Very confident.</span> | |
265 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"To be "</span> <span class="special"><<</span> <span class="identifier">c</span> <span class="special">*</span> <span class="number">100</span> | |
266 | <span class="special"><<</span> <span class="string">"% confident of finding we customer with a fault, need to survey "</span> | |
267 | <span class="special"><<</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">c</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" customers."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 227</span> | |
268 | <span class="identifier">c</span> <span class="special">=</span> <span class="number">0.80</span><span class="special">;</span> <span class="comment">// Only reasonably confident.</span> | |
269 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"To be "</span> <span class="special"><<</span> <span class="identifier">c</span> <span class="special">*</span> <span class="number">100</span> | |
270 | <span class="special"><<</span> <span class="string">"% confident of finding we customer with a fault, need to survey "</span> | |
271 | <span class="special"><<</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">c</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" customers."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 79</span> | |
272 | </pre> | |
273 | <h5> | |
274 | <a name="math_toolkit.stat_tut.weg.geometric_eg.h2"></a> | |
275 | <span class="phrase"><a name="math_toolkit.stat_tut.weg.geometric_eg.basket_ball_shooters"></a></span><a class="link" href="geometric_eg.html#math_toolkit.stat_tut.weg.geometric_eg.basket_ball_shooters">Basket | |
276 | Ball Shooters</a> | |
277 | </h5> | |
278 | <p> | |
279 | According to Wikipedia, average pro basket ball players get <a href="http://en.wikipedia.org/wiki/Free_throw" target="_top">free | |
280 | throws</a> in the baskets 70 to 80 % of the time, but some get as high | |
281 | as 95%, and others as low as 50%. Suppose we want to compare the probabilities | |
282 | of failing to get a score only on the first or on the fifth shot? To start | |
283 | we will consider the average shooter, say 75%. So we construct a geometric | |
284 | distribution with success_fraction parameter 75/100 = 0.75. | |
285 | </p> | |
286 | <pre class="programlisting"><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> | |
287 | <span class="identifier">geometric</span> <span class="identifier">gav</span><span class="special">(</span><span class="number">0.75</span><span class="special">);</span> <span class="comment">// Shooter averages 7.5 out of 10 in the basket.</span> | |
288 | </pre> | |
289 | <p> | |
290 | What is probability of getting 1st try in the basket, that is with no failures? | |
291 | </p> | |
292 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of score on 1st try = "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">gav</span><span class="special">,</span> <span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.75</span> | |
293 | </pre> | |
294 | <p> | |
295 | This is, of course, the success_fraction probability 75%. What is the probability | |
296 | that the shooter only scores on the fifth shot? So there are 5-1 = 4 failures | |
297 | before the first success. | |
298 | </p> | |
299 | <pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of score on 5th try = "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">gav</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.0029</span> | |
300 | </pre> | |
301 | <p> | |
302 | Now compare this with the poor and the best players success fraction. We | |
303 | need to constructing new distributions with the different success fractions, | |
304 | and then get the corresponding probability density functions values: | |
305 | </p> | |
306 | <pre class="programlisting"><span class="identifier">geometric</span> <span class="identifier">gbest</span><span class="special">(</span><span class="number">0.95</span><span class="special">);</span> | |
307 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of score on 5th try = "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">gbest</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 5.9e-6</span> | |
308 | <span class="identifier">geometric</span> <span class="identifier">gmediocre</span><span class="special">(</span><span class="number">0.50</span><span class="special">);</span> | |
309 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of score on 5th try = "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">gmediocre</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.031</span> | |
310 | </pre> | |
311 | <p> | |
312 | So we can see the very much smaller chance (0.000006) of 4 failures by | |
313 | the best shooters, compared to the 0.03 of the mediocre. | |
314 | </p> | |
315 | <h5> | |
316 | <a name="math_toolkit.stat_tut.weg.geometric_eg.h3"></a> | |
317 | <span class="phrase"><a name="math_toolkit.stat_tut.weg.geometric_eg.estimating_failures"></a></span><a class="link" href="geometric_eg.html#math_toolkit.stat_tut.weg.geometric_eg.estimating_failures">Estimating | |
318 | failures</a> | |
319 | </h5> | |
320 | <p> | |
321 | Of course one man's failure is an other man's success. So a fault can be | |
322 | defined as a 'success'. | |
323 | </p> | |
324 | <p> | |
325 | If a fault occurs once after 100 flights, then one might naively say that | |
326 | the risk of fault is obviously 1 in 100 = 1/100, a probability of 0.01. | |
327 | </p> | |
328 | <p> | |
329 | This is the best estimate we can make, but while it is the truth, it is | |
330 | not the whole truth, for it hides the big uncertainty when estimating from | |
331 | a single event. "One swallow doesn't make a summer." To show | |
332 | the magnitude of the uncertainty, the geometric (or the negative binomial) | |
333 | distribution can be used. | |
334 | </p> | |
335 | <p> | |
336 | If we chose the popular 95% confidence in the limits, corresponding to | |
337 | an alpha of 0.05, because we are calculating a two-sided interval, we must | |
338 | divide alpha by two. | |
339 | </p> | |
340 | <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span> <span class="special">=</span> <span class="number">0.05</span><span class="special">;</span> | |
341 | <span class="keyword">double</span> <span class="identifier">k</span> <span class="special">=</span> <span class="number">100</span><span class="special">;</span> <span class="comment">// So frequency of occurrence is 1/100.</span> | |
342 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability is failure is "</span> <span class="special"><<</span> <span class="number">1</span><span class="special">/</span><span class="identifier">k</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> | |
343 | <span class="keyword">double</span> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">geometric</span><span class="special">::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span><span class="identifier">k</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> | |
344 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"geometric::find_lower_bound_on_p("</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="string">") = "</span> | |
345 | <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.00025</span> | |
346 | <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">geometric</span><span class="special">::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span><span class="identifier">k</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> | |
347 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"geometric::find_upper_bound_on_p("</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="string">") = "</span> | |
348 | <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.037</span> | |
349 | </pre> | |
350 | <p> | |
351 | So while we estimate the probability is 0.01, it might lie between 0.0003 | |
352 | and 0.04. Even if we relax our confidence to alpha = 90%, the bounds only | |
353 | contract to 0.0005 and 0.03. And if we require a high confidence, they | |
354 | widen to 0.00005 to 0.05. | |
355 | </p> | |
356 | <pre class="programlisting"><span class="identifier">alpha</span> <span class="special">=</span> <span class="number">0.1</span><span class="special">;</span> <span class="comment">// 90% confidence.</span> | |
357 | <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">geometric</span><span class="special">::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span><span class="identifier">k</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> | |
358 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"geometric::find_lower_bound_on_p("</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="string">") = "</span> | |
359 | <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.0005</span> | |
360 | <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">geometric</span><span class="special">::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span><span class="identifier">k</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> | |
361 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"geometric::find_upper_bound_on_p("</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="string">") = "</span> | |
362 | <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.03</span> | |
363 | ||
364 | <span class="identifier">alpha</span> <span class="special">=</span> <span class="number">0.01</span><span class="special">;</span> <span class="comment">// 99% confidence.</span> | |
365 | <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">geometric</span><span class="special">::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span><span class="identifier">k</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> | |
366 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"geometric::find_lower_bound_on_p("</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="string">") = "</span> | |
367 | <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 5e-005</span> | |
368 | <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">geometric</span><span class="special">::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span><span class="identifier">k</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> | |
369 | <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"geometric::find_upper_bound_on_p("</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">k</span><span class="special">)</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="string">") = "</span> | |
370 | <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.052</span> | |
371 | </pre> | |
372 | <p> | |
373 | In real life, there will usually be more than one event (fault or success), | |
374 | when the negative binomial, which has the neccessary extra parameter, will | |
375 | be needed. | |
376 | </p> | |
377 | <p> | |
378 | As noted above, using a catch block is always a good idea, even if you | |
379 | hope not to use it! | |
380 | </p> | |
381 | <pre class="programlisting"><span class="special">}</span> | |
382 | <span class="keyword">catch</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> | |
383 | <span class="special">{</span> <span class="comment">// Since we have set an overflow policy of ignore_error,</span> | |
384 | <span class="comment">// an overflow exception should never be thrown.</span> | |
385 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nMessage from thrown exception was:\n "</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> | |
386 | </pre> | |
387 | <p> | |
388 | For example, without a ignore domain error policy, if we asked for | |
389 | </p> | |
390 | <pre class="programlisting"><span class="identifier">pdf</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span><span class="special">)</span></pre> | |
391 | <p> | |
392 | for example, we would get an unhelpful abort, but with a catch: | |
393 | </p> | |
394 | <pre class="programlisting">Message from thrown exception was: | |
395 | Error in function boost::math::pdf(const exponential_distribution<double>&, double): | |
396 | Number of failures argument is -1, but must be >= 0 ! | |
397 | </pre> | |
398 | <p> | |
399 | See full source C++ of this example at <a href="../../../../../example/geometric_examples.cpp" target="_top">geometric_examples.cpp</a> | |
400 | </p> | |
401 | <p> | |
402 | <a class="link" href="neg_binom_eg/neg_binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial Distribution">See | |
403 | negative_binomial confidence interval example.</a> | |
404 | </p> | |
405 | </div> | |
406 | <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> | |
407 | <td align="left"></td> | |
408 | <td align="right"><div class="copyright-footer">Copyright © 2006-2010, 2012-2014 Nikhar Agrawal, | |
409 | Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert | |
410 | Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani, | |
411 | Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<p> | |
412 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
413 | 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>) | |
414 | </p> | |
415 | </div></td> | |
416 | </tr></table> | |
417 | <hr> | |
418 | <div class="spirit-nav"> | |
419 | <a accesskey="p" href="binom_eg/binom_size_eg.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../weg.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="neg_binom_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> | |
420 | </div> | |
421 | </body> | |
422 | </html> |