mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2026-06-20 06:38:48 -04:00
Squashed 'boost/' content from commit b4feb19f2
git-subtree-dir: boost git-subtree-split: b4feb19f287ee92d87a9624b5d36b7cf46aeadeb
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Binomial Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="f_eg.html" title="F Distribution Examples">
|
||||
<link rel="next" href="binom_eg/binomial_coinflip_example.html" title="Binomial Coin-Flipping Example">
|
||||
</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="f_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="binom_eg/binomial_coinflip_example.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg"></a><a class="link" href="binom_eg.html" title="Binomial Distribution Examples">Binomial Distribution
|
||||
Examples</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc">
|
||||
<dt><span class="section"><a href="binom_eg/binomial_coinflip_example.html">Binomial
|
||||
Coin-Flipping Example</a></span></dt>
|
||||
<dt><span class="section"><a href="binom_eg/binomial_quiz_example.html">Binomial
|
||||
Quiz Example</a></span></dt>
|
||||
<dt><span class="section"><a href="binom_eg/binom_conf.html">Calculating
|
||||
Confidence Limits on the Frequency of Occurrence for a Binomial Distribution</a></span></dt>
|
||||
<dt><span class="section"><a href="binom_eg/binom_size_eg.html">Estimating
|
||||
Sample Sizes for a Binomial Distribution.</a></span></dt>
|
||||
</dl></div>
|
||||
<p>
|
||||
See also the reference documentation for the <a class="link" href="../../dist_ref/dists/binomial_dist.html" title="Binomial Distribution">Binomial
|
||||
Distribution</a>.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="f_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="binom_eg/binomial_coinflip_example.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,241 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Calculating Confidence Limits on the Frequency of Occurrence for a Binomial Distribution</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../binom_eg.html" title="Binomial Distribution Examples">
|
||||
<link rel="prev" href="binomial_quiz_example.html" title="Binomial Quiz Example">
|
||||
<link rel="next" href="binom_size_eg.html" title="Estimating Sample Sizes for a Binomial 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="binomial_quiz_example.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="binom_size_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg.binom_conf"></a><a class="link" href="binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for a Binomial Distribution">Calculating
|
||||
Confidence Limits on the Frequency of Occurrence for a Binomial Distribution</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine you have a process that follows a binomial distribution: for
|
||||
each trial conducted, an event either occurs or does it does not, referred
|
||||
to as "successes" and "failures". If, by experiment,
|
||||
you want to measure the frequency with which successes occur, the best
|
||||
estimate is given simply by <span class="emphasis"><em>k</em></span> / <span class="emphasis"><em>N</em></span>,
|
||||
for <span class="emphasis"><em>k</em></span> successes out of <span class="emphasis"><em>N</em></span> trials.
|
||||
However our confidence in that estimate will be shaped by how many trials
|
||||
were conducted, and how many successes were observed. The static member
|
||||
functions <code class="computeroutput"><span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_lower_bound_on_p</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_upper_bound_on_p</span></code>
|
||||
allow you to calculate the confidence intervals for your estimate of
|
||||
the occurrence frequency.
|
||||
</p>
|
||||
<p>
|
||||
The sample program <a href="../../../../../../example/binomial_confidence_limits.cpp" target="_top">binomial_confidence_limits.cpp</a>
|
||||
illustrates their use. It begins by defining a procedure that will print
|
||||
a table of confidence limits for various degrees of certainty:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<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">binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">confidence_limits_on_frequency</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">trials</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">successes</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// trials = Total number of trials.</span>
|
||||
<span class="comment">// successes = Total number of observed successes.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Calculate confidence limits for an observed</span>
|
||||
<span class="comment">// frequency of occurrence that follows a binomial</span>
|
||||
<span class="comment">// distribution.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Print out general info:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"___________________________________________\n"</span>
|
||||
<span class="string">"2-Sided Confidence Limits For Success Ratio\n"</span>
|
||||
<span class="string">"___________________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">7</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of Observations"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">trials</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of successes"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">successes</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Sample frequency of occurrence"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">successes</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">trials</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The procedure now defines a table of significance levels: these are the
|
||||
probabilities that the true occurrence frequency lies outside the calculated
|
||||
interval:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Some pretty printing of the table header follows:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n\n"</span>
|
||||
<span class="string">"_______________________________________________________________________\n"</span>
|
||||
<span class="string">"Confidence Lower CP Upper CP Lower JP Upper JP\n"</span>
|
||||
<span class="string">" Value (%) Limit Limit Limit Limit\n"</span>
|
||||
<span class="string">"_______________________________________________________________________\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
And now for the important part - the intervals themselves - for each
|
||||
value of <span class="emphasis"><em>alpha</em></span>, we call <code class="computeroutput"><span class="identifier">find_lower_bound_on_p</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">find_lower_upper_on_p</span></code>
|
||||
to obtain lower and upper bounds respectively. Note that since we are
|
||||
calculating a two-sided interval, we must divide the value of alpha in
|
||||
two.
|
||||
</p>
|
||||
<p>
|
||||
Please note that calculating two separate <span class="emphasis"><em>single sided bounds</em></span>,
|
||||
each with risk level α  is not the same thing as calculating a two sided
|
||||
interval. Had we calculate two single-sided intervals each with a risk
|
||||
that the true value is outside the interval of α, then:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
The risk that it is less than the lower bound is α.
|
||||
</li></ul></div>
|
||||
<p>
|
||||
and
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
The risk that it is greater than the upper bound is also α.
|
||||
</li></ul></div>
|
||||
<p>
|
||||
So the risk it is outside <span class="bold"><strong>upper or lower bound</strong></span>,
|
||||
is <span class="bold"><strong>twice</strong></span> alpha, and the probability
|
||||
that it is inside the bounds is therefore not nearly as high as one might
|
||||
have thought. This is why α/2 must be used in the calculations below.
|
||||
</p>
|
||||
<p>
|
||||
In contrast, had we been calculating a single-sided interval, for example:
|
||||
<span class="emphasis"><em>"Calculate a lower bound so that we are P% sure that the
|
||||
true occurrence frequency is greater than some value"</em></span>
|
||||
then we would <span class="bold"><strong>not</strong></span> have divided by two.
|
||||
</p>
|
||||
<p>
|
||||
Finally note that <code class="computeroutput"><span class="identifier">binomial_distribution</span></code>
|
||||
provides a choice of two methods for the calculation, we print out the
|
||||
results from both methods in this example:
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// Confidence value:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="comment">// Calculate Clopper Pearson bounds:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">l</span> <span class="special">=</span> <span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span>
|
||||
<span class="identifier">trials</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">u</span> <span class="special">=</span> <span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span>
|
||||
<span class="identifier">trials</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">);</span>
|
||||
<span class="comment">// Print Clopper Pearson Limits:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">l</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">u</span><span class="special">;</span>
|
||||
<span class="comment">// Calculate Jeffreys Prior Bounds:</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span>
|
||||
<span class="identifier">trials</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">,</span>
|
||||
<span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">jeffreys_prior_interval</span><span class="special">);</span>
|
||||
<span class="identifier">u</span> <span class="special">=</span> <span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span>
|
||||
<span class="identifier">trials</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">,</span>
|
||||
<span class="identifier">binomial_distribution</span><span class="special"><>::</span><span class="identifier">jeffreys_prior_interval</span><span class="special">);</span>
|
||||
<span class="comment">// Print Jeffreys Prior Limits:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">l</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">u</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
And that's all there is to it. Let's see some sample output for a 2 in
|
||||
10 success ratio, first for 20 trials:
|
||||
</p>
|
||||
<pre class="programlisting">___________________________________________
|
||||
2-Sided Confidence Limits For Success Ratio
|
||||
___________________________________________
|
||||
|
||||
Number of Observations = 20
|
||||
Number of successes = 4
|
||||
Sample frequency of occurrence = 0.2
|
||||
|
||||
|
||||
_______________________________________________________________________
|
||||
Confidence Lower CP Upper CP Lower JP Upper JP
|
||||
Value (%) Limit Limit Limit Limit
|
||||
_______________________________________________________________________
|
||||
50.000 0.12840 0.29588 0.14974 0.26916
|
||||
75.000 0.09775 0.34633 0.11653 0.31861
|
||||
90.000 0.07135 0.40103 0.08734 0.37274
|
||||
95.000 0.05733 0.43661 0.07152 0.40823
|
||||
99.000 0.03576 0.50661 0.04655 0.47859
|
||||
99.900 0.01905 0.58632 0.02634 0.55960
|
||||
99.990 0.01042 0.64997 0.01530 0.62495
|
||||
99.999 0.00577 0.70216 0.00901 0.67897
|
||||
</pre>
|
||||
<p>
|
||||
As you can see, even at the 95% confidence level the bounds are really
|
||||
quite wide (this example is chosen to be easily compared to the one in
|
||||
the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a> <a href="http://www.itl.nist.gov/div898/handbook/prc/section2/prc241.htm" target="_top">here</a>).
|
||||
Note also that the Clopper-Pearson calculation method (CP above) produces
|
||||
quite noticeably more pessimistic estimates than the Jeffreys Prior method
|
||||
(JP above).
|
||||
</p>
|
||||
<p>
|
||||
Compare that with the program output for 2000 trials:
|
||||
</p>
|
||||
<pre class="programlisting">___________________________________________
|
||||
2-Sided Confidence Limits For Success Ratio
|
||||
___________________________________________
|
||||
|
||||
Number of Observations = 2000
|
||||
Number of successes = 400
|
||||
Sample frequency of occurrence = 0.2000000
|
||||
|
||||
|
||||
_______________________________________________________________________
|
||||
Confidence Lower CP Upper CP Lower JP Upper JP
|
||||
Value (%) Limit Limit Limit Limit
|
||||
_______________________________________________________________________
|
||||
50.000 0.19382 0.20638 0.19406 0.20613
|
||||
75.000 0.18965 0.21072 0.18990 0.21047
|
||||
90.000 0.18537 0.21528 0.18561 0.21503
|
||||
95.000 0.18267 0.21821 0.18291 0.21796
|
||||
99.000 0.17745 0.22400 0.17769 0.22374
|
||||
99.900 0.17150 0.23079 0.17173 0.23053
|
||||
99.990 0.16658 0.23657 0.16681 0.23631
|
||||
99.999 0.16233 0.24169 0.16256 0.24143
|
||||
</pre>
|
||||
<p>
|
||||
Now even when the confidence level is very high, the limits are really
|
||||
quite close to the experimentally calculated value of 0.2. Furthermore
|
||||
the difference between the two calculation methods is now really quite
|
||||
small.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="binomial_quiz_example.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="binom_size_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,160 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Estimating Sample Sizes for a Binomial Distribution.</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../binom_eg.html" title="Binomial Distribution Examples">
|
||||
<link rel="prev" href="binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for a Binomial Distribution">
|
||||
<link rel="next" href="../geometric_eg.html" title="Geometric Distribution Examples">
|
||||
</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="binom_conf.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="../geometric_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg.binom_size_eg"></a><a class="link" href="binom_size_eg.html" title="Estimating Sample Sizes for a Binomial Distribution.">Estimating
|
||||
Sample Sizes for a Binomial Distribution.</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine you have a critical component that you know will fail in 1 in
|
||||
N "uses" (for some suitable definition of "use").
|
||||
You may want to schedule routine replacement of the component so that
|
||||
its chance of failure between routine replacements is less than P%. If
|
||||
the failures follow a binomial distribution (each time the component
|
||||
is "used" it either fails or does not) then the static member
|
||||
function <code class="computeroutput"><span class="identifier">binomial_distibution</span><span class="special"><>::</span><span class="identifier">find_maximum_number_of_trials</span></code>
|
||||
can be used to estimate the maximum number of "uses" of that
|
||||
component for some acceptable risk level <span class="emphasis"><em>alpha</em></span>.
|
||||
</p>
|
||||
<p>
|
||||
The example program <a href="../../../../../../example/binomial_sample_sizes.cpp" target="_top">binomial_sample_sizes.cpp</a>
|
||||
demonstrates its usage. It centres on a routine that prints out a table
|
||||
of maximum sample sizes for various probability thresholds:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">find_max_sample_size</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">p</span><span class="special">,</span> <span class="comment">// success ratio.</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">successes</span><span class="special">)</span> <span class="comment">// Total number of observed successes permitted.</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
The routine then declares a table of probability thresholds: these are
|
||||
the maximum acceptable probability that <span class="emphasis"><em>successes</em></span>
|
||||
or fewer events will be observed. In our example, <span class="emphasis"><em>successes</em></span>
|
||||
will be always zero, since we want no component failures, but in other
|
||||
situations non-zero values may well make sense.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Much of the rest of the program is pretty-printing, the important part
|
||||
is in the calculation of maximum number of permitted trials for each
|
||||
value of alpha:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// Confidence value:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="comment">// calculate trials:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">binomial</span><span class="special">::</span><span class="identifier">find_maximum_number_of_trials</span><span class="special">(</span>
|
||||
<span class="identifier">successes</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="identifier">t</span> <span class="special">=</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="comment">// Print Trials:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that since we're calculating the maximum number of trials permitted,
|
||||
we'll err on the safe side and take the floor of the result. Had we been
|
||||
calculating the <span class="emphasis"><em>minimum</em></span> number of trials required
|
||||
to observe a certain number of <span class="emphasis"><em>successes</em></span> using
|
||||
<code class="computeroutput"><span class="identifier">find_minimum_number_of_trials</span></code>
|
||||
we would have taken the ceiling instead.
|
||||
</p>
|
||||
<p>
|
||||
We'll finish off by looking at some sample output, firstly for a 1 in
|
||||
1000 chance of component failure with each use:
|
||||
</p>
|
||||
<pre class="programlisting">________________________
|
||||
Maximum Number of Trials
|
||||
________________________
|
||||
|
||||
Success ratio = 0.001
|
||||
Maximum Number of "successes" permitted = 0
|
||||
|
||||
|
||||
____________________________
|
||||
Confidence Max Number
|
||||
Value (%) Of Trials
|
||||
____________________________
|
||||
50.000 692
|
||||
75.000 287
|
||||
90.000 105
|
||||
95.000 51
|
||||
99.000 10
|
||||
99.900 0
|
||||
99.990 0
|
||||
99.999 0
|
||||
</pre>
|
||||
<p>
|
||||
So 51 "uses" of the component would yield a 95% chance that
|
||||
no component failures would be observed.
|
||||
</p>
|
||||
<p>
|
||||
Compare that with a 1 in 1 million chance of component failure:
|
||||
</p>
|
||||
<pre class="programlisting">________________________
|
||||
Maximum Number of Trials
|
||||
________________________
|
||||
|
||||
Success ratio = 0.0000010
|
||||
Maximum Number of "successes" permitted = 0
|
||||
|
||||
|
||||
____________________________
|
||||
Confidence Max Number
|
||||
Value (%) Of Trials
|
||||
____________________________
|
||||
50.000 693146
|
||||
75.000 287681
|
||||
90.000 105360
|
||||
95.000 51293
|
||||
99.000 10050
|
||||
99.900 1000
|
||||
99.990 100
|
||||
99.999 10
|
||||
</pre>
|
||||
<p>
|
||||
In this case, even 1000 uses of the component would still yield a less
|
||||
than 1 in 1000 chance of observing a component failure (i.e. a 99.9%
|
||||
chance of no failure).
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="binom_conf.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="../geometric_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,274 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Binomial Coin-Flipping Example</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../binom_eg.html" title="Binomial Distribution Examples">
|
||||
<link rel="prev" href="../binom_eg.html" title="Binomial Distribution Examples">
|
||||
<link rel="next" href="binomial_quiz_example.html" title="Binomial Quiz Example">
|
||||
</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="../binom_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="binomial_quiz_example.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg.binomial_coinflip_example"></a><a class="link" href="binomial_coinflip_example.html" title="Binomial Coin-Flipping Example">Binomial
|
||||
Coin-Flipping Example</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
An example of a <a href="http://en.wikipedia.org/wiki/Bernoulli_process" target="_top">Bernoulli
|
||||
process</a> is coin flipping. A variable in such a sequence may be
|
||||
called a Bernoulli variable.
|
||||
</p>
|
||||
<p>
|
||||
This example shows using the Binomial distribution to predict the probability
|
||||
of heads and tails when throwing a coin.
|
||||
</p>
|
||||
<p>
|
||||
The number of correct answers (say heads), X, is distributed as a binomial
|
||||
random variable with binomial distribution parameters number of trials
|
||||
(flips) n = 10 and probability (success_fraction) of getting a head p
|
||||
= 0.5 (a 'fair' coin).
|
||||
</p>
|
||||
<p>
|
||||
(Our coin is assumed fair, but we could easily change the success_fraction
|
||||
parameter p from 0.5 to some other value to simulate an unfair coin,
|
||||
say 0.6 for one with chewing gum on the tail, so it is more likely to
|
||||
fall tails down and heads up).
|
||||
</p>
|
||||
<p>
|
||||
First we need some includes and using statements to be able to use the
|
||||
binomial distribution, some std input and output, and get started:
|
||||
</p>
|
||||
<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">binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">binomial</span><span class="special">;</span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">left</span><span class="special">;</span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</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>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Using Binomial distribution to predict how many heads and tails."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
See note <a class="link" href="binomial_coinflip_example.html#coinflip_eg_catch">with the catch block</a>
|
||||
about why a try and catch block is always a good idea.
|
||||
</p>
|
||||
<p>
|
||||
First, construct a binomial distribution with parameters success_fraction
|
||||
1/2, and how many flips.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">success_fraction</span> <span class="special">=</span> <span class="number">0.5</span><span class="special">;</span> <span class="comment">// = 50% = 1/2 for a 'fair' coin.</span>
|
||||
<span class="keyword">int</span> <span class="identifier">flips</span> <span class="special">=</span> <span class="number">10</span><span class="special">;</span>
|
||||
<span class="identifier">binomial</span> <span class="identifier">flip</span><span class="special">(</span><span class="identifier">flips</span><span class="special">,</span> <span class="identifier">success_fraction</span><span class="special">);</span>
|
||||
|
||||
<span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">4</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
Then some examples of using Binomial moments (and echoing the parameters).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"From "</span> <span class="special"><<</span> <span class="identifier">flips</span> <span class="special"><<</span> <span class="string">" one can expect to get on average "</span>
|
||||
<span class="special"><<</span> <span class="identifier">mean</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" heads (or tails)."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Mode is "</span> <span class="special"><<</span> <span class="identifier">mode</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard deviation is "</span> <span class="special"><<</span> <span class="identifier">standard_deviation</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"So about 2/3 will lie within 1 standard deviation and get between "</span>
|
||||
<span class="special"><<</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">mean</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">standard_deviation</span><span class="special">(</span><span class="identifier">flip</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" and "</span>
|
||||
<span class="special"><<</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">mean</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">standard_deviation</span><span class="special">(</span><span class="identifier">flip</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" correct."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Skewness is "</span> <span class="special"><<</span> <span class="identifier">skewness</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Skewness of binomial distributions is only zero (symmetrical)</span>
|
||||
<span class="comment">// if success_fraction is exactly one half,</span>
|
||||
<span class="comment">// for example, when flipping 'fair' coins.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Skewness if success_fraction is "</span> <span class="special"><<</span> <span class="identifier">flip</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">skewness</span><span class="special">(</span><span class="identifier">flip</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Expect zero for a 'fair' coin.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Now we show a variety of predictions on the probability of heads:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"For "</span> <span class="special"><<</span> <span class="identifier">flip</span><span class="special">.</span><span class="identifier">trials</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" coin flips: "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting no heads is "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</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="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting at least one head is "</span> <span class="special"><<</span> <span class="number">1.</span> <span class="special">-</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</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>
|
||||
</pre>
|
||||
<p>
|
||||
When we want to calculate the probability for a range or values we can
|
||||
sum the PDF's:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting 0 or 1 heads is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</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">flip</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">// sum of exactly == probabilities</span>
|
||||
</pre>
|
||||
<p>
|
||||
Or we can use the cdf.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting 0 or 1 (<= 1) heads is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</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="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting 9 or 10 heads is "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">9</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that using
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting 9 or 10 heads is "</span> <span class="special"><<</span> <span class="number">1.</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">8</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
is less accurate than using the complement
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting 9 or 10 heads is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">8</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Since the subtraction may involve <a href="http://docs.sun.com/source/806-3568/ncg_goldberg.html" target="_top">cancellation
|
||||
error</a>, where as <code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">8</span><span class="special">))</span></code>
|
||||
does not use such a subtraction internally, and so does not exhibit the
|
||||
problem.
|
||||
</p>
|
||||
<p>
|
||||
To get the probability for a range of heads, we can either add the pdfs
|
||||
for each number of heads
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of between 4 and 6 heads (4 or 5 or 6) is "</span>
|
||||
<span class="comment">// P(X == 4) + P(X == 5) + P(X == 6)</span>
|
||||
<span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">5</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">6</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
But this is probably less efficient than using the cdf
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of between 4 and 6 heads (4 or 5 or 6) is "</span>
|
||||
<span class="comment">// P(X <= 6) - P(X <= 3) == P(X < 4)</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">6</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Certainly for a bigger range like, 3 to 7
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of between 3 and 7 heads (3, 4, 5, 6 or 7) is "</span>
|
||||
<span class="comment">// P(X <= 7) - P(X <= 2) == P(X < 3)</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">7</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Finally, print two tables of probability for the <span class="emphasis"><em>exactly</em></span>
|
||||
and <span class="emphasis"><em>at least</em></span> a number of heads.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Print a table of probability for the exactly a number of heads.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting exactly (==) heads"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">successes</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">successes</span> <span class="special"><=</span> <span class="identifier">flips</span><span class="special">;</span> <span class="identifier">successes</span><span class="special">++)</span>
|
||||
<span class="special">{</span> <span class="comment">// Say success means getting a head (or equally success means getting a tail).</span>
|
||||
<span class="keyword">double</span> <span class="identifier">probability</span> <span class="special">=</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">successes</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="identifier">probability</span> <span class="special"><<</span> <span class="string">" or 1 in "</span> <span class="special"><<</span> <span class="number">1.</span> <span class="special">/</span> <span class="identifier">probability</span>
|
||||
<span class="special"><<</span> <span class="string">", or "</span> <span class="special"><<</span> <span class="identifier">probability</span> <span class="special">*</span> <span class="number">100.</span> <span class="special"><<</span> <span class="string">"%"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// for i</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Tabulate the probability of getting between zero heads and 0 upto 10 heads.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting upto (<=) heads"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">successes</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">successes</span> <span class="special"><=</span> <span class="identifier">flips</span><span class="special">;</span> <span class="identifier">successes</span><span class="special">++)</span>
|
||||
<span class="special">{</span> <span class="comment">// Say success means getting a head</span>
|
||||
<span class="comment">// (equally success could mean getting a tail).</span>
|
||||
<span class="keyword">double</span> <span class="identifier">probability</span> <span class="special">=</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">flip</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">);</span> <span class="comment">// P(X <= heads)</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">successes</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span>
|
||||
<span class="special"><<</span> <span class="identifier">probability</span> <span class="special"><<</span> <span class="string">" or 1 in "</span> <span class="special"><<</span> <span class="number">1.</span> <span class="special">/</span> <span class="identifier">probability</span> <span class="special"><<</span> <span class="string">", or "</span>
|
||||
<span class="special"><<</span> <span class="identifier">probability</span> <span class="special">*</span> <span class="number">100.</span> <span class="special"><<</span> <span class="string">"%"</span><span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// for i</span>
|
||||
</pre>
|
||||
<p>
|
||||
The last (0 to 10 heads) must, of course, be 100% probability.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="special">}</span>
|
||||
<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>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">//</span>
|
||||
</pre>
|
||||
<p>
|
||||
<a name="coinflip_eg_catch"></a>It is always essential to include try
|
||||
& catch blocks because default policies are to throw exceptions on
|
||||
arguments that are out of domain or cause errors like numeric-overflow.
|
||||
</p>
|
||||
<p>
|
||||
Lacking try & catch blocks, the program will abort, whereas the message
|
||||
below from the thrown exception will give some helpful clues as to the
|
||||
cause of the problem.
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"\n"</span><span class="string">"Message 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>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
See <a href="../../../../../../example/binomial_coinflip_example.cpp" target="_top">binomial_coinflip_example.cpp</a>
|
||||
for full source code, the program output looks like this:
|
||||
</p>
|
||||
<pre class="programlisting">Using Binomial distribution to predict how many heads and tails.
|
||||
From 10 one can expect to get on average 5 heads (or tails).
|
||||
Mode is 5
|
||||
Standard deviation is 1.581
|
||||
So about 2/3 will lie within 1 standard deviation and get between 4 and 6 correct.
|
||||
Skewness is 0
|
||||
Skewness if success_fraction is 0.5 is 0
|
||||
|
||||
For 10 coin flips:
|
||||
Probability of getting no heads is 0.0009766
|
||||
Probability of getting at least one head is 0.999
|
||||
Probability of getting 0 or 1 heads is 0.01074
|
||||
Probability of getting 0 or 1 (<= 1) heads is 0.01074
|
||||
Probability of getting 9 or 10 heads is 0.01074
|
||||
Probability of getting 9 or 10 heads is 0.01074
|
||||
Probability of getting 9 or 10 heads is 0.01074
|
||||
Probability of between 4 and 6 heads (4 or 5 or 6) is 0.6562
|
||||
Probability of between 4 and 6 heads (4 or 5 or 6) is 0.6563
|
||||
Probability of between 3 and 7 heads (3, 4, 5, 6 or 7) is 0.8906
|
||||
|
||||
Probability of getting exactly (==) heads
|
||||
0 0.0009766 or 1 in 1024, or 0.09766%
|
||||
1 0.009766 or 1 in 102.4, or 0.9766%
|
||||
2 0.04395 or 1 in 22.76, or 4.395%
|
||||
3 0.1172 or 1 in 8.533, or 11.72%
|
||||
4 0.2051 or 1 in 4.876, or 20.51%
|
||||
5 0.2461 or 1 in 4.063, or 24.61%
|
||||
6 0.2051 or 1 in 4.876, or 20.51%
|
||||
7 0.1172 or 1 in 8.533, or 11.72%
|
||||
8 0.04395 or 1 in 22.76, or 4.395%
|
||||
9 0.009766 or 1 in 102.4, or 0.9766%
|
||||
10 0.0009766 or 1 in 1024, or 0.09766%
|
||||
|
||||
Probability of getting upto (<=) heads
|
||||
0 0.0009766 or 1 in 1024, or 0.09766%
|
||||
1 0.01074 or 1 in 93.09, or 1.074%
|
||||
2 0.05469 or 1 in 18.29, or 5.469%
|
||||
3 0.1719 or 1 in 5.818, or 17.19%
|
||||
4 0.377 or 1 in 2.653, or 37.7%
|
||||
5 0.623 or 1 in 1.605, or 62.3%
|
||||
6 0.8281 or 1 in 1.208, or 82.81%
|
||||
7 0.9453 or 1 in 1.058, or 94.53%
|
||||
8 0.9893 or 1 in 1.011, or 98.93%
|
||||
9 0.999 or 1 in 1.001, or 99.9%
|
||||
10 1 or 1 in 1, or 100%
|
||||
</pre>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../binom_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="binomial_quiz_example.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,458 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Binomial Quiz Example</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../binom_eg.html" title="Binomial Distribution Examples">
|
||||
<link rel="prev" href="binomial_coinflip_example.html" title="Binomial Coin-Flipping Example">
|
||||
<link rel="next" href="binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for a Binomial 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="binomial_coinflip_example.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="binom_conf.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example"></a><a class="link" href="binomial_quiz_example.html" title="Binomial Quiz Example">Binomial
|
||||
Quiz Example</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
A multiple choice test has four possible answers to each of 16 questions.
|
||||
A student guesses the answer to each question, so the probability of
|
||||
getting a correct answer on any given question is one in four, a quarter,
|
||||
1/4, 25% or fraction 0.25. The conditions of the binomial experiment
|
||||
are assumed to be met: n = 16 questions constitute the trials; each question
|
||||
results in one of two possible outcomes (correct or incorrect); the probability
|
||||
of being correct is 0.25 and is constant if no knowledge about the subject
|
||||
is assumed; the questions are answered independently if the student's
|
||||
answer to a question in no way influences his/her answer to another question.
|
||||
</p>
|
||||
<p>
|
||||
First, we need to be able to use the binomial distribution constructor
|
||||
(and some std input/output, of course).
|
||||
</p>
|
||||
<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">binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">binomial</span><span class="special">;</span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</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> <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">fixed</span><span class="special">;</span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</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> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">exception</span><span class="special">></span>
|
||||
</pre>
|
||||
<p>
|
||||
The number of correct answers, X, is distributed as a binomial random
|
||||
variable with binomial distribution parameters: questions n and success
|
||||
fraction probability p. So we construct a binomial distribution:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">questions</span> <span class="special">=</span> <span class="number">16</span><span class="special">;</span> <span class="comment">// All the questions in the quiz.</span>
|
||||
<span class="keyword">int</span> <span class="identifier">answers</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> <span class="comment">// Possible answers to each question.</span>
|
||||
<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="identifier">answers</span><span class="special">;</span> <span class="comment">// If a random guess, p = 1/4 = 0.25.</span>
|
||||
<span class="identifier">binomial</span> <span class="identifier">quiz</span><span class="special">(</span><span class="identifier">questions</span><span class="special">,</span> <span class="identifier">success_fraction</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
and display the distribution parameters we used thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"In a quiz with "</span> <span class="special"><<</span> <span class="identifier">quiz</span><span class="special">.</span><span class="identifier">trials</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" questions and with a probability of guessing right of "</span>
|
||||
<span class="special"><<</span> <span class="identifier">quiz</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">()</span> <span class="special">*</span> <span class="number">100</span> <span class="special"><<</span> <span class="string">" %"</span>
|
||||
<span class="special"><<</span> <span class="string">" or 1 in "</span> <span class="special"><<</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="number">1.</span> <span class="special">/</span> <span class="identifier">quiz</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>
|
||||
</pre>
|
||||
<p>
|
||||
Show a few probabilities of just guessing:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting none right is "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</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.010023</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting exactly one right is "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</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="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting exactly two right is "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">int</span> <span class="identifier">pass_score</span> <span class="special">=</span> <span class="number">11</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting exactly "</span> <span class="special"><<</span> <span class="identifier">pass_score</span> <span class="special"><<</span> <span class="string">" answers right by chance is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">pass_score</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting all "</span> <span class="special"><<</span> <span class="identifier">questions</span> <span class="special"><<</span> <span class="string">" answers right by chance is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">questions</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting none right is 0.0100226
|
||||
Probability of getting exactly one right is 0.0534538
|
||||
Probability of getting exactly two right is 0.133635
|
||||
Probability of getting exactly 11 right is 0.000247132
|
||||
Probability of getting exactly all 16 answers right by chance is 2.32831e-010
|
||||
</pre>
|
||||
<p>
|
||||
These don't give any encouragement to guessers!
|
||||
</p>
|
||||
<p>
|
||||
We can tabulate the 'getting exactly right' ( == ) probabilities thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n"</span> <span class="string">"Guessed Probability"</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">successes</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">successes</span> <span class="special"><=</span> <span class="identifier">questions</span><span class="special">;</span> <span class="identifier">successes</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">double</span> <span class="identifier">probability</span> <span class="special">=</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">successes</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">probability</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Guessed Probability
|
||||
0 0.0100226
|
||||
1 0.0534538
|
||||
2 0.133635
|
||||
3 0.207876
|
||||
4 0.225199
|
||||
5 0.180159
|
||||
6 0.110097
|
||||
7 0.0524273
|
||||
8 0.0196602
|
||||
9 0.00582526
|
||||
10 0.00135923
|
||||
11 0.000247132
|
||||
12 3.43239e-005
|
||||
13 3.5204e-006
|
||||
14 2.51457e-007
|
||||
15 1.11759e-008
|
||||
16 2.32831e-010
|
||||
</pre>
|
||||
<p>
|
||||
Then we can add the probabilities of some 'exactly right' like this:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting none or one right is "</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</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">quiz</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>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting none or one right is 0.0634764
|
||||
</pre>
|
||||
<p>
|
||||
But if more than a couple of scores are involved, it is more convenient
|
||||
(and may be more accurate) to use the Cumulative Distribution Function
|
||||
(cdf) instead:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting none or one right is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</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>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting none or one right is 0.0634764
|
||||
</pre>
|
||||
<p>
|
||||
Since the cdf is inclusive, we can get the probability of getting up
|
||||
to 10 right ( <= )
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting <= 10 right (to fail) is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting <= 10 right (to fail) is 0.999715
|
||||
</pre>
|
||||
<p>
|
||||
To get the probability of getting 11 or more right (to pass), it is tempting
|
||||
to use
|
||||
</p>
|
||||
<pre class="programlisting"><span class="number">1</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">10</span><span class="special">)</span></pre>
|
||||
<p>
|
||||
to get the probability of > 10
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting > 10 right (to pass) is "</span> <span class="special"><<</span> <span class="number">1</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting > 10 right (to pass) is 0.000285239
|
||||
</pre>
|
||||
<p>
|
||||
But this should be resisted in favor of using the <a class="link" href="../../overview/complements.html" title="Complements are supported too - and when to use them">complements</a>
|
||||
function (see <a class="link" href="../../overview/complements.html#why_complements">why complements?</a>).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting > 10 right (to pass) is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">10</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting > 10 right (to pass) is 0.000285239
|
||||
</pre>
|
||||
<p>
|
||||
And we can check that these two, <= 10 and > 10, add up to unity.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">BOOST_ASSERT</span><span class="special">((</span><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">10</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">10</span><span class="special">)))</span> <span class="special">==</span> <span class="number">1.</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
If we want a < rather than a <= test, because the CDF is inclusive,
|
||||
we must subtract one from the score.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting less than "</span> <span class="special"><<</span> <span class="identifier">pass_score</span>
|
||||
<span class="special"><<</span> <span class="string">" (< "</span> <span class="special"><<</span> <span class="identifier">pass_score</span> <span class="special"><<</span> <span class="string">") answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">pass_score</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>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting less than 11 (< 11) answers right by guessing is 0.999715
|
||||
</pre>
|
||||
<p>
|
||||
and similarly to get a >= rather than a > test we also need to
|
||||
subtract one from the score (and can again check the sum is unity). This
|
||||
is because if the cdf is <span class="emphasis"><em>inclusive</em></span>, then its complement
|
||||
must be <span class="emphasis"><em>exclusive</em></span> otherwise there would be one possible
|
||||
outcome counted twice!
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting at least "</span> <span class="special"><<</span> <span class="identifier">pass_score</span>
|
||||
<span class="special"><<</span> <span class="string">"(>= "</span> <span class="special"><<</span> <span class="identifier">pass_score</span> <span class="special"><<</span> <span class="string">") answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">pass_score</span><span class="special">-</span><span class="number">1</span><span class="special">))</span>
|
||||
<span class="special"><<</span> <span class="string">", only 1 in "</span> <span class="special"><<</span> <span class="number">1</span><span class="special">/</span><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">pass_score</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="identifier">BOOST_ASSERT</span><span class="special">((</span><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">pass_score</span> <span class="special">-</span><span class="number">1</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">pass_score</span><span class="special">-</span><span class="number">1</span><span class="special">)))</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting at least 11 (>= 11) answers right by guessing is 0.000285239, only 1 in 3505.83
|
||||
</pre>
|
||||
<p>
|
||||
Finally we can tabulate some probabilities:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n"</span> <span class="string">"At most (<=)"</span><span class="string">"\n"</span><span class="string">"Guessed OK Probability"</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">score</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">score</span> <span class="special"><=</span> <span class="identifier">questions</span><span class="special">;</span> <span class="identifier">score</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">score</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">10</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">score</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">At most (<=)
|
||||
Guessed OK Probability
|
||||
0 0.01002259576
|
||||
1 0.0634764398
|
||||
2 0.1971110499
|
||||
3 0.4049871101
|
||||
4 0.6301861752
|
||||
5 0.8103454274
|
||||
6 0.9204427481
|
||||
7 0.9728700437
|
||||
8 0.9925302796
|
||||
9 0.9983555346
|
||||
10 0.9997147608
|
||||
11 0.9999618928
|
||||
12 0.9999962167
|
||||
13 0.9999997371
|
||||
14 0.9999999886
|
||||
15 0.9999999998
|
||||
16 1
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n"</span> <span class="string">"At least (>)"</span><span class="string">"\n"</span><span class="string">"Guessed OK Probability"</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">score</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">score</span> <span class="special"><=</span> <span class="identifier">questions</span><span class="special">;</span> <span class="identifier">score</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">score</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">10</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">score</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<pre class="programlisting">At least (>)
|
||||
Guessed OK Probability
|
||||
0 0.9899774042
|
||||
1 0.9365235602
|
||||
2 0.8028889501
|
||||
3 0.5950128899
|
||||
4 0.3698138248
|
||||
5 0.1896545726
|
||||
6 0.07955725188
|
||||
7 0.02712995629
|
||||
8 0.00746972044
|
||||
9 0.001644465374
|
||||
10 0.0002852391917
|
||||
11 3.810715862e-005
|
||||
12 3.783265129e-006
|
||||
13 2.628657967e-007
|
||||
14 1.140870154e-008
|
||||
15 2.328306437e-010
|
||||
16 0
|
||||
</pre>
|
||||
<p>
|
||||
We now consider the probabilities of <span class="bold"><strong>ranges</strong></span>
|
||||
of correct guesses.
|
||||
</p>
|
||||
<p>
|
||||
First, calculate the probability of getting a range of guesses right,
|
||||
by adding the exact probabilities of each from low ... high.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">low</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> <span class="comment">// Getting at least 3 right.</span>
|
||||
<span class="keyword">int</span> <span class="identifier">high</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span> <span class="comment">// Getting as most 5 right.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sum</span> <span class="special">=</span> <span class="number">0.</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">low</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><=</span> <span class="identifier">high</span><span class="special">;</span> <span class="identifier">i</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">i</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">4</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting between "</span>
|
||||
<span class="special"><<</span> <span class="identifier">low</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">high</span> <span class="special"><<</span> <span class="string">" answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">sum</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0.61323</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting between 3 and 5 answers right by guessing is 0.6132
|
||||
</pre>
|
||||
<p>
|
||||
Or, usually better, we can use the difference of cdfs instead:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting between "</span> <span class="special"><<</span> <span class="identifier">low</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">high</span> <span class="special"><<</span> <span class="string">" answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">high</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">low</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.61323</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting between 3 and 5 answers right by guessing is 0.6132
|
||||
</pre>
|
||||
<p>
|
||||
And we can also try a few more combinations of high and low choices:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">low</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">high</span> <span class="special">=</span> <span class="number">6</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting between "</span> <span class="special"><<</span> <span class="identifier">low</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">high</span> <span class="special"><<</span> <span class="string">" answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">high</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">low</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">// 1 and 6 P= 0.91042</span>
|
||||
<span class="identifier">low</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">high</span> <span class="special">=</span> <span class="number">8</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting between "</span> <span class="special"><<</span> <span class="identifier">low</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">high</span> <span class="special"><<</span> <span class="string">" answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">high</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">low</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">// 1 <= x 8 P = 0.9825</span>
|
||||
<span class="identifier">low</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> <span class="identifier">high</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of getting between "</span> <span class="special"><<</span> <span class="identifier">low</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">high</span> <span class="special"><<</span> <span class="string">" answers right by guessing is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">high</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="identifier">low</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">// 4 <= x 4 P = 0.22520</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of getting between 1 and 6 answers right by guessing is 0.9104
|
||||
Probability of getting between 1 and 8 answers right by guessing is 0.9825
|
||||
Probability of getting between 4 and 4 answers right by guessing is 0.2252
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example.using_binomial_distribution_mome"></a></span><a class="link" href="binomial_quiz_example.html#math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example.using_binomial_distribution_mome">Using
|
||||
Binomial distribution moments</a>
|
||||
</h5>
|
||||
<p>
|
||||
Using moments of the distribution, we can say more about the spread of
|
||||
results from guessing.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"By guessing, on average, one can expect to get "</span> <span class="special"><<</span> <span class="identifier">mean</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" correct answers."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard deviation is "</span> <span class="special"><<</span> <span class="identifier">standard_deviation</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"So about 2/3 will lie within 1 standard deviation and get between "</span>
|
||||
<span class="special"><<</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">mean</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">standard_deviation</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" and "</span>
|
||||
<span class="special"><<</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">mean</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">standard_deviation</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" correct."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Mode (the most frequent) is "</span> <span class="special"><<</span> <span class="identifier">mode</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Skewness is "</span> <span class="special"><<</span> <span class="identifier">skewness</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">By guessing, on average, one can expect to get 4 correct answers.
|
||||
Standard deviation is 1.732
|
||||
So about 2/3 will lie within 1 standard deviation and get between 3 and 5 correct.
|
||||
Mode (the most frequent) is 4
|
||||
Skewness is 0.2887
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example.h1"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example.quantiles"></a></span><a class="link" href="binomial_quiz_example.html#math_toolkit.stat_tut.weg.binom_eg.binomial_quiz_example.quantiles">Quantiles</a>
|
||||
</h5>
|
||||
<p>
|
||||
The quantiles (percentiles or percentage points) for a few probability
|
||||
levels:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quartiles "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.25</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz</span><span class="special">,</span> <span class="number">0.25</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Quartiles</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"1 standard deviation "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.33</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</span>
|
||||
<span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.67</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 1 sd</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Deciles "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.1</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz</span><span class="special">,</span> <span class="number">0.1</span><span class="special">))<<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Deciles</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"5 to 95% "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.05</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz</span><span class="special">,</span> <span class="number">0.05</span><span class="special">))<<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 5 to 95%</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"2.5 to 97.5% "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.025</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz</span><span class="special">,</span> <span class="number">0.025</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2.5 to 97.5%</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"2 to 98% "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.02</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz</span><span class="special">,</span> <span class="number">0.02</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2 to 98%</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If guessing then percentiles 1 to 99% will get "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.01</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">" to "</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">quiz</span><span class="special">,</span> <span class="number">0.01</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" right."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Notice that these output integral values because the default policy is
|
||||
<code class="computeroutput"><span class="identifier">integer_round_outwards</span></code>.
|
||||
</p>
|
||||
<pre class="programlisting">Quartiles 2 to 5
|
||||
1 standard deviation 2 to 5
|
||||
Deciles 1 to 6
|
||||
5 to 95% 0 to 7
|
||||
2.5 to 97.5% 0 to 8
|
||||
2 to 98% 0 to 8
|
||||
</pre>
|
||||
<p>
|
||||
Quantiles values are controlled by the <a class="link" href="../../../pol_tutorial/understand_dis_quant.html" title="Understanding Quantiles of Discrete Distributions">understanding
|
||||
discrete quantiles</a> quantile policy chosen. The default is <code class="computeroutput"><span class="identifier">integer_round_outwards</span></code>, so the lower
|
||||
quantile is rounded down, and the upper quantile is rounded up.
|
||||
</p>
|
||||
<p>
|
||||
But we might believe that the real values tell us a little more - see
|
||||
<a class="link" href="../../../pol_ref/discrete_quant_ref.html" title="Discrete Quantile Policies">discrete functions</a>.
|
||||
</p>
|
||||
<p>
|
||||
We could control the policy for <span class="bold"><strong>all</strong></span>
|
||||
distributions by
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DISCRETE_QUANTILE_POLICY</span> <span class="identifier">real</span>
|
||||
|
||||
<span class="identifier">at</span> <span class="identifier">the</span> <span class="identifier">head</span> <span class="identifier">of</span> <span class="identifier">the</span> <span class="identifier">program</span> <span class="identifier">would</span> <span class="identifier">make</span> <span class="keyword">this</span> <span class="identifier">policy</span> <span class="identifier">apply</span>
|
||||
</pre>
|
||||
<p>
|
||||
to this <span class="bold"><strong>one, and only</strong></span>, translation unit.
|
||||
</p>
|
||||
<p>
|
||||
Or we can now create a (typedef for) policy that has discrete quantiles
|
||||
real (here avoiding any 'using namespaces ...' statements):
|
||||
</p>
|
||||
<pre class="programlisting"><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">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">discrete_quantile</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">real</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">integer_round_outwards</span><span class="special">;</span> <span class="comment">// Default.</span>
|
||||
<span class="keyword">typedef</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="identifier">discrete_quantile</span><span class="special"><</span><span class="identifier">real</span><span class="special">></span> <span class="special">></span> <span class="identifier">real_quantile_policy</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Add a custom binomial distribution called
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">real_quantile_binomial</span></pre>
|
||||
<p>
|
||||
that uses
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">real_quantile_policy</span></pre>
|
||||
<pre class="programlisting"><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">binomial_distribution</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">real_quantile_policy</span><span class="special">></span> <span class="identifier">real_quantile_binomial</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Construct an object of this custom distribution:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">real_quantile_binomial</span> <span class="identifier">quiz_real</span><span class="special">(</span><span class="identifier">questions</span><span class="special">,</span> <span class="identifier">success_fraction</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
And use this to show some quantiles - that now have real rather than
|
||||
integer values.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quartiles "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz</span><span class="special">,</span> <span class="number">0.25</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz_real</span><span class="special">,</span> <span class="number">0.25</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Quartiles 2 to 4.6212</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"1 standard deviation "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.33</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</span>
|
||||
<span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.67</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 1 sd 2.6654 4.194</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Deciles "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.1</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz_real</span><span class="special">,</span> <span class="number">0.1</span><span class="special">))<<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Deciles 1.3487 5.7583</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"5 to 95% "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.05</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz_real</span><span class="special">,</span> <span class="number">0.05</span><span class="special">))<<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 5 to 95% 0.83739 6.4559</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"2.5 to 97.5% "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.025</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz_real</span><span class="special">,</span> <span class="number">0.025</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2.5 to 97.5% 0.42806 7.0688</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"2 to 98% "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.02</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" to "</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">quiz_real</span><span class="special">,</span> <span class="number">0.02</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 2 to 98% 0.31311 7.7880</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If guessing, then percentiles 1 to 99% will get "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">quiz_real</span><span class="special">,</span> <span class="number">0.01</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">" to "</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">quiz_real</span><span class="special">,</span> <span class="number">0.01</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" right."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Real Quantiles
|
||||
Quartiles 2 to 4.621
|
||||
1 standard deviation 2.665 to 4.194
|
||||
Deciles 1.349 to 5.758
|
||||
5 to 95% 0.8374 to 6.456
|
||||
2.5 to 97.5% 0.4281 to 7.069
|
||||
2 to 98% 0.3131 to 7.252
|
||||
If guessing then percentiles 1 to 99% will get 0 to 7.788 right.
|
||||
</pre>
|
||||
<p>
|
||||
See <a href="../../../../../../example/binomial_quiz_example.cpp" target="_top">binomial_quiz_example.cpp</a>
|
||||
for full source code and output.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="binomial_coinflip_example.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../binom_eg.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="binom_conf.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,58 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Using the Distributions from Within C#</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="nag_library.html" title="Comparison with C, R, FORTRAN-style Free Functions">
|
||||
<link rel="next" href="../variates.html" title="Random Variates and Distribution Parameters">
|
||||
</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="nag_library.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="../variates.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.c_sharp"></a><a class="link" href="c_sharp.html" title="Using the Distributions from Within C#">Using the Distributions
|
||||
from Within C#</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
The distributions in this library can be used from the C# programming language
|
||||
when they are built using Microsoft's Common Language Runtime (CLR) option.
|
||||
</p>
|
||||
<p>
|
||||
An example of this kind of usage is given in the <a href="../../../../distexplorer/html/index.html" target="_top">Distribution
|
||||
Explorer</a> example. See <code class="literal">boost-root/libs/math/dot_net_example</code>
|
||||
for the source code: the application consists of a C++ .dll that contains
|
||||
the actual distributions, and a C# GUI that allows you to explore their
|
||||
properties.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="nag_library.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="../variates.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,55 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Chi Squared Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="st_eg/paired_st.html" title="Comparing two paired samples with the Student's t distribution">
|
||||
<link rel="next" href="cs_eg/chi_sq_intervals.html" title="Confidence Intervals on the Standard Deviation">
|
||||
</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="st_eg/paired_st.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="cs_eg/chi_sq_intervals.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.cs_eg"></a><a class="link" href="cs_eg.html" title="Chi Squared Distribution Examples">Chi Squared Distribution
|
||||
Examples</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc">
|
||||
<dt><span class="section"><a href="cs_eg/chi_sq_intervals.html">Confidence
|
||||
Intervals on the Standard Deviation</a></span></dt>
|
||||
<dt><span class="section"><a href="cs_eg/chi_sq_test.html">Chi-Square
|
||||
Test for the Standard Deviation</a></span></dt>
|
||||
<dt><span class="section"><a href="cs_eg/chi_sq_size.html">Estimating
|
||||
the Required Sample Sizes for a Chi-Square Test for the Standard Deviation</a></span></dt>
|
||||
</dl></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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="st_eg/paired_st.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="cs_eg/chi_sq_intervals.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,236 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Confidence Intervals on the Standard Deviation</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../cs_eg.html" title="Chi Squared Distribution Examples">
|
||||
<link rel="prev" href="../cs_eg.html" title="Chi Squared Distribution Examples">
|
||||
<link rel="next" href="chi_sq_test.html" title="Chi-Square Test for the Standard Deviation">
|
||||
</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="../cs_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cs_eg.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="chi_sq_test.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.cs_eg.chi_sq_intervals"></a><a class="link" href="chi_sq_intervals.html" title="Confidence Intervals on the Standard Deviation">Confidence
|
||||
Intervals on the Standard Deviation</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Once you have calculated the standard deviation for your data, a legitimate
|
||||
question to ask is "How reliable is the calculated standard deviation?".
|
||||
For this situation the Chi Squared distribution can be used to calculate
|
||||
confidence intervals for the standard deviation.
|
||||
</p>
|
||||
<p>
|
||||
The full example code & sample output is in <a href="../../../../../../example/chi_square_std_dev_test.cpp" target="_top">chi_square_std_dev_test.cpp</a>.
|
||||
</p>
|
||||
<p>
|
||||
We'll begin by defining the procedure that will calculate and print out
|
||||
the confidence intervals:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">confidence_limits_on_std_deviation</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sd</span><span class="special">,</span> <span class="comment">// Sample Standard Deviation</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">N</span><span class="special">)</span> <span class="comment">// Sample size</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
We'll begin by printing out some general information:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"________________________________________________\n"</span>
|
||||
<span class="string">"2-Sided Confidence Limits For Standard Deviation\n"</span>
|
||||
<span class="string">"________________________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">7</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of Observations"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">N</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">Sd</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
and then define a table of significance levels for which we'll calculate
|
||||
intervals:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
The distribution we'll need to calculate the confidence intervals is
|
||||
a Chi Squared distribution, with N-1 degrees of freedom:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">chi_squared</span> <span class="identifier">dist</span><span class="special">(</span><span class="identifier">N</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
For each value of alpha, the formula for the confidence interval is given
|
||||
by:
|
||||
</p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../../../../../equations/chi_squ_tut1.svg"></span>
|
||||
</p>
|
||||
<p>
|
||||
Where <span class="inlinemediaobject"><img src="../../../../../equations/chi_squ_tut2.svg"></span> is the upper critical value, and <span class="inlinemediaobject"><img src="../../../../../equations/chi_squ_tut3.svg"></span> is
|
||||
the lower critical value of the Chi Squared distribution.
|
||||
</p>
|
||||
<p>
|
||||
In code we begin by printing out a table header:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n\n"</span>
|
||||
<span class="string">"_____________________________________________\n"</span>
|
||||
<span class="string">"Confidence Lower Upper\n"</span>
|
||||
<span class="string">" Value (%) Limit Limit\n"</span>
|
||||
<span class="string">"_____________________________________________\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
and then loop over the values of alpha and calculate the intervals for
|
||||
each: remember that the lower critical value is the same as the quantile,
|
||||
and the upper critical value is the same as the quantile from the complement
|
||||
of the probability:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// Confidence value:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="comment">// Calculate limits:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">lower_limit</span> <span class="special">=</span> <span class="identifier">sqrt</span><span class="special">((</span><span class="identifier">N</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">Sd</span> <span class="special">*</span> <span class="identifier">Sd</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">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">/</span> <span class="number">2</span><span class="special">)));</span>
|
||||
<span class="keyword">double</span> <span class="identifier">upper_limit</span> <span class="special">=</span> <span class="identifier">sqrt</span><span class="special">((</span><span class="identifier">N</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">Sd</span> <span class="special">*</span> <span class="identifier">Sd</span> <span class="special">/</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">/</span> <span class="number">2</span><span class="special">));</span>
|
||||
<span class="comment">// Print Limits:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">lower_limit</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">upper_limit</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
To see some example output we'll use the <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3581.htm" target="_top">gear
|
||||
data</a> from the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>. The data represents measurements
|
||||
of gear diameter from a manufacturing process.
|
||||
</p>
|
||||
<pre class="programlisting">________________________________________________
|
||||
2-Sided Confidence Limits For Standard Deviation
|
||||
________________________________________________
|
||||
|
||||
Number of Observations = 100
|
||||
Standard Deviation = 0.006278908
|
||||
|
||||
|
||||
_____________________________________________
|
||||
Confidence Lower Upper
|
||||
Value (%) Limit Limit
|
||||
_____________________________________________
|
||||
50.000 0.00601 0.00662
|
||||
75.000 0.00582 0.00685
|
||||
90.000 0.00563 0.00712
|
||||
95.000 0.00551 0.00729
|
||||
99.000 0.00530 0.00766
|
||||
99.900 0.00507 0.00812
|
||||
99.990 0.00489 0.00855
|
||||
99.999 0.00474 0.00895
|
||||
</pre>
|
||||
<p>
|
||||
So at the 95% confidence level we conclude that the standard deviation
|
||||
is between 0.00551 and 0.00729.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.cs_eg.chi_sq_intervals.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.cs_eg.chi_sq_intervals.confidence_intervals_as_a_functi"></a></span><a class="link" href="chi_sq_intervals.html#math_toolkit.stat_tut.weg.cs_eg.chi_sq_intervals.confidence_intervals_as_a_functi">Confidence
|
||||
intervals as a function of the number of observations</a>
|
||||
</h5>
|
||||
<p>
|
||||
Similarly, we can also list the confidence intervals for the standard
|
||||
deviation for the common confidence levels 95%, for increasing numbers
|
||||
of observations.
|
||||
</p>
|
||||
<p>
|
||||
The standard deviation used to compute these values is unity, so the
|
||||
limits listed are <span class="bold"><strong>multipliers</strong></span> for any
|
||||
particular standard deviation. For example, given a standard deviation
|
||||
of 0.0062789 as in the example above; for 100 observations the multiplier
|
||||
is 0.8780 giving the lower confidence limit of 0.8780 * 0.006728 = 0.00551.
|
||||
</p>
|
||||
<pre class="programlisting">____________________________________________________
|
||||
Confidence level (two-sided) = 0.0500000
|
||||
Standard Deviation = 1.0000000
|
||||
________________________________________
|
||||
Observations Lower Upper
|
||||
Limit Limit
|
||||
________________________________________
|
||||
2 0.4461 31.9102
|
||||
3 0.5207 6.2847
|
||||
4 0.5665 3.7285
|
||||
5 0.5991 2.8736
|
||||
6 0.6242 2.4526
|
||||
7 0.6444 2.2021
|
||||
8 0.6612 2.0353
|
||||
9 0.6755 1.9158
|
||||
10 0.6878 1.8256
|
||||
15 0.7321 1.5771
|
||||
20 0.7605 1.4606
|
||||
30 0.7964 1.3443
|
||||
40 0.8192 1.2840
|
||||
50 0.8353 1.2461
|
||||
60 0.8476 1.2197
|
||||
100 0.8780 1.1617
|
||||
120 0.8875 1.1454
|
||||
1000 0.9580 1.0459
|
||||
10000 0.9863 1.0141
|
||||
50000 0.9938 1.0062
|
||||
100000 0.9956 1.0044
|
||||
1000000 0.9986 1.0014
|
||||
</pre>
|
||||
<p>
|
||||
With just 2 observations the limits are from <span class="bold"><strong>0.445</strong></span>
|
||||
up to to <span class="bold"><strong>31.9</strong></span>, so the standard deviation
|
||||
might be about <span class="bold"><strong>half</strong></span> the observed value
|
||||
up to <span class="bold"><strong>30 times</strong></span> the observed value!
|
||||
</p>
|
||||
<p>
|
||||
Estimating a standard deviation with just a handful of values leaves
|
||||
a very great uncertainty, especially the upper limit. Note especially
|
||||
how far the upper limit is skewed from the most likely standard deviation.
|
||||
</p>
|
||||
<p>
|
||||
Even for 10 observations, normally considered a reasonable number, the
|
||||
range is still from 0.69 to 1.8, about a range of 0.7 to 2, and is still
|
||||
highly skewed with an upper limit <span class="bold"><strong>twice</strong></span>
|
||||
the median.
|
||||
</p>
|
||||
<p>
|
||||
When we have 1000 observations, the estimate of the standard deviation
|
||||
is starting to look convincing, with a range from 0.95 to 1.05 - now
|
||||
near symmetrical, but still about + or - 5%.
|
||||
</p>
|
||||
<p>
|
||||
Only when we have 10000 or more repeated observations can we start to
|
||||
be reasonably confident (provided we are sure that other factors like
|
||||
drift are not creeping in).
|
||||
</p>
|
||||
<p>
|
||||
For 10000 observations, the interval is 0.99 to 1.1 - finally a really
|
||||
convincing + or -1% confidence.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../cs_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cs_eg.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="chi_sq_test.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,182 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Estimating the Required Sample Sizes for a Chi-Square Test for the Standard Deviation</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../cs_eg.html" title="Chi Squared Distribution Examples">
|
||||
<link rel="prev" href="chi_sq_test.html" title="Chi-Square Test for the Standard Deviation">
|
||||
<link rel="next" href="../f_eg.html" title="F Distribution Examples">
|
||||
</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="chi_sq_test.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cs_eg.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="../f_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.cs_eg.chi_sq_size"></a><a class="link" href="chi_sq_size.html" title="Estimating the Required Sample Sizes for a Chi-Square Test for the Standard Deviation">Estimating
|
||||
the Required Sample Sizes for a Chi-Square Test for the Standard Deviation</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Suppose we conduct a Chi Squared test for standard deviation and the
|
||||
result is borderline, a legitimate question to ask is "How large
|
||||
would the sample size have to be in order to produce a definitive result?"
|
||||
</p>
|
||||
<p>
|
||||
The class template <a class="link" href="../../../dist_ref/dists/chi_squared_dist.html" title="Chi Squared Distribution">chi_squared_distribution</a>
|
||||
has a static method <code class="computeroutput"><span class="identifier">find_degrees_of_freedom</span></code>
|
||||
that will calculate this value for some acceptable risk of type I failure
|
||||
<span class="emphasis"><em>alpha</em></span>, type II failure <span class="emphasis"><em>beta</em></span>,
|
||||
and difference from the standard deviation <span class="emphasis"><em>diff</em></span>.
|
||||
Please note that the method used works on variance, and not standard
|
||||
deviation as is usual for the Chi Squared Test.
|
||||
</p>
|
||||
<p>
|
||||
The code for this example is located in <a href="../../../../../../example/chi_square_std_dev_test.cpp" target="_top">chi_square_std_dev_test.cpp</a>.
|
||||
</p>
|
||||
<p>
|
||||
We begin by defining a procedure to print out the sample sizes required
|
||||
for various risk levels:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">chi_squared_sample_sized</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">diff</span><span class="special">,</span> <span class="comment">// difference from variance to detect</span>
|
||||
<span class="keyword">double</span> <span class="identifier">variance</span><span class="special">)</span> <span class="comment">// true variance</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
The procedure begins by printing out the input data:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Print out general info:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"_____________________________________________________________\n"</span>
|
||||
<span class="string">"Estimated sample sizes required for various confidence levels\n"</span>
|
||||
<span class="string">"_____________________________________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"True Variance"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">variance</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Difference to detect"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">diff</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
And defines a table of significance levels for which we'll calculate
|
||||
sample sizes:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
For each value of alpha we can calculate two sample sizes: one where
|
||||
the sample variance is less than the true value by <span class="emphasis"><em>diff</em></span>
|
||||
and one where it is greater than the true value by <span class="emphasis"><em>diff</em></span>.
|
||||
Thanks to the asymmetric nature of the Chi Squared distribution these
|
||||
two values will not be the same, the difference in their calculation
|
||||
differs only in the sign of <span class="emphasis"><em>diff</em></span> that's passed to
|
||||
<code class="computeroutput"><span class="identifier">find_degrees_of_freedom</span></code>.
|
||||
Finally in this example we'll simply things, and let risk level <span class="emphasis"><em>beta</em></span>
|
||||
be the same as <span class="emphasis"><em>alpha</em></span>:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n\n"</span>
|
||||
<span class="string">"_______________________________________________________________\n"</span>
|
||||
<span class="string">"Confidence Estimated Estimated\n"</span>
|
||||
<span class="string">" Value (%) Sample Size Sample Size\n"</span>
|
||||
<span class="string">" (lower one (upper one\n"</span>
|
||||
<span class="string">" sided test) sided test)\n"</span>
|
||||
<span class="string">"_______________________________________________________________\n"</span><span class="special">;</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Now print out the data for the table rows.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// Confidence value:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="comment">// calculate df for a lower single sided test:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">df</span> <span class="special">=</span> <span class="identifier">chi_squared</span><span class="special">::</span><span class="identifier">find_degrees_of_freedom</span><span class="special">(</span>
|
||||
<span class="special">-</span><span class="identifier">diff</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">variance</span><span class="special">);</span>
|
||||
<span class="comment">// convert to sample size:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">df</span><span class="special">)</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
|
||||
<span class="comment">// Print size:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">16</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">size</span><span class="special">;</span>
|
||||
<span class="comment">// calculate df for an upper single sided test:</span>
|
||||
<span class="identifier">df</span> <span class="special">=</span> <span class="identifier">chi_squared</span><span class="special">::</span><span class="identifier">find_degrees_of_freedom</span><span class="special">(</span>
|
||||
<span class="identifier">diff</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">variance</span><span class="special">);</span>
|
||||
<span class="comment">// convert to sample size:</span>
|
||||
<span class="identifier">size</span> <span class="special">=</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">df</span><span class="special">)</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
|
||||
<span class="comment">// Print size:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">16</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">size</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
For some example output, consider the <a href="http://www.itl.nist.gov/div898/handbook/prc/section2/prc23.htm" target="_top">silicon
|
||||
wafer data</a> from the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>. In this scenario a supplier
|
||||
of 100 ohm.cm silicon wafers claims that his fabrication process can
|
||||
produce wafers with sufficient consistency so that the standard deviation
|
||||
of resistivity for the lot does not exceed 10 ohm.cm. A sample of N =
|
||||
10 wafers taken from the lot has a standard deviation of 13.97 ohm.cm,
|
||||
and the question we ask ourselves is "How large would our sample
|
||||
have to be to reliably detect this difference?".
|
||||
</p>
|
||||
<p>
|
||||
To use our procedure above, we have to convert the standard deviations
|
||||
to variance (square them), after which the program output looks like
|
||||
this:
|
||||
</p>
|
||||
<pre class="programlisting">_____________________________________________________________
|
||||
Estimated sample sizes required for various confidence levels
|
||||
_____________________________________________________________
|
||||
|
||||
True Variance = 100.00000
|
||||
Difference to detect = 95.16090
|
||||
|
||||
|
||||
_______________________________________________________________
|
||||
Confidence Estimated Estimated
|
||||
Value (%) Sample Size Sample Size
|
||||
(lower one (upper one
|
||||
sided test) sided test)
|
||||
_______________________________________________________________
|
||||
50.000 2 2
|
||||
75.000 2 10
|
||||
90.000 4 32
|
||||
95.000 5 51
|
||||
99.000 7 99
|
||||
99.900 11 174
|
||||
99.990 15 251
|
||||
99.999 20 330
|
||||
</pre>
|
||||
<p>
|
||||
In this case we are interested in a upper single sided test. So for example,
|
||||
if the maximum acceptable risk of falsely rejecting the null-hypothesis
|
||||
is 0.05 (Type I error), and the maximum acceptable risk of failing to
|
||||
reject the null-hypothesis is also 0.05 (Type II error), we estimate
|
||||
that we would need a sample size of 51.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="chi_sq_test.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cs_eg.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="../f_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,297 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Chi-Square Test for the Standard Deviation</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../cs_eg.html" title="Chi Squared Distribution Examples">
|
||||
<link rel="prev" href="chi_sq_intervals.html" title="Confidence Intervals on the Standard Deviation">
|
||||
<link rel="next" href="chi_sq_size.html" title="Estimating the Required Sample Sizes for a Chi-Square Test for the Standard Deviation">
|
||||
</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="chi_sq_intervals.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cs_eg.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="chi_sq_size.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.cs_eg.chi_sq_test"></a><a class="link" href="chi_sq_test.html" title="Chi-Square Test for the Standard Deviation">Chi-Square
|
||||
Test for the Standard Deviation</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
We use this test to determine whether the standard deviation of a sample
|
||||
differs from a specified value. Typically this occurs in process change
|
||||
situations where we wish to compare the standard deviation of a new process
|
||||
to an established one.
|
||||
</p>
|
||||
<p>
|
||||
The code for this example is contained in <a href="../../../../../../example/chi_square_std_dev_test.cpp" target="_top">chi_square_std_dev_test.cpp</a>,
|
||||
and we'll begin by defining the procedure that will print out the test
|
||||
statistics:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">chi_squared_test</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sd</span><span class="special">,</span> <span class="comment">// Sample std deviation</span>
|
||||
<span class="keyword">double</span> <span class="identifier">D</span><span class="special">,</span> <span class="comment">// True std deviation</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">N</span><span class="special">,</span> <span class="comment">// Sample size</span>
|
||||
<span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">)</span> <span class="comment">// Significance level</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
The procedure begins by printing a summary of the input data:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Print header:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"______________________________________________\n"</span>
|
||||
<span class="string">"Chi Squared test for sample standard deviation\n"</span>
|
||||
<span class="string">"______________________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of Observations"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">N</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Sample Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">Sd</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Expected True Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">D</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The test statistic (T) is simply the ratio of the sample and "true"
|
||||
standard deviations squared, multiplied by the number of degrees of freedom
|
||||
(the sample size less one):
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">t_stat</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">N</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">Sd</span> <span class="special">/</span> <span class="identifier">D</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">Sd</span> <span class="special">/</span> <span class="identifier">D</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Test Statistic"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">t_stat</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The distribution we need to use, is a Chi Squared distribution with N-1
|
||||
degrees of freedom:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">chi_squared</span> <span class="identifier">dist</span><span class="special">(</span><span class="identifier">N</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
The various hypothesis that can be tested are summarised in the following
|
||||
table:
|
||||
</p>
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
Hypothesis
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
Test
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The null-hypothesis: there is no difference in standard deviation
|
||||
from the specified value
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if T < χ<sup>2</sup><sub>(1-alpha/2; N-1)</sub> or T > χ<sup>2</sup><sub>(alpha/2; N-1)</sub>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The alternative hypothesis: there is a difference in standard
|
||||
deviation from the specified value
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if χ<sup>2</sup><sub>(1-alpha/2; N-1)</sub> >= T >= χ<sup>2</sup><sub>(alpha/2; N-1)</sub>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The alternative hypothesis: the standard deviation is less
|
||||
than the specified value
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if χ<sup>2</sup><sub>(1-alpha; N-1)</sub> <= T
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The alternative hypothesis: the standard deviation is greater
|
||||
than the specified value
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if χ<sup>2</sup><sub>(alpha; N-1)</sub> >= T
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p>
|
||||
Where χ<sup>2</sup><sub>(alpha; N-1)</sub> is the upper critical value of the Chi Squared distribution,
|
||||
and χ<sup>2</sup><sub>(1-alpha; N-1)</sub> is the lower critical value.
|
||||
</p>
|
||||
<p>
|
||||
Recall that the lower critical value is the same as the quantile, and
|
||||
the upper critical value is the same as the quantile from the complement
|
||||
of the probability, that gives us the following code to calculate the
|
||||
critical values:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">ucv</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">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">));</span>
|
||||
<span class="keyword">double</span> <span class="identifier">ucv2</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">dist</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="keyword">double</span> <span class="identifier">lcv</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">lcv2</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">dist</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="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Upper Critical Value at alpha: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">ucv</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Upper Critical Value at alpha/2: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">ucv2</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Lower Critical Value at alpha: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">lcv</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Lower Critical Value at alpha/2: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">lcv2</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Now that we have the critical values, we can compare these to our test
|
||||
statistic, and print out the result of each hypothesis and test:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span>
|
||||
<span class="string">"Results for Alternative Hypothesis and alpha"</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">4</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">alpha</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Alternative Hypothesis Conclusion\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard Deviation != "</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">D</span> <span class="special"><<</span> <span class="string">" "</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">((</span><span class="identifier">ucv2</span> <span class="special"><</span> <span class="identifier">t_stat</span><span class="special">)</span> <span class="special">||</span> <span class="special">(</span><span class="identifier">lcv2</span> <span class="special">></span> <span class="identifier">t_stat</span><span class="special">))</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ACCEPTED\n"</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"REJECTED\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard Deviation < "</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">D</span> <span class="special"><<</span> <span class="string">" "</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">(</span><span class="identifier">lcv</span> <span class="special">></span> <span class="identifier">t_stat</span><span class="special">)</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ACCEPTED\n"</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"REJECTED\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard Deviation > "</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">D</span> <span class="special"><<</span> <span class="string">" "</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">(</span><span class="identifier">ucv</span> <span class="special"><</span> <span class="identifier">t_stat</span><span class="special">)</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ACCEPTED\n"</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"REJECTED\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
To see some example output we'll use the <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3581.htm" target="_top">gear
|
||||
data</a> from the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>. The data represents measurements
|
||||
of gear diameter from a manufacturing process. The program output is
|
||||
deliberately designed to mirror the DATAPLOT output shown in the <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda358.htm" target="_top">NIST
|
||||
Handbook Example</a>.
|
||||
</p>
|
||||
<pre class="programlisting">______________________________________________
|
||||
Chi Squared test for sample standard deviation
|
||||
______________________________________________
|
||||
|
||||
Number of Observations = 100
|
||||
Sample Standard Deviation = 0.00628
|
||||
Expected True Standard Deviation = 0.10000
|
||||
|
||||
Test Statistic = 0.39030
|
||||
CDF of test statistic: = 1.438e-099
|
||||
Upper Critical Value at alpha: = 1.232e+002
|
||||
Upper Critical Value at alpha/2: = 1.284e+002
|
||||
Lower Critical Value at alpha: = 7.705e+001
|
||||
Lower Critical Value at alpha/2: = 7.336e+001
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Standard Deviation != 0.100 ACCEPTED
|
||||
Standard Deviation < 0.100 ACCEPTED
|
||||
Standard Deviation > 0.100 REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
In this case we are testing whether the sample standard deviation is
|
||||
0.1, and the null-hypothesis is rejected, so we conclude that the standard
|
||||
deviation <span class="emphasis"><em>is not</em></span> 0.1.
|
||||
</p>
|
||||
<p>
|
||||
For an alternative example, consider the <a href="http://www.itl.nist.gov/div898/handbook/prc/section2/prc23.htm" target="_top">silicon
|
||||
wafer data</a> again from the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>. In this scenario a supplier
|
||||
of 100 ohm.cm silicon wafers claims that his fabrication process can
|
||||
produce wafers with sufficient consistency so that the standard deviation
|
||||
of resistivity for the lot does not exceed 10 ohm.cm. A sample of N =
|
||||
10 wafers taken from the lot has a standard deviation of 13.97 ohm.cm,
|
||||
and the question we ask ourselves is "Is the suppliers claim correct?".
|
||||
</p>
|
||||
<p>
|
||||
The program output now looks like this:
|
||||
</p>
|
||||
<pre class="programlisting">______________________________________________
|
||||
Chi Squared test for sample standard deviation
|
||||
______________________________________________
|
||||
|
||||
Number of Observations = 10
|
||||
Sample Standard Deviation = 13.97000
|
||||
Expected True Standard Deviation = 10.00000
|
||||
|
||||
Test Statistic = 17.56448
|
||||
CDF of test statistic: = 9.594e-001
|
||||
Upper Critical Value at alpha: = 1.692e+001
|
||||
Upper Critical Value at alpha/2: = 1.902e+001
|
||||
Lower Critical Value at alpha: = 3.325e+000
|
||||
Lower Critical Value at alpha/2: = 2.700e+000
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Standard Deviation != 10.000 REJECTED
|
||||
Standard Deviation < 10.000 REJECTED
|
||||
Standard Deviation > 10.000 ACCEPTED
|
||||
</pre>
|
||||
<p>
|
||||
In this case, our null-hypothesis is that the standard deviation of the
|
||||
sample is less than 10: this hypothesis is rejected in the analysis above,
|
||||
and so we reject the manufacturers claim.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="chi_sq_intervals.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cs_eg.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="chi_sq_size.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,333 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Distribution Construction Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="../weg.html" title="Worked Examples">
|
||||
<link rel="next" href="st_eg.html" title="Student's t Distribution Examples">
|
||||
</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="../weg.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="st_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.dist_construct_eg"></a><a class="link" href="dist_construct_eg.html" title="Distribution Construction Examples">Distribution
|
||||
Construction Examples</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
The structure of distributions is rather different from some other statistical
|
||||
libraries, for example, those written in less object-oriented language
|
||||
like FORTRAN and C: these provide a few arguments to each free function.
|
||||
</p>
|
||||
<p>
|
||||
Boost.Math library provides each distribution as a template C++ class.
|
||||
A distribution is constructed with a few arguments, and then member and
|
||||
non-member functions are used to find values of the distribution, often
|
||||
a function of a random variate.
|
||||
</p>
|
||||
<p>
|
||||
For this demonstration, first we need some includes to access the negative
|
||||
binomial distribution (and the binomial, beta and gamma distributions too).
|
||||
</p>
|
||||
<p>
|
||||
To demonstrate the use with a high precision User-defined floating-point
|
||||
type <code class="computeroutput"><span class="identifier">cpp_dec_float</span></code> we also
|
||||
need an include from Boost.Multiprecision.
|
||||
</p>
|
||||
<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">negative_binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for negative_binomial_distribution</span>
|
||||
<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_distribution</span><span class="special">;</span> <span class="comment">// default type is double.</span>
|
||||
<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>
|
||||
<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">binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for binomial_distribution.</span>
|
||||
<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">beta</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for beta_distribution.</span>
|
||||
<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">gamma</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for gamma_distribution.</span>
|
||||
<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> <span class="comment">// for normal_distribution.</span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">multiprecision</span><span class="special">/</span><span class="identifier">cpp_dec_float</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for cpp_dec_float_100</span>
|
||||
</pre>
|
||||
<p>
|
||||
Several examples of constructing distributions follow:
|
||||
</p>
|
||||
<p>
|
||||
First, a negative binomial distribution with 8 successes and a success
|
||||
fraction 0.25, 25% or 1 in 4, is constructed like this:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist0</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
But this is inconveniently long, so we might be tempted to write
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
but this might risk ambiguity with names in <code class="computeroutput"><span class="identifier">std</span>
|
||||
<span class="identifier">random</span></code> so <span class="bold"><strong>much</strong></span>
|
||||
better is explicit <code class="computeroutput"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span></code>
|
||||
statements, for example:
|
||||
</p>
|
||||
<pre class="programlisting"><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_distribution</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
and we can still reduce typing.
|
||||
</p>
|
||||
<p>
|
||||
Since the vast majority of applications use will be using <code class="computeroutput"><span class="keyword">double</span></code> precision, the template argument
|
||||
to the distribution (<code class="computeroutput"><span class="identifier">RealType</span></code>)
|
||||
defaults to type <code class="computeroutput"><span class="keyword">double</span></code>, so
|
||||
we can also write:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special"><></span> <span class="identifier">mydist9</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> <span class="comment">// Uses default `RealType = double`.</span>
|
||||
</pre>
|
||||
<p>
|
||||
But the name <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span></code>
|
||||
is still inconveniently long, so, for most distributions, a convenience
|
||||
<code class="computeroutput"><span class="keyword">typedef</span></code> is provided, for example:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">negative_binomial</span><span class="special">;</span> <span class="comment">// Reserved name of type double.</span>
|
||||
</pre>
|
||||
<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>
|
||||
This convenience typedef is <span class="bold"><strong>not provided</strong></span>
|
||||
if a clash would occur with the name of a function: currently only <code class="computeroutput"><span class="identifier">beta</span></code> and <code class="computeroutput"><span class="identifier">gamma</span></code>
|
||||
fall into this category.
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
So, after a using statement,
|
||||
</p>
|
||||
<pre class="programlisting"><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>
|
||||
</pre>
|
||||
<p>
|
||||
we have a convenient typedef to <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code>:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
Some more examples using the convenience typedef:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist10</span><span class="special">(</span><span class="number">5.</span><span class="special">,</span> <span class="number">0.4</span><span class="special">);</span> <span class="comment">// Both arguments double.</span>
|
||||
</pre>
|
||||
<p>
|
||||
And automatic conversion takes place, so you can use integers and floats:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist11</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">0.4</span><span class="special">);</span> <span class="comment">// Using provided typedef double, int and double arguments.</span>
|
||||
</pre>
|
||||
<p>
|
||||
This is probably the most common usage.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist12</span><span class="special">(</span><span class="number">5.</span><span class="special">,</span> <span class="number">0.4F</span><span class="special">);</span> <span class="comment">// Double and float arguments.</span>
|
||||
<span class="identifier">negative_binomial</span> <span class="identifier">mydist13</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Both arguments integer.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Similarly for most other distributions like the binomial.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">binomial</span> <span class="identifier">mybinomial</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> <span class="comment">// is more concise than</span>
|
||||
<span class="identifier">binomial_distribution</span><span class="special"><></span> <span class="identifier">mybinomd1</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
For cases when the typdef distribution name would clash with a math special
|
||||
function (currently only beta and gamma) the typedef is deliberately not
|
||||
provided, and the longer version of the name must be used. For example
|
||||
do not use:
|
||||
</p>
|
||||
<pre class="programlisting"><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">beta</span><span class="special">;</span>
|
||||
<span class="identifier">beta</span> <span class="identifier">mybetad0</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> <span class="comment">// Error beta is a math FUNCTION!</span>
|
||||
</pre>
|
||||
<p>
|
||||
Which produces the error messages:
|
||||
</p>
|
||||
<pre class="programlisting">error C2146: syntax error : missing ';' before identifier 'mybetad0'
|
||||
warning C4551: function call missing argument list
|
||||
error C3861: 'mybetad0': identifier not found
|
||||
</pre>
|
||||
<p>
|
||||
Instead you should use:
|
||||
</p>
|
||||
<pre class="programlisting"><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">beta_distribution</span><span class="special">;</span>
|
||||
<span class="identifier">beta_distribution</span><span class="special"><></span> <span class="identifier">mybetad1</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
or for the gamma distribution:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">gamma_distribution</span><span class="special"><></span> <span class="identifier">mygammad1</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
We can, of course, still provide the type explicitly thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Explicit double precision: both arguments are double:</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist1</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// Explicit float precision, double arguments are truncated to float:</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist2</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// Explicit float precision, integer & double arguments converted to float:</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist3</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// Explicit float precision, float arguments, so no conversion:</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist4</span><span class="special">(</span><span class="number">8.F</span><span class="special">,</span> <span class="number">0.25F</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// Explicit float precision, integer arguments promoted to float.</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist5</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// Explicit double precision:</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist6</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
|
||||
<span class="comment">// Explicit long double precision:</span>
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist7</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
And you can use your own RealType, for example, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">cpp_dec_float_50</span></code>
|
||||
(an arbitrary 50 decimal digits precision type), then we can write:
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">mydist8</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
|
||||
<span class="comment">// `integer` arguments are promoted to your RealType exactly, but</span>
|
||||
<span class="comment">// `double` argument are converted to RealType,</span>
|
||||
<span class="comment">// possibly losing precision, so don't write:</span>
|
||||
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">mydist20</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">0.23456789012345678901234567890</span><span class="special">);</span>
|
||||
<span class="comment">// to avoid truncation of second parameter to `0.2345678901234567`.</span>
|
||||
|
||||
<span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">mydist21</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="string">"0.23456789012345678901234567890"</span><span class="special">)</span> <span class="special">);</span>
|
||||
|
||||
<span class="comment">// Ensure that all potentially significant digits are shown.</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</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="identifier">cpp_dec_float_50</span><span class="special">>::</span><span class="identifier">digits10</span><span class="special">);</span>
|
||||
<span class="identifier">cpp_dec_float_50</span> <span class="identifier">x</span><span class="special">(</span><span class="string">"1.23456789012345678901234567890"</span><span class="special">);</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="identifier">x</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>
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">showing</span> <span class="number">0.00012630010495970320103876754721976419438231705359935</span>
|
||||
</pre>
|
||||
<div class="warning"><table border="0" summary="Warning">
|
||||
<tr>
|
||||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../../../doc/src/images/warning.png"></td>
|
||||
<th align="left">Warning</th>
|
||||
</tr>
|
||||
<tr><td align="left" valign="top"><p>
|
||||
When using multiprecision, it is all too easy to get accidental truncation!
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
For example, if you write
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="number">1.23456789012345678901234567890</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>
|
||||
</pre>
|
||||
<p>
|
||||
showing 0.00012630010495970318465064569310967179576805651692929, which
|
||||
is wrong at about the 17th decimal digit!
|
||||
</p>
|
||||
<p>
|
||||
This is because the value provided is truncated to a <code class="computeroutput"><span class="keyword">double</span></code>,
|
||||
effectively <code class="computeroutput"><span class="keyword">double</span> <span class="identifier">x</span>
|
||||
<span class="special">=</span> <span class="number">1.23456789012345678901234567890</span><span class="special">;</span></code>
|
||||
</p>
|
||||
<p>
|
||||
Then the now <code class="computeroutput"><span class="keyword">double</span> <span class="identifier">x</span></code>
|
||||
is passed to function <code class="computeroutput"><span class="identifier">pdf</span></code>,
|
||||
and this truncated <code class="computeroutput"><span class="keyword">double</span></code>
|
||||
value is finally promoted to <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
Another way of quietly getting the wrong answer is to write:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="number">1.23456789012345678901234567890</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>
|
||||
</pre>
|
||||
<p>
|
||||
A correct way from a multi-digit string value is
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="string">"1.23456789012345678901234567890"</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>
|
||||
</pre>
|
||||
<div class="tip"><table border="0" summary="Tip">
|
||||
<tr>
|
||||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../../doc/src/images/tip.png"></td>
|
||||
<th align="left">Tip</th>
|
||||
</tr>
|
||||
<tr><td align="left" valign="top"><p>
|
||||
Getting about 17 decimal digits followed by many zeros is often a sign
|
||||
of accidental truncation.
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.dist_construct_eg.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.dist_construct_eg.default_arguments_to_distributio"></a></span><a class="link" href="dist_construct_eg.html#math_toolkit.stat_tut.weg.dist_construct_eg.default_arguments_to_distributio">Default
|
||||
arguments to distribution constructors.</a>
|
||||
</h5>
|
||||
<p>
|
||||
Note that default constructor arguments are only provided for some distributions.
|
||||
So if you wrongly assume a default argument, you will get an error message,
|
||||
for example:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special"><></span> <span class="identifier">mydist8</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">error C2512 no appropriate default constructor available.</pre>
|
||||
<p>
|
||||
No default constructors are provided for the <code class="computeroutput"><span class="identifier">negative</span>
|
||||
<span class="identifier">binomial</span></code> distribution, because
|
||||
it is difficult to chose any sensible default values for this distribution.
|
||||
</p>
|
||||
<p>
|
||||
For other distributions, like the normal distribution, it is obviously
|
||||
very useful to provide 'standard' defaults for the mean (zero) and standard
|
||||
deviation (unity) thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal_distribution</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">mean</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">sd</span> <span class="special">=</span> <span class="number">1</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
So in this case we can write:
|
||||
</p>
|
||||
<pre class="programlisting"> <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="identifier">normal</span> <span class="identifier">norm1</span><span class="special">;</span> <span class="comment">// Standard normal distribution.</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">norm2</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> <span class="comment">// Mean = 2, std deviation = 1.</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">norm3</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span> <span class="comment">// Mean = 2, std deviation = 3.</span>
|
||||
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span> <span class="special">&</span><span class="identifier">ex</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ex</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>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// int main()</span>
|
||||
</pre>
|
||||
<p>
|
||||
There is no useful output from this demonstration program, of course.
|
||||
</p>
|
||||
<p>
|
||||
See <a href="../../../../../example/distribution_construction.cpp" target="_top">distribution_construction.cpp</a>
|
||||
for full source code.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../weg.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="st_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,206 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Error Handling Example</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="nccs_eg/nccs_power_eg.html" title="Tables of the power function of the chi2 test.">
|
||||
<link rel="next" href="find_eg.html" title="Find Location and Scale Examples">
|
||||
</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="nccs_eg/nccs_power_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="find_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.error_eg"></a><a class="link" href="error_eg.html" title="Error Handling Example">Error Handling
|
||||
Example</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
See <a class="link" href="../../error_handling.html" title="Error Handling">error handling documentation</a>
|
||||
for a detailed explanation of the mechanism of handling errors, including
|
||||
the common "bad" arguments to distributions and functions, and
|
||||
how to use <a class="link" href="../../../policy.html" title="Chapter 15. Policies: Controlling Precision, Error Handling etc">Policies</a> to control it.
|
||||
</p>
|
||||
<p>
|
||||
But, by default, <span class="bold"><strong>exceptions will be raised</strong></span>,
|
||||
for domain errors, pole errors, numeric overflow, and internal evaluation
|
||||
errors. To avoid the exceptions from getting thrown and instead get an
|
||||
appropriate value returned, usually a NaN (domain errors pole errors or
|
||||
internal errors), or infinity (from overflow), you need to change the policy.
|
||||
</p>
|
||||
<p>
|
||||
The following example demonstrates the effect of setting the macro BOOST_MATH_DOMAIN_ERROR_POLICY
|
||||
when an invalid argument is encountered. For the purposes of this example,
|
||||
we'll pass a negative degrees of freedom parameter to the student's t distribution.
|
||||
</p>
|
||||
<p>
|
||||
Since we know that this is a single file program we could just add:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DOMAIN_ERROR_POLICY</span> <span class="identifier">ignore_error</span>
|
||||
</pre>
|
||||
<p>
|
||||
to the top of the source file to change the default policy to one that
|
||||
simply returns a NaN when a domain error occurs. Alternatively we could
|
||||
use:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DOMAIN_ERROR_POLICY</span> <span class="identifier">errno_on_error</span>
|
||||
</pre>
|
||||
<p>
|
||||
To ensure the <code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code>
|
||||
is set when a domain error occurs as well as returning a NaN.
|
||||
</p>
|
||||
<p>
|
||||
This is safe provided the program consists of a single translation unit
|
||||
<span class="emphasis"><em>and</em></span> we place the define <span class="emphasis"><em>before</em></span>
|
||||
any #includes. Note that should we add the define after the includes then
|
||||
it will have no effect! A warning such as:
|
||||
</p>
|
||||
<pre class="programlisting">warning C4005: 'BOOST_MATH_OVERFLOW_ERROR_POLICY' : macro redefinition</pre>
|
||||
<p>
|
||||
is a certain sign that it will <span class="emphasis"><em>not</em></span> have the desired
|
||||
effect.
|
||||
</p>
|
||||
<p>
|
||||
We'll begin our sample program with the needed includes:
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DOMAIN_ERROR_POLICY</span> <span class="identifier">ignore_error</span>
|
||||
|
||||
<span class="comment">// Boost</span>
|
||||
<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">students_t</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">students_t</span><span class="special">;</span> <span class="comment">// Probability of students_t(df, t).</span>
|
||||
|
||||
<span class="comment">// std</span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">stdexcept</span><span class="special">></span>
|
||||
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cstddef</span><span class="special">></span>
|
||||
<span class="comment">// using ::errno</span>
|
||||
</pre>
|
||||
<p>
|
||||
Next we'll define the program's main() to call the student's t distribution
|
||||
with an invalid degrees of freedom parameter, the program is set up to
|
||||
handle either an exception or a NaN:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Example error handling using Student's t function. "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"BOOST_MATH_DOMAIN_ERROR_POLICY is set to: "</span>
|
||||
<span class="special"><<</span> <span class="identifier">BOOST_STRINGIZE</span><span class="special">(</span><span class="identifier">BOOST_MATH_DOMAIN_ERROR_POLICY</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">degrees_of_freedom</span> <span class="special">=</span> <span class="special">-</span><span class="number">1</span><span class="special">;</span> <span class="comment">// A bad argument!</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t</span> <span class="special">=</span> <span class="number">10</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Clear/reset.</span>
|
||||
<span class="identifier">students_t</span> <span class="identifier">dist</span><span class="special">(</span><span class="identifier">degrees_of_freedom</span><span class="special">);</span> <span class="comment">// exception is thrown here if enabled.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="comment">// Test for error reported by other means:</span>
|
||||
<span class="keyword">if</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">isnan</span><span class="special">)(</span><span class="identifier">p</span><span class="special">))</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"cdf returned a NaN!"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">errno</span> <span class="special">!=</span> <span class="number">0</span><span class="special">)</span>
|
||||
<span class="special">{</span> <span class="comment">// So errno has been set.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno is set to: "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of Student's t is "</span> <span class="special"><<</span> <span class="identifier">p</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<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>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"\n"</span><span class="string">"Message 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>
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// int main()</span>
|
||||
</pre>
|
||||
<p>
|
||||
Here's what the program output looks like with a default build (one that
|
||||
<span class="bold"><strong>does throw exceptions</strong></span>):
|
||||
</p>
|
||||
<pre class="programlisting">Example error handling using Student's t function.
|
||||
BOOST_MATH_DOMAIN_ERROR_POLICY is set to: throw_on_error
|
||||
|
||||
Message from thrown exception was:
|
||||
Error in function boost::math::students_t_distribution<double>::students_t_distribution:
|
||||
Degrees of freedom argument is -1, but must be > 0 !
|
||||
</pre>
|
||||
<p>
|
||||
Alternatively let's build with:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DOMAIN_ERROR_POLICY</span> <span class="identifier">ignore_error</span>
|
||||
</pre>
|
||||
<p>
|
||||
Now the program output is:
|
||||
</p>
|
||||
<pre class="programlisting">Example error handling using Student's t function.
|
||||
BOOST_MATH_DOMAIN_ERROR_POLICY is set to: ignore_error
|
||||
cdf returned a NaN!
|
||||
</pre>
|
||||
<p>
|
||||
And finally let's build with:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DOMAIN_ERROR_POLICY</span> <span class="identifier">errno_on_error</span>
|
||||
</pre>
|
||||
<p>
|
||||
Which gives the output show errno:
|
||||
</p>
|
||||
<pre class="programlisting">Example error handling using Student's t function.
|
||||
BOOST_MATH_DOMAIN_ERROR_POLICY is set to: errno_on_error
|
||||
cdf returned a NaN!
|
||||
errno is set to: 33
|
||||
</pre>
|
||||
<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>
|
||||
If throwing of exceptions is enabled (the default) but you do <span class="bold"><strong>not</strong></span> have try & catch block, then the program
|
||||
will terminate with an uncaught exception and probably abort.
|
||||
</p>
|
||||
<p>
|
||||
Therefore to get the benefit of helpful error messages, enabling <span class="bold"><strong>all exceptions and using try & catch</strong></span> is recommended
|
||||
for most applications.
|
||||
</p>
|
||||
<p>
|
||||
However, for simplicity, the is not done for most examples.
|
||||
</p>
|
||||
</td></tr>
|
||||
</table></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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="nccs_eg/nccs_power_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="find_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,329 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>F Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="cs_eg/chi_sq_size.html" title="Estimating the Required Sample Sizes for a Chi-Square Test for the Standard Deviation">
|
||||
<link rel="next" href="binom_eg.html" title="Binomial Distribution Examples">
|
||||
</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="cs_eg/chi_sq_size.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="binom_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.f_eg"></a><a class="link" href="f_eg.html" title="F Distribution Examples">F Distribution Examples</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
Imagine that you want to compare the standard deviations of two sample
|
||||
to determine if they differ in any significant way, in this situation you
|
||||
use the F distribution and perform an F-test. This situation commonly occurs
|
||||
when conducting a process change comparison: "is a new process more
|
||||
consistent that the old one?".
|
||||
</p>
|
||||
<p>
|
||||
In this example we'll be using the data for ceramic strength from <a href="http://www.itl.nist.gov/div898/handbook/eda/section4/eda42a1.htm" target="_top">http://www.itl.nist.gov/div898/handbook/eda/section4/eda42a1.htm</a>.
|
||||
The data for this case study were collected by Said Jahanmir of the NIST
|
||||
Ceramics Division in 1996 in connection with a NIST/industry ceramics consortium
|
||||
for strength optimization of ceramic strength.
|
||||
</p>
|
||||
<p>
|
||||
The example program is <a href="../../../../../example/f_test.cpp" target="_top">f_test.cpp</a>,
|
||||
program output has been deliberately made as similar as possible to the
|
||||
DATAPLOT output in the corresponding <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda359.htm" target="_top">NIST
|
||||
EngineeringStatistics Handbook example</a>.
|
||||
</p>
|
||||
<p>
|
||||
We'll begin by defining the procedure to conduct the test:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f_test</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd1</span><span class="special">,</span> <span class="comment">// Sample 1 std deviation</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd2</span><span class="special">,</span> <span class="comment">// Sample 2 std deviation</span>
|
||||
<span class="keyword">double</span> <span class="identifier">N1</span><span class="special">,</span> <span class="comment">// Sample 1 size</span>
|
||||
<span class="keyword">double</span> <span class="identifier">N2</span><span class="special">,</span> <span class="comment">// Sample 2 size</span>
|
||||
<span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">)</span> <span class="comment">// Significance level</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
The procedure begins by printing out a summary of our input data:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Print header:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"____________________________________\n"</span>
|
||||
<span class="string">"F test for equal standard deviations\n"</span>
|
||||
<span class="string">"____________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Sample 1:\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of Observations"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">N1</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Sample Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">sd1</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Sample 2:\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of Observations"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">N2</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Sample Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">sd2</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The test statistic for an F-test is simply the ratio of the square of the
|
||||
two standard deviations:
|
||||
</p>
|
||||
<p>
|
||||
F = s<sub>1</sub><sup>2</sup> / s<sub>2</sub><sup>2</sup>
|
||||
</p>
|
||||
<p>
|
||||
where s<sub>1</sub> is the standard deviation of the first sample and s<sub>2</sub>
|
||||
is the standard
|
||||
deviation of the second sample. Or in code:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">F</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">sd1</span> <span class="special">/</span> <span class="identifier">sd2</span><span class="special">);</span>
|
||||
<span class="identifier">F</span> <span class="special">*=</span> <span class="identifier">F</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Test Statistic"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">F</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
At this point a word of caution: the F distribution is asymmetric, so we
|
||||
have to be careful how we compute the tests, the following table summarises
|
||||
the options available:
|
||||
</p>
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
Hypothesis
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
Test
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The null-hypothesis: there is no difference in standard deviations
|
||||
(two sided test)
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if F <= F<sub>(1-alpha/2; N1-1, N2-1)</sub> or F >= F<sub>(alpha/2;
|
||||
N1-1, N2-1)</sub>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The alternative hypothesis: there is a difference in means (two
|
||||
sided test)
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if F<sub>(1-alpha/2; N1-1, N2-1)</sub> <= F <= F<sub>(alpha/2; N1-1,
|
||||
N2-1)</sub>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The alternative hypothesis: Standard deviation of sample 1 is
|
||||
greater than that of sample 2
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if F < F<sub>(alpha; N1-1, N2-1)</sub>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The alternative hypothesis: Standard deviation of sample 1 is
|
||||
less than that of sample 2
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if F > F<sub>(1-alpha; N1-1, N2-1)</sub>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p>
|
||||
Where F<sub>(1-alpha; N1-1, N2-1)</sub> is the lower critical value of the F distribution
|
||||
with degrees of freedom N1-1 and N2-1, and F<sub>(alpha; N1-1, N2-1)</sub> is the upper
|
||||
critical value of the F distribution with degrees of freedom N1-1 and N2-1.
|
||||
</p>
|
||||
<p>
|
||||
The upper and lower critical values can be computed using the quantile
|
||||
function:
|
||||
</p>
|
||||
<p>
|
||||
F<sub>(1-alpha; N1-1, N2-1)</sub> = <code class="computeroutput"><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">fisher_f</span><span class="special">(</span><span class="identifier">N1</span><span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="identifier">N2</span><span class="special">-</span><span class="number">1</span><span class="special">),</span>
|
||||
<span class="identifier">alpha</span><span class="special">)</span></code>
|
||||
</p>
|
||||
<p>
|
||||
F<sub>(alpha; N1-1, N2-1)</sub> = <code class="computeroutput"><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">fisher_f</span><span class="special">(</span><span class="identifier">N1</span><span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="identifier">N2</span><span class="special">-</span><span class="number">1</span><span class="special">),</span>
|
||||
<span class="identifier">alpha</span><span class="special">))</span></code>
|
||||
</p>
|
||||
<p>
|
||||
In our example program we need both upper and lower critical values for
|
||||
alpha and for alpha/2:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">ucv</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">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">));</span>
|
||||
<span class="keyword">double</span> <span class="identifier">ucv2</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">dist</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="keyword">double</span> <span class="identifier">lcv</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">lcv2</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">dist</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="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Upper Critical Value at alpha: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">ucv</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Upper Critical Value at alpha/2: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">ucv2</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Lower Critical Value at alpha: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">lcv</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Lower Critical Value at alpha/2: "</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="identifier">lcv2</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The final step is to perform the comparisons given above, and print out
|
||||
whether the hypothesis is rejected or not:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span>
|
||||
<span class="string">"Results for Alternative Hypothesis and alpha"</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">4</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">alpha</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Alternative Hypothesis Conclusion\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard deviations are unequal (two sided test) "</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">((</span><span class="identifier">ucv2</span> <span class="special"><</span> <span class="identifier">F</span><span class="special">)</span> <span class="special">||</span> <span class="special">(</span><span class="identifier">lcv2</span> <span class="special">></span> <span class="identifier">F</span><span class="special">))</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ACCEPTED\n"</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"REJECTED\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard deviation 1 is less than standard deviation 2 "</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">(</span><span class="identifier">lcv</span> <span class="special">></span> <span class="identifier">F</span><span class="special">)</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ACCEPTED\n"</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"REJECTED\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard deviation 1 is greater than standard deviation 2 "</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">(</span><span class="identifier">ucv</span> <span class="special"><</span> <span class="identifier">F</span><span class="special">)</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ACCEPTED\n"</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"REJECTED\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Using the ceramic strength data as an example we get the following output:
|
||||
</p>
|
||||
<pre class="programlisting">F test for equal standard deviations
|
||||
____________________________________
|
||||
|
||||
Sample 1:
|
||||
Number of Observations = 240
|
||||
Sample Standard Deviation = 65.549
|
||||
|
||||
Sample 2:
|
||||
Number of Observations = 240
|
||||
Sample Standard Deviation = 61.854
|
||||
|
||||
Test Statistic = 1.123
|
||||
|
||||
CDF of test statistic: = 8.148e-001
|
||||
Upper Critical Value at alpha: = 1.238e+000
|
||||
Upper Critical Value at alpha/2: = 1.289e+000
|
||||
Lower Critical Value at alpha: = 8.080e-001
|
||||
Lower Critical Value at alpha/2: = 7.756e-001
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Standard deviations are unequal (two sided test) REJECTED
|
||||
Standard deviation 1 is less than standard deviation 2 REJECTED
|
||||
Standard deviation 1 is greater than standard deviation 2 REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
In this case we are unable to reject the null-hypothesis, and must instead
|
||||
reject the alternative hypothesis.
|
||||
</p>
|
||||
<p>
|
||||
By contrast let's see what happens when we use some different <a href="http://www.itl.nist.gov/div898/handbook/prc/section3/prc32.htm" target="_top">sample
|
||||
data</a>:, once again from the NIST Engineering Statistics Handbook:
|
||||
A new procedure to assemble a device is introduced and tested for possible
|
||||
improvement in time of assembly. The question being addressed is whether
|
||||
the standard deviation of the new assembly process (sample 2) is better
|
||||
(i.e., smaller) than the standard deviation for the old assembly process
|
||||
(sample 1).
|
||||
</p>
|
||||
<pre class="programlisting">____________________________________
|
||||
F test for equal standard deviations
|
||||
____________________________________
|
||||
|
||||
Sample 1:
|
||||
Number of Observations = 11.00000
|
||||
Sample Standard Deviation = 4.90820
|
||||
|
||||
Sample 2:
|
||||
Number of Observations = 9.00000
|
||||
Sample Standard Deviation = 2.58740
|
||||
|
||||
Test Statistic = 3.59847
|
||||
|
||||
CDF of test statistic: = 9.589e-001
|
||||
Upper Critical Value at alpha: = 3.347e+000
|
||||
Upper Critical Value at alpha/2: = 4.295e+000
|
||||
Lower Critical Value at alpha: = 3.256e-001
|
||||
Lower Critical Value at alpha/2: = 2.594e-001
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Standard deviations are unequal (two sided test) REJECTED
|
||||
Standard deviation 1 is less than standard deviation 2 REJECTED
|
||||
Standard deviation 1 is greater than standard deviation 2 ACCEPTED
|
||||
</pre>
|
||||
<p>
|
||||
In this case we take our null hypothesis as "standard deviation 1
|
||||
is less than or equal to standard deviation 2", since this represents
|
||||
the "no change" situation. So we want to compare the upper critical
|
||||
value at <span class="emphasis"><em>alpha</em></span> (a one sided test) with the test statistic,
|
||||
and since 3.35 < 3.6 this hypothesis must be rejected. We therefore
|
||||
conclude that there is a change for the better in our standard deviation.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="cs_eg/chi_sq_size.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="binom_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,55 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Find Location and Scale Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="error_eg.html" title="Error Handling Example">
|
||||
<link rel="next" href="find_eg/find_location_eg.html" title="Find Location (Mean) Example">
|
||||
</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="error_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="find_eg/find_location_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg"></a><a class="link" href="find_eg.html" title="Find Location and Scale Examples">Find Location and
|
||||
Scale Examples</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc">
|
||||
<dt><span class="section"><a href="find_eg/find_location_eg.html">Find
|
||||
Location (Mean) Example</a></span></dt>
|
||||
<dt><span class="section"><a href="find_eg/find_scale_eg.html">Find
|
||||
Scale (Standard Deviation) Example</a></span></dt>
|
||||
<dt><span class="section"><a href="find_eg/find_mean_and_sd_eg.html">Find
|
||||
mean and standard deviation example</a></span></dt>
|
||||
</dl></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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="error_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="find_eg/find_location_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,190 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Find Location (Mean) Example</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../find_eg.html" title="Find Location and Scale Examples">
|
||||
<link rel="prev" href="../find_eg.html" title="Find Location and Scale Examples">
|
||||
<link rel="next" href="find_scale_eg.html" title="Find Scale (Standard Deviation) Example">
|
||||
</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="../find_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../find_eg.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="find_scale_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_location_eg"></a><a class="link" href="find_location_eg.html" title="Find Location (Mean) Example">Find
|
||||
Location (Mean) Example</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
First we need some includes to access the normal distribution, the algorithms
|
||||
to find location (and some std output of course).
|
||||
</p>
|
||||
<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">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for normal_distribution</span>
|
||||
<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>
|
||||
<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">cauchy</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for cauchy_distribution</span>
|
||||
<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">cauchy</span><span class="special">;</span> <span class="comment">// typedef provides default type is double.</span>
|
||||
<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">find_location</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">find_location</span><span class="special">;</span> <span class="comment">// for mean</span>
|
||||
<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">find_scale</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">find_scale</span><span class="special">;</span> <span class="comment">// for standard devation</span>
|
||||
<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">complement</span><span class="special">;</span> <span class="comment">// Needed if you want to use the complement version.</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</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> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
For this example, we will use the standard normal distribution, with
|
||||
mean (location) zero and standard deviation (scale) unity. This is also
|
||||
the default for this implementation.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">N01</span><span class="special">;</span> <span class="comment">// Default 'standard' normal distribution with zero mean and</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd</span> <span class="special">=</span> <span class="number">1.</span><span class="special">;</span> <span class="comment">// normal default standard deviation is 1.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Suppose we want to find a different normal distribution whose mean is
|
||||
shifted so that only fraction p (here 0.001 or 0.1%) are below a certain
|
||||
chosen limit (here -2, two standard deviations).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="special">-</span><span class="number">2.</span><span class="special">;</span> <span class="comment">// z to give prob p</span>
|
||||
<span class="keyword">double</span> <span class="identifier">p</span> <span class="special">=</span> <span class="number">0.001</span><span class="special">;</span> <span class="comment">// only 0.1% below z</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">location</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", standard deviation "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">scale</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", has "</span> <span class="special"><<</span> <span class="string">"fraction <= "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">N01</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">location</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", standard deviation "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">scale</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", has "</span> <span class="special"><<</span> <span class="string">"fraction > "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">N01</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Note: uses complement.</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Normal distribution with mean = 0, standard deviation 1, has fraction <= -2, p = 0.0227501
|
||||
Normal distribution with mean = 0, standard deviation 1, has fraction > -2, p = 0.97725
|
||||
</pre>
|
||||
<p>
|
||||
We can now use ''find_location'' to give a new offset mean.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"offset location (mean) = "</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
that outputs:
|
||||
</p>
|
||||
<pre class="programlisting">offset location (mean) = 1.09023
|
||||
</pre>
|
||||
<p>
|
||||
showing that we need to shift the mean just over one standard deviation
|
||||
from its previous value of zero.
|
||||
</p>
|
||||
<p>
|
||||
Then we can check that we have achieved our objective by constructing
|
||||
a new distribution with the offset mean (but same standard deviation):
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">np001pc</span><span class="special">(</span><span class="identifier">l</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">);</span> <span class="comment">// Same standard_deviation (scale) but with mean (location) shifted.</span>
|
||||
</pre>
|
||||
<p>
|
||||
And re-calculating the fraction below our chosen limit.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span>
|
||||
<span class="special"><<</span> <span class="string">" has "</span> <span class="special"><<</span> <span class="string">"fraction <= "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">np001pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span>
|
||||
<span class="special"><<</span> <span class="string">" has "</span> <span class="special"><<</span> <span class="string">"fraction > "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">np001pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Normal distribution with mean = 1.09023 has fraction <= -2, p = 0.001
|
||||
Normal distribution with mean = 1.09023 has fraction > -2, p = 0.999
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_location_eg.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.find_eg.find_location_eg.controlling_error_handling_from_"></a></span><a class="link" href="find_location_eg.html#math_toolkit.stat_tut.weg.find_eg.find_location_eg.controlling_error_handling_from_">Controlling
|
||||
Error Handling from find_location</a>
|
||||
</h5>
|
||||
<p>
|
||||
We can also control the policy for handling various errors. For example,
|
||||
we can define a new (possibly unwise) policy to ignore domain errors
|
||||
('bad' arguments).
|
||||
</p>
|
||||
<p>
|
||||
Unless we are using the boost::math namespace, we will need:
|
||||
</p>
|
||||
<pre class="programlisting"><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">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">domain_error</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">ignore_error</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Using a typedef is often convenient, especially if it is re-used, although
|
||||
it is not required, as the various examples below show.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">ignore_error</span><span class="special">></span> <span class="special">></span> <span class="identifier">ignore_domain_policy</span><span class="special">;</span>
|
||||
<span class="comment">// find_location with new policy, using typedef.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">,</span> <span class="identifier">ignore_domain_policy</span><span class="special">());</span>
|
||||
<span class="comment">// Default policy policy<>, needs "using boost::math::policies::policy;"</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">,</span> <span class="identifier">policy</span><span class="special"><>());</span>
|
||||
<span class="comment">// Default policy, fully specified.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">sd</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="comment">// A new policy, ignoring domain errors, without using a typedef.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">,</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">ignore_error</span><span class="special">></span> <span class="special">>());</span>
|
||||
</pre>
|
||||
<p>
|
||||
If we want to use a probability that is the <a class="link" href="../../overview/complements.html" title="Complements are supported too - and when to use them">complements</a>
|
||||
of our probability, we should not even think of writing <code class="computeroutput"><span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</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">sd</span><span class="special">)</span></code>, but use the complement version, see
|
||||
<a class="link" href="../../overview/complements.html#why_complements">why complements?</a>.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">z</span> <span class="special">=</span> <span class="number">2.</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">q</span> <span class="special">=</span> <span class="number">0.95</span><span class="special">;</span> <span class="comment">// = 1 - p; // complement.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">q</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">));</span>
|
||||
|
||||
<span class="identifier">normal</span> <span class="identifier">np95pc</span><span class="special">(</span><span class="identifier">l</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">);</span> <span class="comment">// Same standard_deviation (scale) but with mean(location) shifted</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="string">" has "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction <= "</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">np95pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="string">" has "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction > "</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">np95pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
See <a href="../../../../../../example/find_location_example.cpp" target="_top">find_location_example.cpp</a>
|
||||
for full source code: the program output looks like this:
|
||||
</p>
|
||||
<pre class="programlisting">Example: Find location (mean).
|
||||
Normal distribution with mean = 0, standard deviation 1, has fraction <= -2, p = 0.0227501
|
||||
Normal distribution with mean = 0, standard deviation 1, has fraction > -2, p = 0.97725
|
||||
offset location (mean) = 1.09023
|
||||
Normal distribution with mean = 1.09023 has fraction <= -2, p = 0.001
|
||||
Normal distribution with mean = 1.09023 has fraction > -2, p = 0.999
|
||||
Normal distribution with mean = 0.355146 has fraction <= 2 = 0.95
|
||||
Normal distribution with mean = 0.355146 has fraction > 2 = 0.05
|
||||
</pre>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../find_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../find_eg.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="find_scale_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,455 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Find mean and standard deviation example</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../find_eg.html" title="Find Location and Scale Examples">
|
||||
<link rel="prev" href="find_scale_eg.html" title="Find Scale (Standard Deviation) Example">
|
||||
<link rel="next" href="../nag_library.html" title="Comparison with C, R, FORTRAN-style Free Functions">
|
||||
</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="find_scale_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../find_eg.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="../nag_library.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg"></a><a class="link" href="find_mean_and_sd_eg.html" title="Find mean and standard deviation example">Find
|
||||
mean and standard deviation example</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
First we need some includes to access the normal distribution, the algorithms
|
||||
to find location and scale (and some std output of course).
|
||||
</p>
|
||||
<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">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for normal_distribution</span>
|
||||
<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>
|
||||
<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">cauchy</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for cauchy_distribution</span>
|
||||
<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">cauchy</span><span class="special">;</span> <span class="comment">// typedef provides default type is double.</span>
|
||||
<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">find_location</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">find_location</span><span class="special">;</span>
|
||||
<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">find_scale</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">find_scale</span><span class="special">;</span>
|
||||
<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">complement</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">left</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpoint</span><span class="special">;</span> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</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> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">stdexcept</span><span class="special">></span>
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.using_find_location_and_find_sca"></a></span><a class="link" href="find_mean_and_sd_eg.html#math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.using_find_location_and_find_sca">Using
|
||||
find_location and find_scale to meet dispensing and measurement specifications</a>
|
||||
</h5>
|
||||
<p>
|
||||
Consider an example from K Krishnamoorthy, Handbook of Statistical Distributions
|
||||
with Applications, ISBN 1-58488-635-8, (2006) p 126, example 10.3.7.
|
||||
</p>
|
||||
<p>
|
||||
"A machine is set to pack 3 kg of ground beef per pack. Over a long
|
||||
period of time it is found that the average packed was 3 kg with a standard
|
||||
deviation of 0.1 kg. Assume the packing is normally distributed."
|
||||
</p>
|
||||
<p>
|
||||
We start by constructing a normal distribution with the given parameters:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">mean</span> <span class="special">=</span> <span class="number">3.</span><span class="special">;</span> <span class="comment">// kg</span>
|
||||
<span class="keyword">double</span> <span class="identifier">standard_deviation</span> <span class="special">=</span> <span class="number">0.1</span><span class="special">;</span> <span class="comment">// kg</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">packs</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
We can then find the fraction (or %) of packages that weigh more than
|
||||
3.1 kg.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">max_weight</span> <span class="special">=</span> <span class="number">3.1</span><span class="special">;</span> <span class="comment">// kg</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Percentage of packs > "</span> <span class="special"><<</span> <span class="identifier">max_weight</span> <span class="special"><<</span> <span class="string">" is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">packs</span><span class="special">,</span> <span class="identifier">max_weight</span><span class="special">))</span> <span class="special">*</span> <span class="number">100.</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// P(X > 3.1)</span>
|
||||
</pre>
|
||||
<p>
|
||||
We might want to ensure that 95% of packs are over a minimum weight specification,
|
||||
then we want the value of the mean such that P(X < 2.9) = 0.05.
|
||||
</p>
|
||||
<p>
|
||||
Using the mean of 3 kg, we can estimate the fraction of packs that fail
|
||||
to meet the specification of 2.9 kg.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">minimum_weight</span> <span class="special">=</span> <span class="number">2.9</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs <= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">packs</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// fraction of packs <= 2.9 with a mean of 3 is 0.841345</span>
|
||||
</pre>
|
||||
<p>
|
||||
This is 0.84 - more than the target fraction of 0.95. If we want 95%
|
||||
to be over the minimum weight, what should we set the mean weight to
|
||||
be?
|
||||
</p>
|
||||
<p>
|
||||
Using the KK StatCalc program supplied with the book and the method given
|
||||
on page 126 gives 3.06449.
|
||||
</p>
|
||||
<p>
|
||||
We can confirm this by constructing a new distribution which we call
|
||||
'xpacks' with a safety margin mean of 3.06449 thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">over_mean</span> <span class="special">=</span> <span class="number">3.06449</span><span class="special">;</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">xpacks</span><span class="special">(</span><span class="identifier">over_mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">xpacks</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">xpacks</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// fraction of packs >= 2.9 with a mean of 3.06449 is 0.950005</span>
|
||||
</pre>
|
||||
<p>
|
||||
Using this Math Toolkit, we can calculate the required mean directly
|
||||
thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">under_fraction</span> <span class="special">=</span> <span class="number">0.05</span><span class="special">;</span> <span class="comment">// so 95% are above the minimum weight mean - sd = 2.9</span>
|
||||
<span class="keyword">double</span> <span class="identifier">low_limit</span> <span class="special">=</span> <span class="identifier">standard_deviation</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">offset</span> <span class="special">=</span> <span class="identifier">mean</span> <span class="special">-</span> <span class="identifier">low_limit</span> <span class="special">-</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">packs</span><span class="special">,</span> <span class="identifier">under_fraction</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">nominal_mean</span> <span class="special">=</span> <span class="identifier">mean</span> <span class="special">+</span> <span class="identifier">offset</span><span class="special">;</span>
|
||||
<span class="comment">// mean + (mean - low_limit - quantile(packs, under_fraction));</span>
|
||||
|
||||
<span class="identifier">normal</span> <span class="identifier">nominal_packs</span><span class="special">(</span><span class="identifier">nominal_mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Setting the packer to "</span> <span class="special"><<</span> <span class="identifier">nominal_mean</span> <span class="special"><<</span> <span class="string">" will mean that "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">nominal_packs</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Setting the packer to 3.06449 will mean that fraction of packs >= 2.9 is 0.95</span>
|
||||
</pre>
|
||||
<p>
|
||||
This calculation is generalized as the free function called <code class="computeroutput"><span class="identifier">find_location</span></code>, see <a class="link" href="../../../dist_ref/dist_algorithms.html" title="Distribution Algorithms">algorithms</a>.
|
||||
</p>
|
||||
<p>
|
||||
To use this we will need to
|
||||
</p>
|
||||
<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">find_location</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">find_location</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
and then use find_location function to find safe_mean, & construct
|
||||
a new normal distribution called 'goodpacks'.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">safe_mean</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="identifier">under_fraction</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">good_packs</span><span class="special">(</span><span class="identifier">safe_mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
with the same confirmation as before:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Setting the packer to "</span> <span class="special"><<</span> <span class="identifier">nominal_mean</span> <span class="special"><<</span> <span class="string">" will mean that "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">good_packs</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Setting the packer to 3.06449 will mean that fraction of packs >= 2.9 is 0.95</span>
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.h1"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.using_cauchy_lorentz_instead_of_"></a></span><a class="link" href="find_mean_and_sd_eg.html#math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.using_cauchy_lorentz_instead_of_">Using
|
||||
Cauchy-Lorentz instead of normal distribution</a>
|
||||
</h5>
|
||||
<p>
|
||||
After examining the weight distribution of a large number of packs, we
|
||||
might decide that, after all, the assumption of a normal distribution
|
||||
is not really justified. We might find that the fit is better to a <a class="link" href="../../../dist_ref/dists/cauchy_dist.html" title="Cauchy-Lorentz Distribution">Cauchy Distribution</a>.
|
||||
This distribution has wider 'wings', so that whereas most of the values
|
||||
are closer to the mean than the normal, there are also more values than
|
||||
'normal' that lie further from the mean than the normal.
|
||||
</p>
|
||||
<p>
|
||||
This might happen because a larger than normal lump of meat is either
|
||||
included or excluded.
|
||||
</p>
|
||||
<p>
|
||||
We first create a <a class="link" href="../../../dist_ref/dists/cauchy_dist.html" title="Cauchy-Lorentz Distribution">Cauchy
|
||||
Distribution</a> with the original mean and standard deviation, and
|
||||
estimate the fraction that lie below our minimum weight specification.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cauchy</span> <span class="identifier">cpacks</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Cauchy Setting the packer to "</span> <span class="special"><<</span> <span class="identifier">mean</span> <span class="special"><<</span> <span class="string">" will mean that "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">cpacks</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Cauchy Setting the packer to 3 will mean that fraction of packs >= 2.9 is 0.75</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that far fewer of the packs meet the specification, only 75% instead
|
||||
of 95%. Now we can repeat the find_location, using the cauchy distribution
|
||||
as template parameter, in place of the normal used above.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">lc</span> <span class="special">=</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">cauchy</span><span class="special">>(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="identifier">under_fraction</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"find_location<cauchy>(minimum_weight, over fraction, standard_deviation); "</span> <span class="special"><<</span> <span class="identifier">lc</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// find_location<cauchy>(minimum_weight, over fraction, packs.standard_deviation()); 3.53138</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that the safe_mean setting needs to be much higher, 3.53138 instead
|
||||
of 3.06449, so we will make rather less profit.
|
||||
</p>
|
||||
<p>
|
||||
And again confirm that the fraction meeting specification is as expected.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cauchy</span> <span class="identifier">goodcpacks</span><span class="special">(</span><span class="identifier">lc</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Cauchy Setting the packer to "</span> <span class="special"><<</span> <span class="identifier">lc</span> <span class="special"><<</span> <span class="string">" will mean that "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">goodcpacks</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Cauchy Setting the packer to 3.53138 will mean that fraction of packs >= 2.9 is 0.95</span>
|
||||
</pre>
|
||||
<p>
|
||||
Finally we could estimate the effect of a much tighter specification,
|
||||
that 99% of packs met the specification.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Cauchy Setting the packer to "</span>
|
||||
<span class="special"><<</span> <span class="identifier">find_location</span><span class="special"><</span><span class="identifier">cauchy</span><span class="special">>(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="number">0.99</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">" will mean that "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">goodcpacks</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Setting the packer to 3.13263 will mean that fraction of packs >=
|
||||
2.9 is 0.99, but will more than double the mean loss from 0.0644 to 0.133
|
||||
kg per pack.
|
||||
</p>
|
||||
<p>
|
||||
Of course, this calculation is not limited to packs of meat, it applies
|
||||
to dispensing anything, and it also applies to a 'virtual' material like
|
||||
any measurement.
|
||||
</p>
|
||||
<p>
|
||||
The only caveat is that the calculation assumes that the standard deviation
|
||||
(scale) is known with a reasonably low uncertainty, something that is
|
||||
not so easy to ensure in practice. And that the distribution is well
|
||||
defined, <a class="link" href="../../../dist_ref/dists/normal_dist.html" title="Normal (Gaussian) Distribution">Normal
|
||||
Distribution</a> or <a class="link" href="../../../dist_ref/dists/cauchy_dist.html" title="Cauchy-Lorentz Distribution">Cauchy
|
||||
Distribution</a>, or some other.
|
||||
</p>
|
||||
<p>
|
||||
If one is simply dispensing a very large number of packs, then it may
|
||||
be feasible to measure the weight of hundreds or thousands of packs.
|
||||
With a healthy 'degrees of freedom', the confidence intervals for the
|
||||
standard deviation are not too wide, typically about + and - 10% for
|
||||
hundreds of observations.
|
||||
</p>
|
||||
<p>
|
||||
For other applications, where it is more difficult or expensive to make
|
||||
many observations, the confidence intervals are depressingly wide.
|
||||
</p>
|
||||
<p>
|
||||
See <a class="link" href="../cs_eg/chi_sq_intervals.html" title="Confidence Intervals on the Standard Deviation">Confidence
|
||||
Intervals on the standard deviation</a> for a worked example <a href="../../../../../../example/chi_square_std_dev_test.cpp" target="_top">chi_square_std_dev_test.cpp</a>
|
||||
of estimating these intervals.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.h2"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.changing_the_scale_or_standard_d"></a></span><a class="link" href="find_mean_and_sd_eg.html#math_toolkit.stat_tut.weg.find_eg.find_mean_and_sd_eg.changing_the_scale_or_standard_d">Changing
|
||||
the scale or standard deviation</a>
|
||||
</h5>
|
||||
<p>
|
||||
Alternatively, we could invest in a better (more precise) packer (or
|
||||
measuring device) with a lower standard deviation, or scale.
|
||||
</p>
|
||||
<p>
|
||||
This might cost more, but would reduce the amount we have to 'give away'
|
||||
in order to meet the specification.
|
||||
</p>
|
||||
<p>
|
||||
To estimate how much better (how much smaller standard deviation) it
|
||||
would have to be, we need to get the 5% quantile to be located at the
|
||||
under_weight limit, 2.9
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">p</span> <span class="special">=</span> <span class="number">0.05</span><span class="special">;</span> <span class="comment">// wanted p th quantile.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quantile of "</span> <span class="special"><<</span> <span class="identifier">p</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">packs</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">", mean = "</span> <span class="special"><<</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span> <span class="special"><<</span> <span class="string">", sd = "</span> <span class="special"><<</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Quantile of 0.05 = 2.83551, mean = 3, sd = 0.1
|
||||
</p>
|
||||
<p>
|
||||
With the current packer (mean = 3, sd = 0.1), the 5% quantile is at 2.8551
|
||||
kg, a little below our target of 2.9 kg. So we know that the standard
|
||||
deviation is going to have to be smaller.
|
||||
</p>
|
||||
<p>
|
||||
Let's start by guessing that it (now 0.1) needs to be halved, to a standard
|
||||
deviation of 0.05 kg.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">pack05</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="number">0.05</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quantile of "</span> <span class="special"><<</span> <span class="identifier">p</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">pack05</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">", mean = "</span> <span class="special"><<</span> <span class="identifier">pack05</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span> <span class="special"><<</span> <span class="string">", sd = "</span> <span class="special"><<</span> <span class="identifier">pack05</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Quantile of 0.05 = 2.91776, mean = 3, sd = 0.05</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack05</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack05</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Fraction of packs >= 2.9 with a mean of 3 and standard deviation of 0.05 is 0.97725</span>
|
||||
</pre>
|
||||
<p>
|
||||
So 0.05 was quite a good guess, but we are a little over the 2.9 target,
|
||||
so the standard deviation could be a tiny bit more. So we could do some
|
||||
more guessing to get closer, say by increasing standard deviation to
|
||||
0.06 kg, constructing another new distribution called pack06.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">pack06</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="number">0.06</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quantile of "</span> <span class="special"><<</span> <span class="identifier">p</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">pack06</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">", mean = "</span> <span class="special"><<</span> <span class="identifier">pack06</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span> <span class="special"><<</span> <span class="string">", sd = "</span> <span class="special"><<</span> <span class="identifier">pack06</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Quantile of 0.05 = 2.90131, mean = 3, sd = 0.06</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack06</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack06</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Fraction of packs >= 2.9 with a mean of 3 and standard deviation of 0.06 is 0.95221</span>
|
||||
</pre>
|
||||
<p>
|
||||
Now we are getting really close, but to do the job properly, we might
|
||||
need to use root finding method, for example the tools provided, and
|
||||
used elsewhere, in the Math Toolkit, see <a class="link" href="../../../roots/roots_noderiv.html" title="Root Finding Without Derivatives">root-finding
|
||||
without derivatives</a>
|
||||
</p>
|
||||
<p>
|
||||
But in this (normal) distribution case, we can and should be even smarter
|
||||
and make a direct calculation.
|
||||
</p>
|
||||
<p>
|
||||
Our required limit is minimum_weight = 2.9 kg, often called the random
|
||||
variate z. For a standard normal distribution, then probability p = N((minimum_weight
|
||||
- mean) / sd).
|
||||
</p>
|
||||
<p>
|
||||
We want to find the standard deviation that would be required to meet
|
||||
this limit, so that the p th quantile is located at z (minimum_weight).
|
||||
In this case, the 0.05 (5%) quantile is at 2.9 kg pack weight, when the
|
||||
mean is 3 kg, ensuring that 0.95 (95%) of packs are above the minimum
|
||||
weight.
|
||||
</p>
|
||||
<p>
|
||||
Rearranging, we can directly calculate the required standard deviation:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">N01</span><span class="special">;</span> <span class="comment">// standard normal distribution with mean zero and unit standard deviation.</span>
|
||||
<span class="identifier">p</span> <span class="special">=</span> <span class="number">0.05</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">qp</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">N01</span><span class="special">,</span> <span class="identifier">p</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd95</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">minimum_weight</span> <span class="special">-</span> <span class="identifier">mean</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">qp</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"For the "</span><span class="special"><<</span> <span class="identifier">p</span> <span class="special"><<</span> <span class="string">"th quantile to be located at "</span>
|
||||
<span class="special"><<</span> <span class="identifier">minimum_weight</span> <span class="special"><<</span> <span class="string">", would need a standard deviation of "</span> <span class="special"><<</span> <span class="identifier">sd95</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// For the 0.05th quantile to be located at 2.9, would need a standard deviation of 0.0607957</span>
|
||||
</pre>
|
||||
<p>
|
||||
We can now construct a new (normal) distribution pack95 for the 'better'
|
||||
packer, and check that our distribution will meet the specification.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">pack95</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">sd95</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack95</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack95</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Fraction of packs >= 2.9 with a mean of 3 and standard deviation of 0.0607957 is 0.95</span>
|
||||
</pre>
|
||||
<p>
|
||||
This calculation is generalized in the free function find_scale, as shown
|
||||
below, giving the same standard deviation.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">ss</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="identifier">under_fraction</span><span class="special">,</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">mean</span><span class="special">());</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"find_scale<normal>(minimum_weight, under_fraction, packs.mean()); "</span> <span class="special"><<</span> <span class="identifier">ss</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// find_scale<normal>(minimum_weight, under_fraction, packs.mean()); 0.0607957</span>
|
||||
</pre>
|
||||
<p>
|
||||
If we had defined an over_fraction, or percentage that must pass specification
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">over_fraction</span> <span class="special">=</span> <span class="number">0.95</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
And (wrongly) written
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">sso</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="identifier">over_fraction</span><span class="special">,</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">mean</span><span class="special">());</span>
|
||||
</pre>
|
||||
<p>
|
||||
With the default policy, we would get a message like
|
||||
</p>
|
||||
<pre class="programlisting">Message from thrown exception was:
|
||||
Error in function boost::math::find_scale<Dist, Policy>(double, double, double, Policy):
|
||||
Computed scale (-0.060795683191176959) is <= 0! Was the complement intended?
|
||||
</pre>
|
||||
<p>
|
||||
But this would return a <span class="bold"><strong>negative</strong></span> standard
|
||||
deviation - obviously impossible. The probability should be 1 - over_fraction,
|
||||
not over_fraction, thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">ss1o</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="number">1</span> <span class="special">-</span> <span class="identifier">over_fraction</span><span class="special">,</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">mean</span><span class="special">());</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"find_scale<normal>(minimum_weight, under_fraction, packs.mean()); "</span> <span class="special"><<</span> <span class="identifier">ss1o</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// find_scale<normal>(minimum_weight, under_fraction, packs.mean()); 0.0607957</span>
|
||||
</pre>
|
||||
<p>
|
||||
But notice that using '1 - over_fraction' - will lead to a loss of accuracy,
|
||||
especially if over_fraction was close to unity. (See <a class="link" href="../../overview/complements.html#why_complements">why
|
||||
complements?</a>). In this (very common) case, we should instead use
|
||||
the <a class="link" href="../../overview/complements.html" title="Complements are supported too - and when to use them">complements</a>,
|
||||
giving the most accurate result.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">ssc</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">minimum_weight</span><span class="special">,</span> <span class="identifier">over_fraction</span><span class="special">,</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()));</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"find_scale<normal>(complement(minimum_weight, over_fraction, packs.mean())); "</span> <span class="special"><<</span> <span class="identifier">ssc</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// find_scale<normal>(complement(minimum_weight, over_fraction, packs.mean())); 0.0607957</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that our guess of 0.06 was close to the accurate value of 0.060795683191176959.
|
||||
</p>
|
||||
<p>
|
||||
We can again confirm our prediction thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">pack95c</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">ssc</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">minimum_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack95c</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack95c</span><span class="special">,</span> <span class="identifier">minimum_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Fraction of packs >= 2.9 with a mean of 3 and standard deviation of 0.0607957 is 0.95</span>
|
||||
</pre>
|
||||
<p>
|
||||
Notice that these two deceptively simple questions:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
Do we over-fill to make sure we meet a minimum specification (or
|
||||
under-fill to avoid an overdose)?
|
||||
</li></ul></div>
|
||||
<p>
|
||||
and/or
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
Do we measure better?
|
||||
</li></ul></div>
|
||||
<p>
|
||||
are actually extremely common.
|
||||
</p>
|
||||
<p>
|
||||
The weight of beef might be replaced by a measurement of more or less
|
||||
anything, from drug tablet content, Apollo landing rocket firing, X-ray
|
||||
treatment doses...
|
||||
</p>
|
||||
<p>
|
||||
The scale can be variation in dispensing or uncertainty in measurement.
|
||||
</p>
|
||||
<p>
|
||||
See <a href="../../../../../../example/find_mean_and_sd_normal.cpp" target="_top">find_mean_and_sd_normal.cpp</a>
|
||||
for full source code & appended program output.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="find_scale_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../find_eg.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="../nag_library.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,209 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Find Scale (Standard Deviation) Example</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../find_eg.html" title="Find Location and Scale Examples">
|
||||
<link rel="prev" href="find_location_eg.html" title="Find Location (Mean) Example">
|
||||
<link rel="next" href="find_mean_and_sd_eg.html" title="Find mean and standard deviation example">
|
||||
</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="find_location_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../find_eg.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="find_mean_and_sd_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_scale_eg"></a><a class="link" href="find_scale_eg.html" title="Find Scale (Standard Deviation) Example">Find
|
||||
Scale (Standard Deviation) Example</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
First we need some includes to access the <a class="link" href="../../../dist_ref/dists/normal_dist.html" title="Normal (Gaussian) Distribution">Normal
|
||||
Distribution</a>, the algorithms to find scale (and some std output
|
||||
of course).
|
||||
</p>
|
||||
<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">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for normal_distribution</span>
|
||||
<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>
|
||||
<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">find_scale</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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">find_scale</span><span class="special">;</span>
|
||||
<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">complement</span><span class="special">;</span> <span class="comment">// Needed if you want to use the complement version.</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span> <span class="comment">// Needed to specify the error handling policy.</span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</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> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
For this example, we will use the standard <a class="link" href="../../../dist_ref/dists/normal_dist.html" title="Normal (Gaussian) Distribution">Normal
|
||||
Distribution</a>, with location (mean) zero and standard deviation
|
||||
(scale) unity. Conveniently, this is also the default for this implementation's
|
||||
constructor.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">N01</span><span class="special">;</span> <span class="comment">// Default 'standard' normal distribution with zero mean</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd</span> <span class="special">=</span> <span class="number">1.</span><span class="special">;</span> <span class="comment">// and standard deviation is 1.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Suppose we want to find a different normal distribution with standard
|
||||
deviation so that only fraction p (here 0.001 or 0.1%) are below a certain
|
||||
chosen limit (here -2. standard deviations).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="special">-</span><span class="number">2.</span><span class="special">;</span> <span class="comment">// z to give prob p</span>
|
||||
<span class="keyword">double</span> <span class="identifier">p</span> <span class="special">=</span> <span class="number">0.001</span><span class="special">;</span> <span class="comment">// only 0.1% below z = -2</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">location</span><span class="special">()</span> <span class="comment">// aka N01.mean()</span>
|
||||
<span class="special"><<</span> <span class="string">", standard deviation "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">scale</span><span class="special">()</span> <span class="comment">// aka N01.standard_deviation()</span>
|
||||
<span class="special"><<</span> <span class="string">", has "</span> <span class="special"><<</span> <span class="string">"fraction <= "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">N01</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">location</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", standard deviation "</span> <span class="special"><<</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">scale</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", has "</span> <span class="special"><<</span> <span class="string">"fraction > "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">N01</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Note: uses complement.</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Normal distribution with mean = 0 has fraction <= -2, p = 0.0227501
|
||||
Normal distribution with mean = 0 has fraction > -2, p = 0.97725
|
||||
</pre>
|
||||
<p>
|
||||
Noting that p = 0.02 instead of our target of 0.001, we can now use
|
||||
<code class="computeroutput"><span class="identifier">find_scale</span></code> to give a
|
||||
new standard deviation.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">l</span> <span class="special">=</span> <span class="identifier">N01</span><span class="special">.</span><span class="identifier">location</span><span class="special">();</span>
|
||||
<span class="keyword">double</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">l</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"scale (standard deviation) = "</span> <span class="special"><<</span> <span class="identifier">s</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
that outputs:
|
||||
</p>
|
||||
<pre class="programlisting">scale (standard deviation) = 0.647201
|
||||
</pre>
|
||||
<p>
|
||||
showing that we need to reduce the standard deviation from 1. to 0.65.
|
||||
</p>
|
||||
<p>
|
||||
Then we can check that we have achieved our objective by constructing
|
||||
a new distribution with the new standard deviation (but same zero mean):
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">np001pc</span><span class="special">(</span><span class="identifier">N01</span><span class="special">.</span><span class="identifier">location</span><span class="special">(),</span> <span class="identifier">s</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
And re-calculating the fraction below (and above) our chosen limit.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span>
|
||||
<span class="special"><<</span> <span class="string">" has "</span> <span class="special"><<</span> <span class="string">"fraction <= "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">np001pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span>
|
||||
<span class="special"><<</span> <span class="string">" has "</span> <span class="special"><<</span> <span class="string">"fraction > "</span> <span class="special"><<</span> <span class="identifier">z</span>
|
||||
<span class="special"><<</span> <span class="string">", p = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">np001pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Normal distribution with mean = 0 has fraction <= -2, p = 0.001
|
||||
Normal distribution with mean = 0 has fraction > -2, p = 0.999
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.find_eg.find_scale_eg.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.find_eg.find_scale_eg.controlling_how_errors_from_find"></a></span><a class="link" href="find_scale_eg.html#math_toolkit.stat_tut.weg.find_eg.find_scale_eg.controlling_how_errors_from_find">Controlling
|
||||
how Errors from find_scale are handled</a>
|
||||
</h5>
|
||||
<p>
|
||||
We can also control the policy for handling various errors. For example,
|
||||
we can define a new (possibly unwise) policy to ignore domain errors
|
||||
('bad' arguments).
|
||||
</p>
|
||||
<p>
|
||||
Unless we are using the boost::math namespace, we will need:
|
||||
</p>
|
||||
<pre class="programlisting"><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">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">domain_error</span><span class="special">;</span>
|
||||
<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">policies</span><span class="special">::</span><span class="identifier">ignore_error</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Using a typedef is convenient, especially if it is re-used, although
|
||||
it is not required, as the various examples below show.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">ignore_error</span><span class="special">></span> <span class="special">></span> <span class="identifier">ignore_domain_policy</span><span class="special">;</span>
|
||||
<span class="comment">// find_scale with new policy, using typedef.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">ignore_domain_policy</span><span class="special">());</span>
|
||||
<span class="comment">// Default policy policy<>, needs using boost::math::policies::policy;</span>
|
||||
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">policy</span><span class="special"><>());</span>
|
||||
<span class="comment">// Default policy, fully specified.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">l</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="comment">// New policy, without typedef.</span>
|
||||
<span class="identifier">l</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">ignore_error</span><span class="special">></span> <span class="special">>());</span>
|
||||
</pre>
|
||||
<p>
|
||||
If we want to express a probability, say 0.999, that is a complement,
|
||||
<code class="computeroutput"><span class="number">1</span> <span class="special">-</span>
|
||||
<span class="identifier">p</span></code> we should not even think
|
||||
of writing <code class="computeroutput"><span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">z</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">l</span><span class="special">)</span></code>,
|
||||
but use the <a class="link" href="../../overview/complements.html" title="Complements are supported too - and when to use them">complements</a>
|
||||
version (see <a class="link" href="../../overview/complements.html#why_complements">why complements?</a>).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">z</span> <span class="special">=</span> <span class="special">-</span><span class="number">2.</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">q</span> <span class="special">=</span> <span class="number">0.999</span><span class="special">;</span> <span class="comment">// = 1 - p; // complement of 0.001.</span>
|
||||
<span class="identifier">sd</span> <span class="special">=</span> <span class="identifier">find_scale</span><span class="special"><</span><span class="identifier">normal</span><span class="special">>(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">q</span><span class="special">,</span> <span class="identifier">l</span><span class="special">));</span>
|
||||
|
||||
<span class="identifier">normal</span> <span class="identifier">np95pc</span><span class="special">(</span><span class="identifier">l</span><span class="special">,</span> <span class="identifier">sd</span><span class="special">);</span> <span class="comment">// Same standard_deviation (scale) but with mean(scale) shifted</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="string">" has "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction <= "</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">np95pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Normal distribution with mean = "</span> <span class="special"><<</span> <span class="identifier">l</span> <span class="special"><<</span> <span class="string">" has "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction > "</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">np95pc</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Sadly, it is all too easy to get probabilities the wrong way round, when
|
||||
you may get a warning like this:
|
||||
</p>
|
||||
<pre class="programlisting">Message from thrown exception was:
|
||||
Error in function boost::math::find_scale<Dist, Policy>(complement(double, double, double, Policy)):
|
||||
Computed scale (-0.48043523852179076) is <= 0! Was the complement intended?
|
||||
</pre>
|
||||
<p>
|
||||
The default error handling policy is to throw an exception with this
|
||||
message, but if you chose a policy to ignore the error, the (impossible)
|
||||
negative scale is quietly returned.
|
||||
</p>
|
||||
<p>
|
||||
See <a href="../../../../../../example/find_scale_example.cpp" target="_top">find_scale_example.cpp</a>
|
||||
for full source code: the program output looks like this:
|
||||
</p>
|
||||
<pre class="programlisting">Example: Find scale (standard deviation).
|
||||
Normal distribution with mean = 0, standard deviation 1, has fraction <= -2, p = 0.0227501
|
||||
Normal distribution with mean = 0, standard deviation 1, has fraction > -2, p = 0.97725
|
||||
scale (standard deviation) = 0.647201
|
||||
Normal distribution with mean = 0 has fraction <= -2, p = 0.001
|
||||
Normal distribution with mean = 0 has fraction > -2, p = 0.999
|
||||
Normal distribution with mean = 0.946339 has fraction <= -2 = 0.001
|
||||
Normal distribution with mean = 0.946339 has fraction > -2 = 0.999
|
||||
</pre>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="find_location_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../find_eg.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="find_mean_and_sd_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,422 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Geometric Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="binom_eg/binom_size_eg.html" title="Estimating Sample Sizes for a Binomial Distribution.">
|
||||
<link rel="next" href="neg_binom_eg.html" title="Negative Binomial Distribution Examples">
|
||||
</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="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>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.geometric_eg"></a><a class="link" href="geometric_eg.html" title="Geometric Distribution Examples">Geometric Distribution
|
||||
Examples</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
For this example, we will opt to #define two macros to control the error
|
||||
and discrete handling policies. For this simple example, we want to avoid
|
||||
throwing an exception (the default policy) and just return infinity. We
|
||||
want to treat the distribution as if it was continuous, so we choose a
|
||||
discrete_quantile policy of real, rather than the default policy integer_round_outwards.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_OVERFLOW_ERROR_POLICY</span> <span class="identifier">ignore_error</span>
|
||||
<span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DISCRETE_QUANTILE_POLICY</span> <span class="identifier">real</span>
|
||||
</pre>
|
||||
<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>
|
||||
It is vital to #include distributions etc <span class="bold"><strong>after</strong></span>
|
||||
the above #defines
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
After that we need some includes to provide easy access to the negative
|
||||
binomial distribution, and we need some std library iostream, of course.
|
||||
</p>
|
||||
<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>
|
||||
<span class="comment">// for geometric_distribution</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<span class="comment">// for negative_binomial_distribution</span>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<span class="comment">// for negative_binomial_distribution</span>
|
||||
<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>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
<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>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<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>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
It is always sensible to use try and catch blocks because defaults policies
|
||||
are to throw an exception if anything goes wrong.
|
||||
</p>
|
||||
<p>
|
||||
Simple try'n'catch blocks (see below) will ensure that you get a helpful
|
||||
error message instead of an abrupt (and silent) program abort.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.geometric_eg.h0"></a>
|
||||
<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
|
||||
a dice</a>
|
||||
</h5>
|
||||
<p>
|
||||
The Geometric distribution describes the probability (<span class="emphasis"><em>p</em></span>)
|
||||
of a number of failures to get the first success in <span class="emphasis"><em>k</em></span>
|
||||
Bernoulli trials. (A <a href="http://en.wikipedia.org/wiki/Bernoulli_distribution" target="_top">Bernoulli
|
||||
trial</a> is one with only two possible outcomes, success of failure,
|
||||
and <span class="emphasis"><em>p</em></span> is the probability of success).
|
||||
</p>
|
||||
<p>
|
||||
Suppose an 'fair' 6-face dice is thrown repeatedly:
|
||||
</p>
|
||||
<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>
|
||||
<span class="comment">// (so failure_fraction is 1 - success_fraction = 5./6 = 1- 0.1666 = 0.8333)</span>
|
||||
</pre>
|
||||
<p>
|
||||
If the dice is thrown repeatedly until the <span class="bold"><strong>first</strong></span>
|
||||
time a <span class="emphasis"><em>three</em></span> appears. The probablility distribution
|
||||
of the number of times it is thrown <span class="bold"><strong>not</strong></span>
|
||||
getting a <span class="emphasis"><em>three</em></span> (<span class="emphasis"><em>not-a-threes</em></span>
|
||||
number of failures to get a <span class="emphasis"><em>three</em></span>) is a geometric
|
||||
distribution with the success_fraction = 1/6 = 0.1666 ̇.
|
||||
</p>
|
||||
<p>
|
||||
We therefore start by constructing a geometric distribution with the one
|
||||
parameter success_fraction, the probability of success.
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
To confirm, we can echo the success_fraction parameter of the distribution.
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
So the probability of getting a three at the first throw (zero failures)
|
||||
is
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
Note that the cdf and pdf are identical because the is only one throw.
|
||||
If we want the probability of getting the first <span class="emphasis"><em>three</em></span>
|
||||
on the 2nd throw:
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
If we want the probability of getting the first <span class="emphasis"><em>three</em></span>
|
||||
on the 1st or 2nd throw (allowing one failure):
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
Or more conveniently, and more generally, we can use the Cumulative Distribution
|
||||
Function CDF.
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
If we allow many more (12) throws, the probability of getting our <span class="emphasis"><em>three</em></span>
|
||||
gets very high:
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
If we want to be much more confident, say 99%, we can estimate the number
|
||||
of throws to be this sure using the inverse or quantile.
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
Note that the value returned is not an integer: if you want an integer
|
||||
result you should use either floor, round or ceil functions, or use the
|
||||
policies mechanism.
|
||||
</p>
|
||||
<p>
|
||||
See <a class="link" href="../../pol_tutorial/understand_dis_quant.html" title="Understanding Quantiles of Discrete Distributions">understanding
|
||||
discrete quantiles</a>.
|
||||
</p>
|
||||
<p>
|
||||
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>
|
||||
<span class="identifier">p</span><span class="special">);</span></code>
|
||||
with parameter <span class="emphasis"><em>r</em></span> = 1. So we could get the same result
|
||||
using the negative binomial, but using the geometric the results will be
|
||||
faster, and may be more accurate.
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
We could also the complement to express the required probability as 1 -
|
||||
0.99 = 0.01 (and get the same result):
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
Note too that Boost.Math geometric distribution is implemented as a continuous
|
||||
function. Unlike other implementations (for example R) it <span class="bold"><strong>uses</strong></span>
|
||||
the number of failures as a <span class="bold"><strong>real</strong></span> parameter,
|
||||
not as an integer. If you want this integer behaviour, you may need to
|
||||
enforce this by rounding the parameter you pass, probably rounding down,
|
||||
to the nearest integer. For example, R returns the success fraction probability
|
||||
for all values of failures from 0 to 0.999999 thus:
|
||||
</p>
|
||||
<pre class="programlisting">   R> formatC(pgeom(0.0001,0.5, FALSE), digits=17) " 0.5"
|
||||
</pre>
|
||||
<p>
|
||||
So in Boost.Math the equivalent is
|
||||
</p>
|
||||
<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>
|
||||
<span class="comment">// Output all potentially significant digits for the type, here double.</span>
|
||||
|
||||
<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_NO_CXX11_NUMERIC_LIMITS</span>
|
||||
<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>
|
||||
<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>
|
||||
<span class="preprocessor">#else</span>
|
||||
<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>
|
||||
<span class="preprocessor">#endif</span>
|
||||
<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>
|
||||
<span class="special"><<</span> <span class="identifier">max_digits10</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
To get the R discrete behaviour, you simply need to round with, for example,
|
||||
the <code class="computeroutput"><span class="identifier">floor</span></code> function.
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
shows that R makes an arbitrary round-up decision at about 1e7 from the
|
||||
next integer above. This may be convenient in practice, and could be replicated
|
||||
in C++ if desired.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.geometric_eg.h1"></a>
|
||||
<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
|
||||
customers to find one with a faulty product</a>
|
||||
</h5>
|
||||
<p>
|
||||
A company knows from warranty claims that 2% of their products will be
|
||||
faulty, so the 'success_fraction' of finding a fault is 0.02. It wants
|
||||
to interview a purchaser of faulty products to assess their 'user experience'.
|
||||
</p>
|
||||
<p>
|
||||
To estimate how many customers they will probably need to contact in order
|
||||
to find one who has suffered from the fault, we first construct a geometric
|
||||
distribution with probability 0.02, and then chose a confidence, say 80%,
|
||||
95%, or 99% to finding a customer with a fault. Finally, we probably want
|
||||
to round up the result to the integer above using the <code class="computeroutput"><span class="identifier">ceil</span></code>
|
||||
function. (We could also use a policy, but that is hardly worthwhile for
|
||||
this simple application.)
|
||||
</p>
|
||||
<p>
|
||||
(This also assumes that each customer only buys one product: if customers
|
||||
bought more than one item, the probability of finding a customer with a
|
||||
fault obviously improves.)
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<span class="special"><<</span> <span class="string">"% confident of finding we customer with a fault, need to survey "</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span class="special"><<</span> <span class="string">"% confident of finding we customer with a fault, need to survey "</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span class="special"><<</span> <span class="string">"% confident of finding we customer with a fault, need to survey "</span>
|
||||
<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>
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.geometric_eg.h2"></a>
|
||||
<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
|
||||
Ball Shooters</a>
|
||||
</h5>
|
||||
<p>
|
||||
According to Wikipedia, average pro basket ball players get <a href="http://en.wikipedia.org/wiki/Free_throw" target="_top">free
|
||||
throws</a> in the baskets 70 to 80 % of the time, but some get as high
|
||||
as 95%, and others as low as 50%. Suppose we want to compare the probabilities
|
||||
of failing to get a score only on the first or on the fifth shot? To start
|
||||
we will consider the average shooter, say 75%. So we construct a geometric
|
||||
distribution with success_fraction parameter 75/100 = 0.75.
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
What is probability of getting 1st try in the basket, that is with no failures?
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
This is, of course, the success_fraction probability 75%. What is the probability
|
||||
that the shooter only scores on the fifth shot? So there are 5-1 = 4 failures
|
||||
before the first success.
|
||||
</p>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
Now compare this with the poor and the best players success fraction. We
|
||||
need to constructing new distributions with the different success fractions,
|
||||
and then get the corresponding probability density functions values:
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
<span class="identifier">geometric</span> <span class="identifier">gmediocre</span><span class="special">(</span><span class="number">0.50</span><span class="special">);</span>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
So we can see the very much smaller chance (0.000006) of 4 failures by
|
||||
the best shooters, compared to the 0.03 of the mediocre.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.geometric_eg.h3"></a>
|
||||
<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
|
||||
failures</a>
|
||||
</h5>
|
||||
<p>
|
||||
Of course one man's failure is an other man's success. So a fault can be
|
||||
defined as a 'success'.
|
||||
</p>
|
||||
<p>
|
||||
If a fault occurs once after 100 flights, then one might naively say that
|
||||
the risk of fault is obviously 1 in 100 = 1/100, a probability of 0.01.
|
||||
</p>
|
||||
<p>
|
||||
This is the best estimate we can make, but while it is the truth, it is
|
||||
not the whole truth, for it hides the big uncertainty when estimating from
|
||||
a single event. "One swallow doesn't make a summer." To show
|
||||
the magnitude of the uncertainty, the geometric (or the negative binomial)
|
||||
distribution can be used.
|
||||
</p>
|
||||
<p>
|
||||
If we chose the popular 95% confidence in the limits, corresponding to
|
||||
an alpha of 0.05, because we are calculating a two-sided interval, we must
|
||||
divide alpha by two.
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
So while we estimate the probability is 0.01, it might lie between 0.0003
|
||||
and 0.04. Even if we relax our confidence to alpha = 90%, the bounds only
|
||||
contract to 0.0005 and 0.03. And if we require a high confidence, they
|
||||
widen to 0.00005 to 0.05.
|
||||
</p>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
In real life, there will usually be more than one event (fault or success),
|
||||
when the negative binomial, which has the neccessary extra parameter, will
|
||||
be needed.
|
||||
</p>
|
||||
<p>
|
||||
As noted above, using a catch block is always a good idea, even if you
|
||||
hope not to use it!
|
||||
</p>
|
||||
<pre class="programlisting"><span class="special">}</span>
|
||||
<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>
|
||||
<span class="special">{</span> <span class="comment">// Since we have set an overflow policy of ignore_error,</span>
|
||||
<span class="comment">// an overflow exception should never be thrown.</span>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
For example, without a ignore domain error policy, if we asked for
|
||||
</p>
|
||||
<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>
|
||||
<p>
|
||||
for example, we would get an unhelpful abort, but with a catch:
|
||||
</p>
|
||||
<pre class="programlisting">Message from thrown exception was:
|
||||
Error in function boost::math::pdf(const exponential_distribution<double>&, double):
|
||||
Number of failures argument is -1, but must be >= 0 !
|
||||
</pre>
|
||||
<p>
|
||||
See full source C++ of this example at <a href="../../../../../example/geometric_examples.cpp" target="_top">geometric_examples.cpp</a>
|
||||
</p>
|
||||
<p>
|
||||
<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
|
||||
negative_binomial confidence interval example.</a>
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="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>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,360 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Inverse Chi-Squared Distribution Bayes Example</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="normal_example/normal_misc.html" title="Some Miscellaneous Examples of the Normal (Gaussian) Distribution">
|
||||
<link rel="next" href="nccs_eg.html" title="Non Central Chi Squared Example">
|
||||
</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="normal_example/normal_misc.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="nccs_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.inverse_chi_squared_eg"></a><a class="link" href="inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example">Inverse
|
||||
Chi-Squared Distribution Bayes Example</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
The scaled-inversed-chi-squared distribution is the conjugate prior distribution
|
||||
for the variance (σ<sup>2</sup>) parameter of a normal distribution with known expectation
|
||||
(μ). As such it has widespread application in Bayesian statistics:
|
||||
</p>
|
||||
<p>
|
||||
In <a href="http://en.wikipedia.org/wiki/Bayesian_inference" target="_top">Bayesian
|
||||
inference</a>, the strength of belief into certain parameter values
|
||||
is itself described through a distribution. Parameters hence become themselves
|
||||
modelled and interpreted as random variables.
|
||||
</p>
|
||||
<p>
|
||||
In this worked example, we perform such a Bayesian analysis by using the
|
||||
scaled-inverse-chi-squared distribution as prior and posterior distribution
|
||||
for the variance parameter of a normal distribution.
|
||||
</p>
|
||||
<p>
|
||||
For more general information on Bayesian type of analyses, see:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
Andrew Gelman, John B. Carlin, Hal E. Stern, Donald B. Rubin, Bayesian
|
||||
Data Analysis, 2003, ISBN 978-1439840955.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
Jim Albert, Bayesian Compution with R, Springer, 2009, ISBN 978-0387922973.
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
(As the scaled-inversed-chi-squared is another parameterization of the
|
||||
inverse-gamma distribution, this example could also have used the inverse-gamma
|
||||
distribution).
|
||||
</p>
|
||||
<p>
|
||||
Consider precision machines which produce balls for a high-quality ball
|
||||
bearing. Ideally each ball should have a diameter of precisely 3000 μm (3
|
||||
mm). Assume that machines generally produce balls of that size on average
|
||||
(mean), but individual balls can vary slightly in either direction following
|
||||
(approximately) a normal distribution. Depending on various production
|
||||
conditions (e.g. raw material used for balls, workplace temperature and
|
||||
humidity, maintenance frequency and quality) some machines produce balls
|
||||
tighter distributed around the target of 3000 μm, while others produce balls
|
||||
with a wider distribution. Therefore the variance parameter of the normal
|
||||
distribution of the ball sizes varies from machine to machine. An extensive
|
||||
survey by the precision machinery manufacturer, however, has shown that
|
||||
most machines operate with a variance between 15 and 50, and near 25 μm<sup>2</sup> on
|
||||
average.
|
||||
</p>
|
||||
<p>
|
||||
Using this information, we want to model the variance of the machines.
|
||||
The variance is strictly positive, and therefore we look for a statistical
|
||||
distribution with support in the positive domain of the real numbers. Given
|
||||
the expectation of the normal distribution of the balls is known (3000
|
||||
μm), for reasons of conjugacy, it is customary practice in Bayesian statistics
|
||||
to model the variance to be scaled-inverse-chi-squared distributed.
|
||||
</p>
|
||||
<p>
|
||||
In a first step, we will try to use the survey information to model the
|
||||
general knowledge about the variance parameter of machines measured by
|
||||
the manufacturer. This will provide us with a generic prior distribution
|
||||
that is applicable if nothing more specific is known about a particular
|
||||
machine.
|
||||
</p>
|
||||
<p>
|
||||
In a second step, we will then combine the prior-distribution information
|
||||
in a Bayesian analysis with data on a specific single machine to derive
|
||||
a posterior distribution for that machine.
|
||||
</p>
|
||||
<h6>
|
||||
<a name="math_toolkit.stat_tut.weg.inverse_chi_squared_eg.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.inverse_chi_squared_eg.step_one_using_the_survey_inform"></a></span><a class="link" href="inverse_chi_squared_eg.html#math_toolkit.stat_tut.weg.inverse_chi_squared_eg.step_one_using_the_survey_inform">Step
|
||||
one: Using the survey information.</a>
|
||||
</h6>
|
||||
<p>
|
||||
Using the survey results, we try to find the parameter set of a scaled-inverse-chi-squared
|
||||
distribution so that the properties of this distribution match the results.
|
||||
Using the mathematical properties of the scaled-inverse-chi-squared distribution
|
||||
as guideline, we see that that both the mean and mode of the scaled-inverse-chi-squared
|
||||
distribution are approximately given by the scale parameter (s) of the
|
||||
distribution. As the survey machines operated at a variance of 25 μm<sup>2</sup> on
|
||||
average, we hence set the scale parameter (s<sub>prior</sub>) of our prior distribution
|
||||
equal to this value. Using some trial-and-error and calls to the global
|
||||
quantile function, we also find that a value of 20 for the degrees-of-freedom
|
||||
(ν<sub>prior</sub>) parameter is adequate so that most of the prior distribution mass
|
||||
is located between 15 and 50 (see figure below).
|
||||
</p>
|
||||
<p>
|
||||
We first construct our prior distribution using these values, and then
|
||||
list out a few quantiles:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">priorDF</span> <span class="special">=</span> <span class="number">20.0</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">priorScale</span> <span class="special">=</span> <span class="number">25.0</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">inverse_chi_squared</span> <span class="identifier">prior</span><span class="special">(</span><span class="identifier">priorDF</span><span class="special">,</span> <span class="identifier">priorScale</span><span class="special">);</span>
|
||||
<span class="comment">// Using an inverse_gamma distribution instead, we could equivalently write</span>
|
||||
<span class="comment">// inverse_gamma prior(priorDF / 2.0, priorScale * priorDF / 2.0);</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Prior distribution:"</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" 2.5% quantile: "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">prior</span><span class="special">,</span> <span class="number">0.025</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" 50% quantile: "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">prior</span><span class="special">,</span> <span class="number">0.5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" 97.5% quantile: "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">prior</span><span class="special">,</span> <span class="number">0.975</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
This produces this output:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">Prior</span> <span class="identifier">distribution</span><span class="special">:</span>
|
||||
|
||||
<span class="number">2.5</span><span class="special">%</span> <span class="identifier">quantile</span><span class="special">:</span> <span class="number">14.6</span>
|
||||
<span class="number">50</span><span class="special">%</span> <span class="identifier">quantile</span><span class="special">:</span> <span class="number">25.9</span>
|
||||
<span class="number">97.5</span><span class="special">%</span> <span class="identifier">quantile</span><span class="special">:</span> <span class="number">52.1</span>
|
||||
</pre>
|
||||
<p>
|
||||
Based on this distribution, we can now calculate the probability of having
|
||||
a machine working with an unusual work precision (variance) at <= 15
|
||||
or > 50. For this task, we use calls to the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span></code> functions <code class="computeroutput"><span class="identifier">cdf</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">complement</span></code>, respectively,
|
||||
and find a probability of about 0.031 (3.1%) for each case.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" probability variance <= 15: "</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="identifier">prior</span><span class="special">,</span> <span class="number">15.0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" probability variance <= 25: "</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="identifier">prior</span><span class="special">,</span> <span class="number">25.0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" probability variance > 50: "</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="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">prior</span><span class="special">,</span> <span class="number">50.0</span><span class="special">))</span>
|
||||
<span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
This produces this output:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">probability</span> <span class="identifier">variance</span> <span class="special"><=</span> <span class="number">15</span><span class="special">:</span> <span class="number">0.031</span>
|
||||
<span class="identifier">probability</span> <span class="identifier">variance</span> <span class="special"><=</span> <span class="number">25</span><span class="special">:</span> <span class="number">0.458</span>
|
||||
<span class="identifier">probability</span> <span class="identifier">variance</span> <span class="special">></span> <span class="number">50</span><span class="special">:</span> <span class="number">0.0318</span>
|
||||
</pre>
|
||||
<p>
|
||||
Therefore, only 3.1% of all precision machines produce balls with a variance
|
||||
of 15 or less (particularly precise machines), but also only 3.2% of all
|
||||
machines produce balls with a variance of as high as 50 or more (particularly
|
||||
imprecise machines). Moreover, slightly more than one-half (1 - 0.458 =
|
||||
54.2%) of the machines work at a variance greater than 25.
|
||||
</p>
|
||||
<p>
|
||||
Notice here the distinction between a <a href="http://en.wikipedia.org/wiki/Bayesian_inference" target="_top">Bayesian</a>
|
||||
analysis and a <a href="http://en.wikipedia.org/wiki/Frequentist_inference" target="_top">frequentist</a>
|
||||
analysis: because we model the variance as random variable itself, we can
|
||||
calculate and straightforwardly interpret probabilities for given parameter
|
||||
values directly, while such an approach is not possible (and interpretationally
|
||||
a strict <span class="emphasis"><em>must-not</em></span>) in the frequentist world.
|
||||
</p>
|
||||
<h6>
|
||||
<a name="math_toolkit.stat_tut.weg.inverse_chi_squared_eg.h1"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.inverse_chi_squared_eg.step_2_investigate_a_single_mach"></a></span><a class="link" href="inverse_chi_squared_eg.html#math_toolkit.stat_tut.weg.inverse_chi_squared_eg.step_2_investigate_a_single_mach">Step
|
||||
2: Investigate a single machine</a>
|
||||
</h6>
|
||||
<p>
|
||||
In the second step, we investigate a single machine, which is suspected
|
||||
to suffer from a major fault as the produced balls show fairly high size
|
||||
variability. Based on the prior distribution of generic machinery performance
|
||||
(derived above) and data on balls produced by the suspect machine, we calculate
|
||||
the posterior distribution for that machine and use its properties for
|
||||
guidance regarding continued machine operation or suspension.
|
||||
</p>
|
||||
<p>
|
||||
It can be shown that if the prior distribution was chosen to be scaled-inverse-chi-square
|
||||
distributed, then the posterior distribution is also scaled-inverse-chi-squared-distributed
|
||||
(prior and posterior distributions are hence conjugate). For more details
|
||||
regarding conjugacy and formula to derive the parameters set for the posterior
|
||||
distribution see <a href="http://en.wikipedia.org/wiki/Conjugate_prior" target="_top">Conjugate
|
||||
prior</a>.
|
||||
</p>
|
||||
<p>
|
||||
Given the prior distribution parameters and sample data (of size n), the
|
||||
posterior distribution parameters are given by the two expressions:
|
||||
</p>
|
||||
<p>
|
||||
   ν<sub>posterior</sub> = ν<sub>prior</sub> + n
|
||||
</p>
|
||||
<p>
|
||||
which gives the posteriorDF below, and
|
||||
</p>
|
||||
<p>
|
||||
   s<sub>posterior</sub> = (ν<sub>prior</sub>s<sub>prior</sub> + Σ<sup>n</sup><sub>i=1</sub>(x<sub>i</sub> - μ)<sup>2</sup>) / (ν<sub>prior</sub> + n)
|
||||
</p>
|
||||
<p>
|
||||
which after some rearrangement gives the formula for the posteriorScale
|
||||
below.
|
||||
</p>
|
||||
<p>
|
||||
Machine-specific data consist of 100 balls which were accurately measured
|
||||
and show the expected mean of 3000 μm and a sample variance of 55 (calculated
|
||||
for a sample mean defined to be 3000 exactly). From these data, the prior
|
||||
parameterization, and noting that the term Σ<sup>n</sup><sub>i=1</sub>(x<sub>i</sub> - μ)<sup>2</sup> equals the sample
|
||||
variance multiplied by n - 1, it follows that the posterior distribution
|
||||
of the variance parameter is scaled-inverse-chi-squared distribution with
|
||||
degrees-of-freedom (ν<sub>posterior</sub>) = 120 and scale (s<sub>posterior</sub>) = 49.54.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">ballsSampleSize</span> <span class="special">=</span> <span class="number">100</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"balls sample size: "</span> <span class="special"><<</span> <span class="identifier">ballsSampleSize</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">ballsSampleVariance</span> <span class="special">=</span> <span class="number">55.0</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"balls sample variance: "</span> <span class="special"><<</span> <span class="identifier">ballsSampleVariance</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">posteriorDF</span> <span class="special">=</span> <span class="identifier">priorDF</span> <span class="special">+</span> <span class="identifier">ballsSampleSize</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"prior degrees-of-freedom: "</span> <span class="special"><<</span> <span class="identifier">priorDF</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"posterior degrees-of-freedom: "</span> <span class="special"><<</span> <span class="identifier">posteriorDF</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">posteriorScale</span> <span class="special">=</span>
|
||||
<span class="special">(</span><span class="identifier">priorDF</span> <span class="special">*</span> <span class="identifier">priorScale</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">ballsSampleVariance</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">ballsSampleSize</span> <span class="special">-</span> <span class="number">1</span><span class="special">)))</span> <span class="special">/</span> <span class="identifier">posteriorDF</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"prior scale: "</span> <span class="special"><<</span> <span class="identifier">priorScale</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"posterior scale: "</span> <span class="special"><<</span> <span class="identifier">posteriorScale</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
An interesting feature here is that one needs only to know a summary statistics
|
||||
of the sample to parameterize the posterior distribution: the 100 individual
|
||||
ball measurements are irrelevant, just knowledge of the sample variance
|
||||
and number of measurements is sufficient.
|
||||
</p>
|
||||
<p>
|
||||
That produces this output:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">balls</span> <span class="identifier">sample</span> <span class="identifier">size</span><span class="special">:</span> <span class="number">100</span>
|
||||
<span class="identifier">balls</span> <span class="identifier">sample</span> <span class="identifier">variance</span><span class="special">:</span> <span class="number">55</span>
|
||||
<span class="identifier">prior</span> <span class="identifier">degrees</span><span class="special">-</span><span class="identifier">of</span><span class="special">-</span><span class="identifier">freedom</span><span class="special">:</span> <span class="number">20</span>
|
||||
<span class="identifier">posterior</span> <span class="identifier">degrees</span><span class="special">-</span><span class="identifier">of</span><span class="special">-</span><span class="identifier">freedom</span><span class="special">:</span> <span class="number">120</span>
|
||||
<span class="identifier">prior</span> <span class="identifier">scale</span><span class="special">:</span> <span class="number">25</span>
|
||||
<span class="identifier">posterior</span> <span class="identifier">scale</span><span class="special">:</span> <span class="number">49.5</span>
|
||||
|
||||
</pre>
|
||||
<p>
|
||||
To compare the generic machinery performance with our suspect machine,
|
||||
we calculate again the same quantiles and probabilities as above, and find
|
||||
a distribution clearly shifted to greater values (see figure).
|
||||
</p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../../../../graphs/prior_posterior_plot.svg" align="middle"></span>
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">inverse_chi_squared</span> <span class="identifier">posterior</span><span class="special">(</span><span class="identifier">posteriorDF</span><span class="special">,</span> <span class="identifier">posteriorScale</span><span class="special">);</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Posterior distribution:"</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" 2.5% quantile: "</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><span class="identifier">posterior</span><span class="special">,</span> <span class="number">0.025</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" 50% quantile: "</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><span class="identifier">posterior</span><span class="special">,</span> <span class="number">0.5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" 97.5% quantile: "</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><span class="identifier">posterior</span><span class="special">,</span> <span class="number">0.975</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" probability variance <= 15: "</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="identifier">posterior</span><span class="special">,</span> <span class="number">15.0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" probability variance <= 25: "</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="identifier">posterior</span><span class="special">,</span> <span class="number">25.0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" probability variance > 50: "</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="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">posterior</span><span class="special">,</span> <span class="number">50.0</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
This produces this output:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">Posterior</span> <span class="identifier">distribution</span><span class="special">:</span>
|
||||
|
||||
<span class="number">2.5</span><span class="special">%</span> <span class="identifier">quantile</span><span class="special">:</span> <span class="number">39.1</span>
|
||||
<span class="number">50</span><span class="special">%</span> <span class="identifier">quantile</span><span class="special">:</span> <span class="number">49.8</span>
|
||||
<span class="number">97.5</span><span class="special">%</span> <span class="identifier">quantile</span><span class="special">:</span> <span class="number">64.9</span>
|
||||
|
||||
<span class="identifier">probability</span> <span class="identifier">variance</span> <span class="special"><=</span> <span class="number">15</span><span class="special">:</span> <span class="number">2.97e-031</span>
|
||||
<span class="identifier">probability</span> <span class="identifier">variance</span> <span class="special"><=</span> <span class="number">25</span><span class="special">:</span> <span class="number">8.85e-010</span>
|
||||
<span class="identifier">probability</span> <span class="identifier">variance</span> <span class="special">></span> <span class="number">50</span><span class="special">:</span> <span class="number">0.489</span>
|
||||
</pre>
|
||||
<p>
|
||||
Indeed, the probability that the machine works at a low variance (<=
|
||||
15) is almost zero, and even the probability of working at average or better
|
||||
performance is negligibly small (less than one-millionth of a permille).
|
||||
On the other hand, with an almost near-half probability (49%), the machine
|
||||
operates in the extreme high variance range of > 50 characteristic for
|
||||
poorly performing machines.
|
||||
</p>
|
||||
<p>
|
||||
Based on this information the operation of the machine is taken out of
|
||||
use and serviced.
|
||||
</p>
|
||||
<p>
|
||||
In summary, the Bayesian analysis allowed us to make exact probabilistic
|
||||
statements about a parameter of interest, and hence provided us results
|
||||
with straightforward interpretation.
|
||||
</p>
|
||||
<p>
|
||||
A full sample output is:
|
||||
</p>
|
||||
<pre class="programlisting"> Inverse_chi_squared_distribution Bayes example:
|
||||
|
||||
Prior distribution:
|
||||
|
||||
2.5% quantile: 14.6
|
||||
50% quantile: 25.9
|
||||
97.5% quantile: 52.1
|
||||
|
||||
probability variance <= 15: 0.031
|
||||
probability variance <= 25: 0.458
|
||||
probability variance > 50: 0.0318
|
||||
|
||||
balls sample size: 100
|
||||
balls sample variance: 55
|
||||
prior degrees-of-freedom: 20
|
||||
posterior degrees-of-freedom: 120
|
||||
prior scale: 25
|
||||
posterior scale: 49.5
|
||||
Posterior distribution:
|
||||
|
||||
2.5% quantile: 39.1
|
||||
50% quantile: 49.8
|
||||
97.5% quantile: 64.9
|
||||
|
||||
probability variance <= 15: 2.97e-031
|
||||
probability variance <= 25: 8.85e-010
|
||||
probability variance > 50: 0.489
|
||||
|
||||
</pre>
|
||||
<p>
|
||||
(See also the reference documentation for the <a class="link" href="../../dist_ref/dists/inverse_chi_squared_dist.html" title="Inverse Chi Squared Distribution">Inverse
|
||||
chi squared Distribution</a>.)
|
||||
</p>
|
||||
<p>
|
||||
See the full source C++ of this example at <a href="../../../../../example/inverse_chi_squared_bayes_eg.cpp" target="_top">../../example/inverse_chi_squared_bayes_eg.cpp</a>
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="normal_example/normal_misc.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="nccs_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,116 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Comparison with C, R, FORTRAN-style Free Functions</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="find_eg/find_mean_and_sd_eg.html" title="Find mean and standard deviation example">
|
||||
<link rel="next" href="c_sharp.html" title="Using the Distributions from Within C#">
|
||||
</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="find_eg/find_mean_and_sd_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="c_sharp.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.nag_library"></a><a class="link" href="nag_library.html" title="Comparison with C, R, FORTRAN-style Free Functions">Comparison with
|
||||
C, R, FORTRAN-style Free Functions</a>
|
||||
</h4></div></div></div>
|
||||
<p>
|
||||
You are probably familiar with a statistics library that has free functions,
|
||||
for example the classic <a href="http://nag.com/numeric/CL/CLdescription.asp" target="_top">NAG
|
||||
C library</a> and matching <a href="http://nag.com/numeric/FL/FLdescription.asp" target="_top">NAG
|
||||
FORTRAN Library</a>, <a href="http://office.microsoft.com/en-us/excel/HP052090051033.aspx" target="_top">Microsoft
|
||||
Excel BINOMDIST(number_s,trials,probability_s,cumulative)</a>, <a href="http://www.r-project.org/" target="_top">R</a>, <a href="http://www.ptc.com/products/mathcad/mathcad14/mathcad_func_chart.htm" target="_top">MathCAD
|
||||
pbinom</a> and many others.
|
||||
</p>
|
||||
<p>
|
||||
If so, you may find 'Distributions as Objects' unfamiliar, if not alien.
|
||||
</p>
|
||||
<p>
|
||||
However, <span class="bold"><strong>do not panic</strong></span>, both definition
|
||||
and usage are not really very different.
|
||||
</p>
|
||||
<p>
|
||||
A very simple example of generating the same values as the <a href="http://nag.com/numeric/CL/CLdescription.asp" target="_top">NAG
|
||||
C library</a> for the binomial distribution follows. (If you find slightly
|
||||
different values, the Boost C++ version, using double or better, is very
|
||||
likely to be the more accurate. Of course, accuracy is not usually a concern
|
||||
for most applications of this function).
|
||||
</p>
|
||||
<p>
|
||||
The <a href="http://www.nag.co.uk/numeric/cl/manual/pdf/G01/g01bjc.pdf" target="_top">NAG
|
||||
function specification</a> is
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">nag_binomial_dist</span><span class="special">(</span><span class="identifier">Integer</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">Integer</span> <span class="identifier">k</span><span class="special">,</span>
|
||||
<span class="keyword">double</span> <span class="special">*</span><span class="identifier">plek</span><span class="special">,</span> <span class="keyword">double</span> <span class="special">*</span><span class="identifier">pgtk</span><span class="special">,</span> <span class="keyword">double</span> <span class="special">*</span><span class="identifier">peqk</span><span class="special">,</span> <span class="identifier">NagError</span> <span class="special">*</span><span class="identifier">fail</span><span class="special">)</span>
|
||||
</pre>
|
||||
<p>
|
||||
and is called
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">g01bjc</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">k</span><span class="special">,</span> <span class="special">&</span><span class="identifier">plek</span><span class="special">,</span> <span class="special">&</span><span class="identifier">pgtk</span><span class="special">,</span> <span class="special">&</span><span class="identifier">peqk</span><span class="special">,</span> <span class="identifier">NAGERR_DEFAULT</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
The equivalent using this Boost C++ library is:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span> <span class="comment">// Using declaration avoids very long names.</span>
|
||||
<span class="identifier">binomial</span> <span class="identifier">my_dist</span><span class="special">(</span><span class="number">4</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> <span class="comment">// c.f. NAG n = 4, p = 0.5</span>
|
||||
</pre>
|
||||
<p>
|
||||
and values can be output thus:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span>
|
||||
<span class="special"><<</span> <span class="identifier">my_dist</span><span class="special">.</span><span class="identifier">trials</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" "</span> <span class="comment">// Echo the NAG input n = 4 trials.</span>
|
||||
<span class="special"><<</span> <span class="identifier">my_dist</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" "</span> <span class="comment">// Echo the NAG input p = 0.5</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">my_dist</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" "</span> <span class="comment">// NAG plek with k = 2</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">my_dist</span><span class="special">,</span> <span class="number">2</span><span class="special">))</span> <span class="special"><<</span> <span class="string">" "</span> <span class="comment">// NAG pgtk with k = 2</span>
|
||||
<span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">my_dist</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// NAG peqk with k = 2</span>
|
||||
</pre>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">k</span><span class="special">)</span></code> is
|
||||
equivalent to NAG library <code class="computeroutput"><span class="identifier">plek</span></code>,
|
||||
lower tail probability of <= k
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">k</span><span class="special">))</span></code> is
|
||||
equivalent to NAG library <code class="computeroutput"><span class="identifier">pgtk</span></code>,
|
||||
upper tail probability of > k
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">pdf</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">k</span><span class="special">)</span></code> is
|
||||
equivalent to NAG library <code class="computeroutput"><span class="identifier">peqk</span></code>,
|
||||
point probability of == k
|
||||
</p>
|
||||
<p>
|
||||
See <a href="../../../../../example/binomial_example_nag.cpp" target="_top">binomial_example_nag.cpp</a>
|
||||
for details.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="find_eg/find_mean_and_sd_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="c_sharp.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,53 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Non Central Chi Squared Example</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example">
|
||||
<link rel="next" href="nccs_eg/nccs_power_eg.html" title="Tables of the power function of the chi2 test.">
|
||||
</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="inverse_chi_squared_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="nccs_eg/nccs_power_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.nccs_eg"></a><a class="link" href="nccs_eg.html" title="Non Central Chi Squared Example">Non Central Chi
|
||||
Squared Example</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc"><dt><span class="section"><a href="nccs_eg/nccs_power_eg.html">Tables
|
||||
of the power function of the chi<sup>2</sup> test.</a></span></dt></dl></div>
|
||||
<p>
|
||||
(See also the reference documentation for the <a class="link" href="../../dist_ref/dists/nc_chi_squared_dist.html" title="Noncentral Chi-Squared Distribution">Noncentral
|
||||
Chi Squared Distribution</a>.)
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="inverse_chi_squared_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="nccs_eg/nccs_power_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,62 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Negative Binomial Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="geometric_eg.html" title="Geometric Distribution Examples">
|
||||
<link rel="next" href="neg_binom_eg/neg_binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial 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="geometric_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/neg_binom_conf.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.neg_binom_eg"></a><a class="link" href="neg_binom_eg.html" title="Negative Binomial Distribution Examples">Negative Binomial
|
||||
Distribution Examples</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc">
|
||||
<dt><span class="section"><a href="neg_binom_eg/neg_binom_conf.html">Calculating
|
||||
Confidence Limits on the Frequency of Occurrence for the Negative Binomial
|
||||
Distribution</a></span></dt>
|
||||
<dt><span class="section"><a href="neg_binom_eg/neg_binom_size_eg.html">Estimating
|
||||
Sample Sizes for the Negative Binomial.</a></span></dt>
|
||||
<dt><span class="section"><a href="neg_binom_eg/negative_binomial_example1.html">Negative
|
||||
Binomial Sales Quota Example.</a></span></dt>
|
||||
<dt><span class="section"><a href="neg_binom_eg/negative_binomial_example2.html">Negative
|
||||
Binomial Table Printing Example.</a></span></dt>
|
||||
</dl></div>
|
||||
<p>
|
||||
(See also the reference documentation for the <a class="link" href="../../dist_ref/dists/negative_binomial_dist.html" title="Negative Binomial Distribution">Negative
|
||||
Binomial Distribution</a>.)
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="geometric_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/neg_binom_conf.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,221 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial Distribution</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../neg_binom_eg.html" title="Negative Binomial Distribution Examples">
|
||||
<link rel="prev" href="../neg_binom_eg.html" title="Negative Binomial Distribution Examples">
|
||||
<link rel="next" href="neg_binom_size_eg.html" title="Estimating Sample Sizes for the Negative Binomial.">
|
||||
</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="../neg_binom_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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_size_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.neg_binom_eg.neg_binom_conf"></a><a class="link" href="neg_binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial Distribution">Calculating
|
||||
Confidence Limits on the Frequency of Occurrence for the Negative Binomial
|
||||
Distribution</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine you have a process that follows a negative binomial distribution:
|
||||
for each trial conducted, an event either occurs or does it does not,
|
||||
referred to as "successes" and "failures". The frequency
|
||||
with which successes occur is variously referred to as the success fraction,
|
||||
success ratio, success percentage, occurrence frequency, or probability
|
||||
of occurrence.
|
||||
</p>
|
||||
<p>
|
||||
If, by experiment, you want to measure the the best estimate of success
|
||||
fraction is given simply by <span class="emphasis"><em>k</em></span> / <span class="emphasis"><em>N</em></span>,
|
||||
for <span class="emphasis"><em>k</em></span> successes out of <span class="emphasis"><em>N</em></span> trials.
|
||||
</p>
|
||||
<p>
|
||||
However our confidence in that estimate will be shaped by how many trials
|
||||
were conducted, and how many successes were observed. The static member
|
||||
functions <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_lower_bound_on_p</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span><span class="special"><>::</span><span class="identifier">find_upper_bound_on_p</span></code>
|
||||
allow you to calculate the confidence intervals for your estimate of
|
||||
the success fraction.
|
||||
</p>
|
||||
<p>
|
||||
The sample program <a href="../../../../../../example/neg_binom_confidence_limits.cpp" target="_top">neg_binom_confidence_limits.cpp</a>
|
||||
illustrates their use.
|
||||
</p>
|
||||
<p>
|
||||
First we need some includes to access the negative binomial distribution
|
||||
(and some basic std output of course).
|
||||
</p>
|
||||
<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">negative_binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<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> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">left</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>
|
||||
</pre>
|
||||
<p>
|
||||
First define a table of significance levels: these are the probabilities
|
||||
that the true occurrence frequency lies outside the calculated interval:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Confidence value as % is (1 - alpha) * 100, so alpha 0.05 == 95% confidence
|
||||
that the true occurrence frequency lies <span class="bold"><strong>inside</strong></span>
|
||||
the calculated interval.
|
||||
</p>
|
||||
<p>
|
||||
We need a function to calculate and print confidence limits for an observed
|
||||
frequency of occurrence that follows a negative binomial distribution.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">confidence_limits_on_frequency</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">trials</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">successes</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// trials = Total number of trials.</span>
|
||||
<span class="comment">// successes = Total number of observed successes.</span>
|
||||
<span class="comment">// failures = trials - successes.</span>
|
||||
<span class="comment">// success_fraction = successes /trials.</span>
|
||||
<span class="comment">// Print out general info:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"______________________________________________\n"</span>
|
||||
<span class="string">"2-Sided Confidence Limits For Success Fraction\n"</span>
|
||||
<span class="string">"______________________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">7</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of trials"</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">trials</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of successes"</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">successes</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of failures"</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="identifier">trials</span> <span class="special">-</span> <span class="identifier">successes</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Observed frequency of occurrence"</span> <span class="special"><<</span> <span class="string">" = "</span> <span class="special"><<</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">successes</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">trials</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Print table header:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n\n"</span>
|
||||
<span class="string">"___________________________________________\n"</span>
|
||||
<span class="string">"Confidence Lower Upper\n"</span>
|
||||
<span class="string">" Value (%) Limit Limit\n"</span>
|
||||
<span class="string">"___________________________________________\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
And now for the important part - the bounds themselves. For each value
|
||||
of <span class="emphasis"><em>alpha</em></span>, we call <code class="computeroutput"><span class="identifier">find_lower_bound_on_p</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">find_upper_bound_on_p</span></code>
|
||||
to obtain lower and upper bounds respectively. Note that since we are
|
||||
calculating a two-sided interval, we must divide the value of alpha in
|
||||
two. Had we been calculating a single-sided interval, for example: <span class="emphasis"><em>"Calculate
|
||||
a lower bound so that we are P% sure that the true occurrence frequency
|
||||
is greater than some value"</em></span> then we would <span class="bold"><strong>not</strong></span>
|
||||
have divided by two.
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="comment">// Now print out the upper and lower limits for the alpha table values.</span>
|
||||
<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// Confidence value:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="comment">// Calculate bounds:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">lower</span> <span class="special">=</span> <span class="identifier">negative_binomial</span><span class="special">::</span><span class="identifier">find_lower_bound_on_p</span><span class="special">(</span><span class="identifier">trials</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">upper</span> <span class="special">=</span> <span class="identifier">negative_binomial</span><span class="special">::</span><span class="identifier">find_upper_bound_on_p</span><span class="special">(</span><span class="identifier">trials</span><span class="special">,</span> <span class="identifier">successes</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">);</span>
|
||||
<span class="comment">// Print limits:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">lower</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">upper</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// void confidence_limits_on_frequency(unsigned trials, unsigned successes)</span>
|
||||
</pre>
|
||||
<p>
|
||||
And then call confidence_limits_on_frequency with increasing numbers
|
||||
of trials, but always the same success fraction 0.1, or 1 in 10.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">confidence_limits_on_frequency</span><span class="special">(</span><span class="number">20</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span> <span class="comment">// 20 trials, 2 successes, 2 in 20, = 1 in 10 = 0.1 success fraction.</span>
|
||||
<span class="identifier">confidence_limits_on_frequency</span><span class="special">(</span><span class="number">200</span><span class="special">,</span> <span class="number">20</span><span class="special">);</span> <span class="comment">// More trials, but same 0.1 success fraction.</span>
|
||||
<span class="identifier">confidence_limits_on_frequency</span><span class="special">(</span><span class="number">2000</span><span class="special">,</span> <span class="number">200</span><span class="special">);</span> <span class="comment">// Many more trials, but same 0.1 success fraction.</span>
|
||||
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// int main()</span>
|
||||
</pre>
|
||||
<p>
|
||||
Let's see some sample output for a 1 in 10 success ratio, first for a
|
||||
mere 20 trials:
|
||||
</p>
|
||||
<pre class="programlisting">______________________________________________
|
||||
2-Sided Confidence Limits For Success Fraction
|
||||
______________________________________________
|
||||
Number of trials = 20
|
||||
Number of successes = 2
|
||||
Number of failures = 18
|
||||
Observed frequency of occurrence = 0.1
|
||||
___________________________________________
|
||||
Confidence Lower Upper
|
||||
Value (%) Limit Limit
|
||||
___________________________________________
|
||||
50.000 0.04812 0.13554
|
||||
75.000 0.03078 0.17727
|
||||
90.000 0.01807 0.22637
|
||||
95.000 0.01235 0.26028
|
||||
99.000 0.00530 0.33111
|
||||
99.900 0.00164 0.41802
|
||||
99.990 0.00051 0.49202
|
||||
99.999 0.00016 0.55574
|
||||
</pre>
|
||||
<p>
|
||||
As you can see, even at the 95% confidence level the bounds (0.012 to
|
||||
0.26) are really very wide, and very asymmetric about the observed value
|
||||
0.1.
|
||||
</p>
|
||||
<p>
|
||||
Compare that with the program output for a mass 2000 trials:
|
||||
</p>
|
||||
<pre class="programlisting">______________________________________________
|
||||
2-Sided Confidence Limits For Success Fraction
|
||||
______________________________________________
|
||||
Number of trials = 2000
|
||||
Number of successes = 200
|
||||
Number of failures = 1800
|
||||
Observed frequency of occurrence = 0.1
|
||||
___________________________________________
|
||||
Confidence Lower Upper
|
||||
Value (%) Limit Limit
|
||||
___________________________________________
|
||||
50.000 0.09536 0.10445
|
||||
75.000 0.09228 0.10776
|
||||
90.000 0.08916 0.11125
|
||||
95.000 0.08720 0.11352
|
||||
99.000 0.08344 0.11802
|
||||
99.900 0.07921 0.12336
|
||||
99.990 0.07577 0.12795
|
||||
99.999 0.07282 0.13206
|
||||
</pre>
|
||||
<p>
|
||||
Now even when the confidence level is very high, the limits (at 99.999%,
|
||||
0.07 to 0.13) are really quite close and nearly symmetric to the observed
|
||||
value of 0.1.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../neg_binom_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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_size_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,207 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Estimating Sample Sizes for the Negative Binomial.</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../neg_binom_eg.html" title="Negative Binomial Distribution Examples">
|
||||
<link rel="prev" href="neg_binom_conf.html" title="Calculating Confidence Limits on the Frequency of Occurrence for the Negative Binomial Distribution">
|
||||
<link rel="next" href="negative_binomial_example1.html" title="Negative Binomial Sales Quota Example.">
|
||||
</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="neg_binom_conf.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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="negative_binomial_example1.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.neg_binom_eg.neg_binom_size_eg"></a><a class="link" href="neg_binom_size_eg.html" title="Estimating Sample Sizes for the Negative Binomial.">Estimating
|
||||
Sample Sizes for the Negative Binomial.</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine you have an event (let's call it a "failure" - though
|
||||
we could equally well call it a success if we felt it was a 'good' event)
|
||||
that you know will occur in 1 in N trials. You may want to know how many
|
||||
trials you need to conduct to be P% sure of observing at least k such
|
||||
failures. If the failure events follow a negative binomial distribution
|
||||
(each trial either succeeds or fails) then the static member function
|
||||
<code class="computeroutput"><span class="identifier">negative_binomial_distibution</span><span class="special"><>::</span><span class="identifier">find_minimum_number_of_trials</span></code>
|
||||
can be used to estimate the minimum number of trials required to be P%
|
||||
sure of observing the desired number of failures.
|
||||
</p>
|
||||
<p>
|
||||
The example program <a href="../../../../../../example/neg_binomial_sample_sizes.cpp" target="_top">neg_binomial_sample_sizes.cpp</a>
|
||||
demonstrates its usage.
|
||||
</p>
|
||||
<p>
|
||||
It centres around a routine that prints out a table of minimum sample
|
||||
sizes (number of trials) for various probability thresholds:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="keyword">double</span> <span class="identifier">failures</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">p</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
First define a table of significance levels: these are the maximum acceptable
|
||||
probability that <span class="emphasis"><em>failure</em></span> or fewer events will be
|
||||
observed.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Confidence value as % is (1 - alpha) * 100, so alpha 0.05 == 95% confidence
|
||||
that the desired number of failures will be observed. The values range
|
||||
from a very low 0.5 or 50% confidence up to an extremely high confidence
|
||||
of 99.999.
|
||||
</p>
|
||||
<p>
|
||||
Much of the rest of the program is pretty-printing, the important part
|
||||
is in the calculation of minimum number of trials required for each value
|
||||
of alpha using:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="special">(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">ceil</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">::</span><span class="identifier">find_minimum_number_of_trials</span><span class="special">(</span><span class="identifier">failures</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
</pre>
|
||||
<p>
|
||||
find_minimum_number_of_trials returns a double, so <code class="computeroutput"><span class="identifier">ceil</span></code>
|
||||
rounds this up to ensure we have an integral minimum number of trials.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="keyword">double</span> <span class="identifier">failures</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// trials = number of trials</span>
|
||||
<span class="comment">// failures = number of failures before achieving required success(es).</span>
|
||||
<span class="comment">// p = success fraction (0 <= p <= 1.).</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Calculate how many trials we need to ensure the</span>
|
||||
<span class="comment">// required number of failures DOES exceed "failures".</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="string">"Target number of failures = "</span> <span class="special"><<</span> <span class="special">(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">failures</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">", Success fraction = "</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="identifier">p</span> <span class="special"><<</span> <span class="string">"%"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Print table header:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"____________________________\n"</span>
|
||||
<span class="string">"Confidence Min Number\n"</span>
|
||||
<span class="string">" Value (%) Of Trials \n"</span>
|
||||
<span class="string">"____________________________\n"</span><span class="special">;</span>
|
||||
<span class="comment">// Now print out the data for the alpha table values.</span>
|
||||
<span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span> <span class="comment">// Confidence values %:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">])</span> <span class="special"><<</span> <span class="string">" "</span>
|
||||
<span class="comment">// find_minimum_number_of_trials</span>
|
||||
<span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">6</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span>
|
||||
<span class="special"><<</span> <span class="special">(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">ceil</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">::</span><span class="identifier">find_minimum_number_of_trials</span><span class="special">(</span><span class="identifier">failures</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]))</span>
|
||||
<span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// void find_number_of_trials(double failures, double p)</span>
|
||||
</pre>
|
||||
<p>
|
||||
finally we can produce some tables of minimum trials for the chosen confidence
|
||||
levels:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span>
|
||||
<span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="number">50</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span>
|
||||
<span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="number">500</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span>
|
||||
<span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="number">50</span><span class="special">,</span> <span class="number">0.1</span><span class="special">);</span>
|
||||
<span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="number">500</span><span class="special">,</span> <span class="number">0.1</span><span class="special">);</span>
|
||||
<span class="identifier">find_number_of_trials</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">0.9</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span> <span class="comment">// int main()</span>
|
||||
</pre>
|
||||
<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>
|
||||
Since we're calculating the <span class="emphasis"><em>minimum</em></span> number of
|
||||
trials required, we'll err on the safe side and take the ceiling of
|
||||
the result. Had we been calculating the <span class="emphasis"><em>maximum</em></span>
|
||||
number of trials permitted to observe less than a certain number of
|
||||
<span class="emphasis"><em>failures</em></span> then we would have taken the floor instead.
|
||||
We would also have called <code class="computeroutput"><span class="identifier">find_minimum_number_of_trials</span></code>
|
||||
like this:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">floor</span><span class="special">(</span><span class="identifier">negative_binomial</span><span class="special">::</span><span class="identifier">find_minimum_number_of_trials</span><span class="special">(</span><span class="identifier">failures</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]))</span>
|
||||
</pre>
|
||||
<p>
|
||||
which would give us the largest number of trials we could conduct and
|
||||
still be P% sure of observing <span class="emphasis"><em>failures or less</em></span>
|
||||
failure events, when the probability of success is <span class="emphasis"><em>p</em></span>.
|
||||
</p>
|
||||
</td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
We'll finish off by looking at some sample output, firstly suppose we
|
||||
wish to observe at least 5 "failures" with a 50/50 (0.5) chance
|
||||
of success or failure:
|
||||
</p>
|
||||
<pre class="programlisting">Target number of failures = 5, Success fraction = 50%
|
||||
|
||||
____________________________
|
||||
Confidence Min Number
|
||||
Value (%) Of Trials
|
||||
____________________________
|
||||
50.000 11
|
||||
75.000 14
|
||||
90.000 17
|
||||
95.000 18
|
||||
99.000 22
|
||||
99.900 27
|
||||
99.990 31
|
||||
99.999 36
|
||||
|
||||
</pre>
|
||||
<p>
|
||||
So 18 trials or more would yield a 95% chance that at least our 5 required
|
||||
failures would be observed.
|
||||
</p>
|
||||
<p>
|
||||
Compare that to what happens if the success ratio is 90%:
|
||||
</p>
|
||||
<pre class="programlisting">Target number of failures = 5.000, Success fraction = 90.000%
|
||||
|
||||
____________________________
|
||||
Confidence Min Number
|
||||
Value (%) Of Trials
|
||||
____________________________
|
||||
50.000 57
|
||||
75.000 73
|
||||
90.000 91
|
||||
95.000 103
|
||||
99.000 127
|
||||
99.900 159
|
||||
99.990 189
|
||||
99.999 217
|
||||
</pre>
|
||||
<p>
|
||||
So now 103 trials are required to observe at least 5 failures with 95%
|
||||
certainty.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="neg_binom_conf.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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="negative_binomial_example1.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
+507
@@ -0,0 +1,507 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Negative Binomial Sales Quota Example.</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../neg_binom_eg.html" title="Negative Binomial Distribution Examples">
|
||||
<link rel="prev" href="neg_binom_size_eg.html" title="Estimating Sample Sizes for the Negative Binomial.">
|
||||
<link rel="next" href="negative_binomial_example2.html" title="Negative Binomial Table Printing Example.">
|
||||
</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="neg_binom_size_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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="negative_binomial_example2.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.neg_binom_eg.negative_binomial_example1"></a><a class="link" href="negative_binomial_example1.html" title="Negative Binomial Sales Quota Example.">Negative
|
||||
Binomial Sales Quota Example.</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
This example program <a href="../../../../../../example/negative_binomial_example1.cpp" target="_top">negative_binomial_example1.cpp
|
||||
(full source code)</a> demonstrates a simple use to find the probability
|
||||
of meeting a sales quota.
|
||||
</p>
|
||||
<p>
|
||||
Based on <a href="http://en.wikipedia.org/wiki/Negative_binomial_distribution" target="_top">a
|
||||
problem by Dr. Diane Evans, Professor of Mathematics at Rose-Hulman Institute
|
||||
of Technology</a>.
|
||||
</p>
|
||||
<p>
|
||||
Pat is required to sell candy bars to raise money for the 6th grade field
|
||||
trip. There are thirty houses in the neighborhood, and Pat is not supposed
|
||||
to return home until five candy bars have been sold. So the child goes
|
||||
door to door, selling candy bars. At each house, there is a 0.4 probability
|
||||
(40%) of selling one candy bar and a 0.6 probability (60%) of selling
|
||||
nothing.
|
||||
</p>
|
||||
<p>
|
||||
What is the probability mass (density) function (pdf) for selling the
|
||||
last (fifth) candy bar at the nth house?
|
||||
</p>
|
||||
<p>
|
||||
The Negative Binomial(r, p) distribution describes the probability of
|
||||
k failures and r successes in k+r Bernoulli(p) trials with success on
|
||||
the last trial. (A <a href="http://en.wikipedia.org/wiki/Bernoulli_distribution" target="_top">Bernoulli
|
||||
trial</a> is one with only two possible outcomes, success of failure,
|
||||
and p is the probability of success). See also <a href="http://en.wikipedia.org/wiki/Bernoulli_distribution" target="_top">Bernoulli
|
||||
distribution</a> and <a href="http://www.math.uah.edu/stat/bernoulli/Introduction.xhtml" target="_top">Bernoulli
|
||||
applications</a>.
|
||||
</p>
|
||||
<p>
|
||||
In this example, we will deliberately produce a variety of calculations
|
||||
and outputs to demonstrate the ways that the negative binomial distribution
|
||||
can be implemented with this library: it is also deliberately over-commented.
|
||||
</p>
|
||||
<p>
|
||||
First we need to #define macros to control the error and discrete handling
|
||||
policies. For this simple example, we want to avoid throwing an exception
|
||||
(the default policy) and just return infinity. We want to treat the distribution
|
||||
as if it was continuous, so we choose a discrete_quantile policy of real,
|
||||
rather than the default policy integer_round_outwards.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_OVERFLOW_ERROR_POLICY</span> <span class="identifier">ignore_error</span>
|
||||
<span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DISCRETE_QUANTILE_POLICY</span> <span class="identifier">real</span>
|
||||
</pre>
|
||||
<p>
|
||||
After that we need some includes to provide easy access to the negative
|
||||
binomial distribution,
|
||||
</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>
|
||||
It is vital to #include distributions etc <span class="bold"><strong>after</strong></span>
|
||||
the above #defines
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
and we need some std library iostream, of course.
|
||||
</p>
|
||||
<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">negative_binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="comment">// for negative_binomial_distribution</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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>
|
||||
<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>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<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>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
It is always sensible to use try and catch blocks because defaults policies
|
||||
are to throw an exception if anything goes wrong.
|
||||
</p>
|
||||
<p>
|
||||
A simple catch block (see below) will ensure that you get a helpful error
|
||||
message instead of an abrupt program abort.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
Selling five candy bars means getting five successes, so successes r
|
||||
= 5. The total number of trials (n, in this case, houses visited) this
|
||||
takes is therefore = sucesses + failures or k + r = k + 5.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">sales_quota</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span> <span class="comment">// Pat's sales quota - successes (r).</span>
|
||||
</pre>
|
||||
<p>
|
||||
At each house, there is a 0.4 probability (40%) of selling one candy
|
||||
bar and a 0.6 probability (60%) of selling nothing.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">success_fraction</span> <span class="special">=</span> <span class="number">0.4</span><span class="special">;</span> <span class="comment">// success_fraction (p) - so failure_fraction is 0.6.</span>
|
||||
</pre>
|
||||
<p>
|
||||
The Negative Binomial(r, p) distribution describes the probability of
|
||||
k failures and r successes in k+r Bernoulli(p) trials with success on
|
||||
the last trial. (A <a href="http://en.wikipedia.org/wiki/Bernoulli_distribution" target="_top">Bernoulli
|
||||
trial</a> is one with only two possible outcomes, success of failure,
|
||||
and p is the probability of success).
|
||||
</p>
|
||||
<p>
|
||||
We therefore start by constructing a negative binomial distribution with
|
||||
parameters sales_quota (required successes) and probability of success.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">nb</span><span class="special">(</span><span class="identifier">sales_quota</span><span class="special">,</span> <span class="identifier">success_fraction</span><span class="special">);</span> <span class="comment">// type double by default.</span>
|
||||
</pre>
|
||||
<p>
|
||||
To confirm, display the success_fraction & successes parameters of
|
||||
the distribution.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Pat has a sales per house success rate of "</span> <span class="special"><<</span> <span class="identifier">success_fraction</span>
|
||||
<span class="special"><<</span> <span class="string">".\nTherefore he would, on average, sell "</span> <span class="special"><<</span> <span class="identifier">nb</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">()</span> <span class="special">*</span> <span class="number">100</span>
|
||||
<span class="special"><<</span> <span class="string">" bars after trying 100 houses."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">all_houses</span> <span class="special">=</span> <span class="number">30</span><span class="special">;</span> <span class="comment">// The number of houses on the estate.</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"With a success rate of "</span> <span class="special"><<</span> <span class="identifier">nb</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", he might expect, on average,\n"</span>
|
||||
<span class="string">"to need to visit about "</span> <span class="special"><<</span> <span class="identifier">success_fraction</span> <span class="special">*</span> <span class="identifier">all_houses</span>
|
||||
<span class="special"><<</span> <span class="string">" houses in order to sell all "</span> <span class="special"><<</span> <span class="identifier">nb</span><span class="special">.</span><span class="identifier">successes</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" bars. "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Pat has a sales per house success rate of 0.4.
|
||||
Therefore he would, on average, sell 40 bars after trying 100 houses.
|
||||
With a success rate of 0.4, he might expect, on average,
|
||||
to need to visit about 12 houses in order to sell all 5 bars.
|
||||
</pre>
|
||||
<p>
|
||||
The random variable of interest is the number of houses that must be
|
||||
visited to sell five candy bars, so we substitute k = n - 5 into a negative_binomial(5,
|
||||
0.4) and obtain the <a class="link" href="../../../dist_ref/nmp.html#math_toolkit.dist_ref.nmp.pdf">Probability
|
||||
Density Function</a> of the distribution of houses visited. Obviously,
|
||||
the best possible case is that Pat makes sales on all the first five
|
||||
houses.
|
||||
</p>
|
||||
<p>
|
||||
We calculate this using the pdf function:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes on the "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="string">"th house is "</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">5</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// == pdf(nb, 0)</span>
|
||||
</pre>
|
||||
<p>
|
||||
Of course, he could not finish on fewer than 5 houses because he must
|
||||
sell 5 candy bars. So the 5th house is the first that he could possibly
|
||||
finish on.
|
||||
</p>
|
||||
<p>
|
||||
To finish on or before the 8th house, Pat must finish at the 5th, 6th,
|
||||
7th or 8th house. The probability that he will finish on <span class="bold"><strong>exactly</strong></span>
|
||||
( == ) on any house is the Probability Density Function (pdf).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes on the 6th house is "</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">6</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes on the 7th house is "</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">7</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes on the 8th house is "</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">8</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability that Pat finishes on the 6th house is 0.03072
|
||||
Probability that Pat finishes on the 7th house is 0.055296
|
||||
Probability that Pat finishes on the 8th house is 0.077414
|
||||
</pre>
|
||||
<p>
|
||||
The sum of the probabilities for these houses is the Cumulative Distribution
|
||||
Function (cdf). We can calculate it by adding the individual probabilities.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes on or before the 8th house is sum "</span>
|
||||
<span class="string">"\n"</span> <span class="special"><<</span> <span class="string">"pdf(sales_quota) + pdf(6) + pdf(7) + pdf(8) = "</span>
|
||||
<span class="comment">// Sum each of the mass/density probabilities for houses sales_quota = 5, 6, 7, & 8.</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">5</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="comment">// 0 failures.</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">6</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="comment">// 1 failure.</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">7</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="comment">// 2 failures.</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">8</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="comment">// 3 failures.</span>
|
||||
<span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">pdf(sales_quota) + pdf(6) + pdf(7) + pdf(8) = 0.17367
|
||||
</pre>
|
||||
<p>
|
||||
Or, usually better, by using the negative binomial <span class="bold"><strong>cumulative</strong></span>
|
||||
distribution function.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability of selling his quota of "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="string">" bars\non or before the "</span> <span class="special"><<</span> <span class="number">8</span> <span class="special"><<</span> <span class="string">"th house is "</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">8</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of selling his quota of 5 bars on or before the 8th house is 0.17367
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability that Pat finishes exactly on the 10th house is "</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">10</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability of selling his quota of "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="string">" bars\non or before the "</span> <span class="special"><<</span> <span class="number">10</span> <span class="special"><<</span> <span class="string">"th house is "</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">10</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability that Pat finishes exactly on the 10th house is 0.10033
|
||||
Probability of selling his quota of 5 bars on or before the 10th house is 0.3669
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes exactly on the 11th house is "</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">11</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability of selling his quota of "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="string">" bars\non or before the "</span> <span class="special"><<</span> <span class="number">11</span> <span class="special"><<</span> <span class="string">"th house is "</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">11</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability that Pat finishes on the 11th house is 0.10033
|
||||
Probability of selling his quota of 5 candy bars
|
||||
on or before the 11th house is 0.46723
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes exactly on the 12th house is "</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">12</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability of selling his quota of "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="string">" bars\non or before the "</span> <span class="special"><<</span> <span class="number">12</span> <span class="special"><<</span> <span class="string">"th house is "</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">12</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability that Pat finishes on the 12th house is 0.094596
|
||||
Probability of selling his quota of 5 candy bars
|
||||
on or before the 12th house is 0.56182
|
||||
</pre>
|
||||
<p>
|
||||
Finally consider the risk of Pat not selling his quota of 5 bars even
|
||||
after visiting all the houses. Calculate the probability that he <span class="emphasis"><em>will</em></span>
|
||||
sell on or before the last house: Calculate the probability that he would
|
||||
sell all his quota on the very last house.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability that Pat finishes on the "</span> <span class="special"><<</span> <span class="identifier">all_houses</span>
|
||||
<span class="special"><<</span> <span class="string">" house is "</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="identifier">all_houses</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Probability of selling his quota of 5 bars on the 30th house is
|
||||
</p>
|
||||
<pre class="programlisting">Probability that Pat finishes on the 30 house is 0.00069145
|
||||
</pre>
|
||||
<p>
|
||||
when he'd be very unlucky indeed!
|
||||
</p>
|
||||
<p>
|
||||
What is the probability that Pat exhausts all 30 houses in the neighborhood,
|
||||
and <span class="bold"><strong>still</strong></span> doesn't sell the required
|
||||
5 candy bars?
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability of selling his quota of "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="string">" bars\non or before the "</span> <span class="special"><<</span> <span class="identifier">all_houses</span> <span class="special"><<</span> <span class="string">"th house is "</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="identifier">all_houses</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of selling his quota of 5 bars
|
||||
on or before the 30th house is 0.99849
|
||||
</pre>
|
||||
<p>
|
||||
/*<code class="computeroutput"><span class="identifier">So</span> <span class="identifier">the</span>
|
||||
<span class="identifier">risk</span> <span class="identifier">of</span>
|
||||
<span class="identifier">failing</span> <span class="identifier">even</span>
|
||||
<span class="identifier">after</span> <span class="identifier">visiting</span>
|
||||
<span class="identifier">all</span> <span class="identifier">the</span>
|
||||
<span class="identifier">houses</span> <span class="identifier">is</span>
|
||||
<span class="number">1</span> <span class="special">-</span> <span class="keyword">this</span> <span class="identifier">probability</span><span class="special">,</span> </code><code class="computeroutput"><span class="number">1</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="identifier">all_houses</span>
|
||||
<span class="special">-</span> <span class="identifier">sales_quota</span></code><code class="computeroutput">
|
||||
<span class="identifier">But</span> <span class="keyword">using</span>
|
||||
<span class="keyword">this</span> <span class="identifier">expression</span>
|
||||
<span class="identifier">may</span> <span class="identifier">cause</span>
|
||||
<span class="identifier">serious</span> <span class="identifier">inaccuracy</span><span class="special">,</span> <span class="identifier">so</span> <span class="identifier">it</span> <span class="identifier">would</span>
|
||||
<span class="identifier">be</span> <span class="identifier">much</span>
|
||||
<span class="identifier">better</span> <span class="identifier">to</span>
|
||||
<span class="identifier">use</span> <span class="identifier">the</span>
|
||||
<span class="identifier">complement</span> <span class="identifier">of</span>
|
||||
<span class="identifier">the</span> <span class="identifier">cdf</span><span class="special">:</span> <span class="identifier">So</span> <span class="identifier">the</span> <span class="identifier">risk</span>
|
||||
<span class="identifier">of</span> <span class="identifier">failing</span>
|
||||
<span class="identifier">even</span> <span class="identifier">at</span><span class="special">,</span> <span class="keyword">or</span> <span class="identifier">after</span><span class="special">,</span> <span class="identifier">the</span> <span class="number">31</span><span class="identifier">th</span> <span class="special">(</span><span class="identifier">non</span><span class="special">-</span><span class="identifier">existent</span><span class="special">)</span>
|
||||
<span class="identifier">houses</span> <span class="identifier">is</span>
|
||||
<span class="number">1</span> <span class="special">-</span> <span class="keyword">this</span> <span class="identifier">probability</span><span class="special">,</span> </code><code class="computeroutput"><span class="number">1</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="identifier">all_houses</span>
|
||||
<span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span></code>` But using this expression may cause
|
||||
serious inaccuracy. So it would be much better to use the __complement
|
||||
of the cdf (see <a class="link" href="../../overview/complements.html#why_complements">why complements?</a>).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nProbability of failing to sell his quota of "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="string">" bars\neven after visiting all "</span> <span class="special"><<</span> <span class="identifier">all_houses</span> <span class="special"><<</span> <span class="string">" houses is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="identifier">all_houses</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of failing to sell his quota of 5 bars
|
||||
even after visiting all 30 houses is 0.0015101
|
||||
</pre>
|
||||
<p>
|
||||
We can also use the quantile (percentile), the inverse of the cdf, to
|
||||
predict which house Pat will finish on. So for the 8th house:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">p</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="special">(</span><span class="number">8</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">));</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability of meeting sales quota on or before 8th house is "</span><span class="special"><<</span> <span class="identifier">p</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">Probability of meeting sales quota on or before 8th house is 0.174
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If the confidence of meeting sales quota is "</span> <span class="special"><<</span> <span class="identifier">p</span>
|
||||
<span class="special"><<</span> <span class="string">", then the finishing house is "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span><span class="special"><<</span> <span class="string">" quantile(nb, p) = "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">If the confidence of meeting sales quota is 0.17367, then the finishing house is 8
|
||||
</pre>
|
||||
<p>
|
||||
Demanding absolute certainty that all 5 will be sold, implies an infinite
|
||||
number of trials. (Of course, there are only 30 houses on the estate,
|
||||
so he can't ever be <span class="bold"><strong>certain</strong></span> of selling
|
||||
his quota).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If the confidence of meeting sales quota is "</span> <span class="special"><<</span> <span class="number">1.</span>
|
||||
<span class="special"><<</span> <span class="string">", then the finishing house is "</span> <span class="special"><<</span> <span class="identifier">quantile</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">sales_quota</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// 1.#INF == infinity.</span>
|
||||
</pre>
|
||||
<pre class="programlisting">If the confidence of meeting sales quota is 1, then the finishing house is 1.#INF
|
||||
</pre>
|
||||
<p>
|
||||
And similarly for a few other probabilities:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If the confidence of meeting sales quota is "</span> <span class="special"><<</span> <span class="number">0.</span>
|
||||
<span class="special"><<</span> <span class="string">", then the finishing house is "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="number">0.</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If the confidence of meeting sales quota is "</span> <span class="special"><<</span> <span class="number">0.5</span>
|
||||
<span class="special"><<</span> <span class="string">", then the finishing house is "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="number">0.5</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If the confidence of meeting sales quota is "</span> <span class="special"><<</span> <span class="number">1</span> <span class="special">-</span> <span class="number">0.00151</span> <span class="comment">// 30 th</span>
|
||||
<span class="special"><<</span> <span class="string">", then the finishing house is "</span> <span class="special"><<</span> <span class="identifier">quantile</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="number">0.00151</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">If the confidence of meeting sales quota is 0, then the finishing house is 5
|
||||
If the confidence of meeting sales quota is 0.5, then the finishing house is 11.337
|
||||
If the confidence of meeting sales quota is 0.99849, then the finishing house is 30
|
||||
</pre>
|
||||
<p>
|
||||
Notice that because we chose a discrete quantile policy of real, the
|
||||
result can be an 'unreal' fractional house.
|
||||
</p>
|
||||
<p>
|
||||
If the opposite is true, we don't want to assume any confidence, then
|
||||
this is tantamount to assuming that all the first sales_quota trials
|
||||
will be successful sales.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If confidence of meeting quota is zero\n(we assume all houses are successful sales)"</span>
|
||||
<span class="string">", then finishing house is "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">If confidence of meeting quota is zero (we assume all houses are successful sales), then finishing house is 5
|
||||
If confidence of meeting quota is 0, then finishing house is 5
|
||||
</pre>
|
||||
<p>
|
||||
We can list quantiles for a few probabilities:
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="keyword">double</span> <span class="identifier">ps</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">0.</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.9</span><span class="special">,</span> <span class="number">0.95</span><span class="special">,</span> <span class="number">0.99</span><span class="special">,</span> <span class="number">0.999</span><span class="special">,</span> <span class="number">1.</span><span class="special">};</span>
|
||||
<span class="comment">// Confidence as fraction = 1-alpha, as percent = 100 * (1-alpha[i]) %</span>
|
||||
<span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">ps</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">ps</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="identifier">i</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If confidence of meeting quota is "</span> <span class="special"><<</span> <span class="identifier">ps</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span>
|
||||
<span class="special"><<</span> <span class="string">", then finishing house is "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="identifier">ps</span><span class="special">[</span><span class="identifier">i</span><span class="special">])</span> <span class="special">+</span> <span class="identifier">sales_quota</span>
|
||||
<span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<pre class="programlisting">If confidence of meeting quota is 0, then finishing house is 5
|
||||
If confidence of meeting quota is 0.001, then finishing house is 5
|
||||
If confidence of meeting quota is 0.01, then finishing house is 5
|
||||
If confidence of meeting quota is 0.05, then finishing house is 6.2
|
||||
If confidence of meeting quota is 0.1, then finishing house is 7.06
|
||||
If confidence of meeting quota is 0.5, then finishing house is 11.3
|
||||
If confidence of meeting quota is 0.9, then finishing house is 17.8
|
||||
If confidence of meeting quota is 0.95, then finishing house is 20.1
|
||||
If confidence of meeting quota is 0.99, then finishing house is 24.8
|
||||
If confidence of meeting quota is 0.999, then finishing house is 31.1
|
||||
If confidence of meeting quota is 1, then finishing house is 1.#INF
|
||||
</pre>
|
||||
<p>
|
||||
We could have applied a ceil function to obtain a 'worst case' integer
|
||||
value for house.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">ceil</span><span class="special">(</span><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="identifier">ps</span><span class="special">[</span><span class="identifier">i</span><span class="special">]))</span></pre>
|
||||
<p>
|
||||
Or, if we had used the default discrete quantile policy, integer_outside,
|
||||
by omitting
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_DISCRETE_QUANTILE_POLICY</span> <span class="identifier">real</span></pre>
|
||||
<p>
|
||||
we would have achieved the same effect.
|
||||
</p>
|
||||
<p>
|
||||
The real result gives some suggestion which house is most likely. For
|
||||
example, compare the real and integer_outside for 95% confidence.
|
||||
</p>
|
||||
<pre class="programlisting">If confidence of meeting quota is 0.95, then finishing house is 20.1
|
||||
If confidence of meeting quota is 0.95, then finishing house is 21
|
||||
</pre>
|
||||
<p>
|
||||
The real value 20.1 is much closer to 20 than 21, so integer_outside
|
||||
is pessimistic. We could also use integer_round_nearest policy to suggest
|
||||
that 20 is more likely.
|
||||
</p>
|
||||
<p>
|
||||
Finally, we can tabulate the probability for the last sale being exactly
|
||||
on each house.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nHouse for "</span> <span class="special"><<</span> <span class="identifier">sales_quota</span> <span class="special"><<</span> <span class="string">"th (last) sale. Probability (%)"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<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>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">sales_quota</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">all_houses</span><span class="special">+</span><span class="number">1</span><span class="special">;</span> <span class="identifier">i</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">i</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">8</span><span class="special">)</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="identifier">i</span> <span class="special">-</span> <span class="identifier">sales_quota</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting">House for 5 th (last) sale. Probability (%)
|
||||
5 0.01024
|
||||
6 0.04096
|
||||
7 0.096256
|
||||
8 0.17367
|
||||
9 0.26657
|
||||
10 0.3669
|
||||
11 0.46723
|
||||
12 0.56182
|
||||
13 0.64696
|
||||
14 0.72074
|
||||
15 0.78272
|
||||
16 0.83343
|
||||
17 0.874
|
||||
18 0.90583
|
||||
19 0.93039
|
||||
20 0.94905
|
||||
21 0.96304
|
||||
22 0.97342
|
||||
23 0.98103
|
||||
24 0.98655
|
||||
25 0.99053
|
||||
26 0.99337
|
||||
27 0.99539
|
||||
28 0.99681
|
||||
29 0.9978
|
||||
30 0.99849
|
||||
</pre>
|
||||
<p>
|
||||
As noted above, using a catch block is always a good idea, even if you
|
||||
do not expect to use it.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="special">}</span>
|
||||
<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>
|
||||
<span class="special">{</span> <span class="comment">// Since we have set an overflow policy of ignore_error,</span>
|
||||
<span class="comment">// an overflow exception should never be thrown.</span>
|
||||
<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>
|
||||
</pre>
|
||||
<p>
|
||||
For example, without a ignore domain error policy, if we asked for
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">pdf</span><span class="special">(</span><span class="identifier">nb</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span><span class="special">)</span></pre>
|
||||
<p>
|
||||
for example, we would get:
|
||||
</p>
|
||||
<pre class="programlisting">Message from thrown exception was:
|
||||
Error in function boost::math::pdf(const negative_binomial_distribution<double>&, double):
|
||||
Number of failures argument is -1, but must be >= 0 !
|
||||
</pre>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="neg_binom_size_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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="negative_binomial_example2.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Negative Binomial Table Printing Example.</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../neg_binom_eg.html" title="Negative Binomial Distribution Examples">
|
||||
<link rel="prev" href="negative_binomial_example1.html" title="Negative Binomial Sales Quota Example.">
|
||||
<link rel="next" href="../normal_example.html" title="Normal Distribution Examples">
|
||||
</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="negative_binomial_example1.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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="../normal_example.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.neg_binom_eg.negative_binomial_example2"></a><a class="link" href="negative_binomial_example2.html" title="Negative Binomial Table Printing Example.">Negative
|
||||
Binomial Table Printing Example.</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Example program showing output of a table of values of cdf and pdf for
|
||||
various k failures.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Print a table of values that can be used to plot</span>
|
||||
<span class="comment">// using Excel, or some other superior graphical display tool.</span>
|
||||
|
||||
<span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">17</span><span class="special">);</span> <span class="comment">// Use max_digits10 precision, the maximum available for a reference table.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">showpoint</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// include trailing zeros.</span>
|
||||
<span class="comment">// This is a maximum possible precision for the type (here double) to suit a reference table.</span>
|
||||
<span class="keyword">int</span> <span class="identifier">maxk</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="number">2.</span> <span class="special">*</span> <span class="identifier">mynbdist</span><span class="special">.</span><span class="identifier">successes</span><span class="special">()</span> <span class="special">/</span> <span class="identifier">mynbdist</span><span class="special">.</span><span class="identifier">success_fraction</span><span class="special">());</span>
|
||||
<span class="comment">// This maxk shows most of the range of interest, probability about 0.0001 to 0.999.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="string">" k pdf cdf"</span><span class="string">"\n"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">k</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">k</span> <span class="special"><</span> <span class="identifier">maxk</span><span class="special">;</span> <span class="identifier">k</span><span class="special">++)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">17</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">showpoint</span>
|
||||
<span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">k</span> <span class="special"><<</span> <span class="string">", "</span>
|
||||
<span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">25</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mynbdist</span><span class="special">,</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">k</span><span class="special">))</span>
|
||||
<span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">25</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">mynbdist</span><span class="special">,</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">k</span><span class="special">))</span>
|
||||
<span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<pre class="programlisting"><span class="identifier">k</span> <span class="identifier">pdf</span> <span class="identifier">cdf</span>
|
||||
<span class="number">0</span><span class="special">,</span> <span class="number">1.5258789062500000e-005</span> <span class="number">1.5258789062500003e-005</span>
|
||||
<span class="number">1</span><span class="special">,</span> <span class="number">9.1552734375000000e-005</span> <span class="number">0.00010681152343750000</span>
|
||||
<span class="number">2</span><span class="special">,</span> <span class="number">0.00030899047851562522</span> <span class="number">0.00041580200195312500</span>
|
||||
<span class="number">3</span><span class="special">,</span> <span class="number">0.00077247619628906272</span> <span class="number">0.0011882781982421875</span>
|
||||
<span class="number">4</span><span class="special">,</span> <span class="number">0.0015932321548461918</span> <span class="number">0.0027815103530883789</span>
|
||||
<span class="number">5</span><span class="special">,</span> <span class="number">0.0028678178787231476</span> <span class="number">0.0056493282318115234</span>
|
||||
<span class="number">6</span><span class="special">,</span> <span class="number">0.0046602040529251142</span> <span class="number">0.010309532284736633</span>
|
||||
<span class="number">7</span><span class="special">,</span> <span class="number">0.0069903060793876605</span> <span class="number">0.017299838364124298</span>
|
||||
<span class="number">8</span><span class="special">,</span> <span class="number">0.0098301179241389001</span> <span class="number">0.027129956288263202</span>
|
||||
<span class="number">9</span><span class="special">,</span> <span class="number">0.013106823898851871</span> <span class="number">0.040236780187115073</span>
|
||||
<span class="number">10</span><span class="special">,</span> <span class="number">0.016711200471036140</span> <span class="number">0.056947980658151209</span>
|
||||
<span class="number">11</span><span class="special">,</span> <span class="number">0.020509200578089786</span> <span class="number">0.077457181236241013</span>
|
||||
<span class="number">12</span><span class="special">,</span> <span class="number">0.024354675686481652</span> <span class="number">0.10181185692272265</span>
|
||||
<span class="number">13</span><span class="special">,</span> <span class="number">0.028101548869017230</span> <span class="number">0.12991340579173993</span>
|
||||
<span class="number">14</span><span class="special">,</span> <span class="number">0.031614242477644432</span> <span class="number">0.16152764826938440</span>
|
||||
<span class="number">15</span><span class="special">,</span> <span class="number">0.034775666725408917</span> <span class="number">0.19630331499479325</span>
|
||||
<span class="number">16</span><span class="special">,</span> <span class="number">0.037492515688331451</span> <span class="number">0.23379583068312471</span>
|
||||
<span class="number">17</span><span class="special">,</span> <span class="number">0.039697957787645101</span> <span class="number">0.27349378847076977</span>
|
||||
<span class="number">18</span><span class="special">,</span> <span class="number">0.041352039362130305</span> <span class="number">0.31484582783290005</span>
|
||||
<span class="number">19</span><span class="special">,</span> <span class="number">0.042440250924291580</span> <span class="number">0.35728607875719176</span>
|
||||
<span class="number">20</span><span class="special">,</span> <span class="number">0.042970754060845245</span> <span class="number">0.40025683281803687</span>
|
||||
<span class="number">21</span><span class="special">,</span> <span class="number">0.042970754060845225</span> <span class="number">0.44322758687888220</span>
|
||||
<span class="number">22</span><span class="special">,</span> <span class="number">0.042482450037426581</span> <span class="number">0.48571003691630876</span>
|
||||
<span class="number">23</span><span class="special">,</span> <span class="number">0.041558918514873783</span> <span class="number">0.52726895543118257</span>
|
||||
<span class="number">24</span><span class="special">,</span> <span class="number">0.040260202311284021</span> <span class="number">0.56752915774246648</span>
|
||||
<span class="number">25</span><span class="special">,</span> <span class="number">0.038649794218832620</span> <span class="number">0.60617895196129912</span>
|
||||
<span class="number">26</span><span class="special">,</span> <span class="number">0.036791631035234917</span> <span class="number">0.64297058299653398</span>
|
||||
<span class="number">27</span><span class="special">,</span> <span class="number">0.034747651533277427</span> <span class="number">0.67771823452981139</span>
|
||||
<span class="number">28</span><span class="special">,</span> <span class="number">0.032575923312447595</span> <span class="number">0.71029415784225891</span>
|
||||
<span class="number">29</span><span class="special">,</span> <span class="number">0.030329307911589130</span> <span class="number">0.74062346575384819</span>
|
||||
<span class="number">30</span><span class="special">,</span> <span class="number">0.028054609818219924</span> <span class="number">0.76867807557206813</span>
|
||||
<span class="number">31</span><span class="special">,</span> <span class="number">0.025792141284492545</span> <span class="number">0.79447021685656061</span>
|
||||
<span class="number">32</span><span class="special">,</span> <span class="number">0.023575629142856460</span> <span class="number">0.81804584599941710</span>
|
||||
<span class="number">33</span><span class="special">,</span> <span class="number">0.021432390129869489</span> <span class="number">0.83947823612928651</span>
|
||||
<span class="number">34</span><span class="special">,</span> <span class="number">0.019383705779220189</span> <span class="number">0.85886194190850684</span>
|
||||
<span class="number">35</span><span class="special">,</span> <span class="number">0.017445335201298231</span> <span class="number">0.87630727710980494</span>
|
||||
<span class="number">36</span><span class="special">,</span> <span class="number">0.015628112784496322</span> <span class="number">0.89193538989430121</span>
|
||||
<span class="number">37</span><span class="special">,</span> <span class="number">0.013938587078064250</span> <span class="number">0.90587397697236549</span>
|
||||
<span class="number">38</span><span class="special">,</span> <span class="number">0.012379666154859701</span> <span class="number">0.91825364312722524</span>
|
||||
<span class="number">39</span><span class="special">,</span> <span class="number">0.010951243136991251</span> <span class="number">0.92920488626421649</span>
|
||||
<span class="number">40</span><span class="special">,</span> <span class="number">0.0096507830144735539</span> <span class="number">0.93885566927869002</span>
|
||||
<span class="number">41</span><span class="special">,</span> <span class="number">0.0084738582566109364</span> <span class="number">0.94732952753530097</span>
|
||||
<span class="number">42</span><span class="special">,</span> <span class="number">0.0074146259745345548</span> <span class="number">0.95474415350983555</span>
|
||||
<span class="number">43</span><span class="special">,</span> <span class="number">0.0064662435824429246</span> <span class="number">0.96121039709227851</span>
|
||||
<span class="number">44</span><span class="special">,</span> <span class="number">0.0056212231142827853</span> <span class="number">0.96683162020656122</span>
|
||||
<span class="number">45</span><span class="special">,</span> <span class="number">0.0048717266990450708</span> <span class="number">0.97170334690560634</span>
|
||||
<span class="number">46</span><span class="special">,</span> <span class="number">0.0042098073105878630</span> <span class="number">0.97591315421619418</span>
|
||||
<span class="number">47</span><span class="special">,</span> <span class="number">0.0036275999165703964</span> <span class="number">0.97954075413276465</span>
|
||||
<span class="number">48</span><span class="special">,</span> <span class="number">0.0031174686783026818</span> <span class="number">0.98265822281106729</span>
|
||||
<span class="number">49</span><span class="special">,</span> <span class="number">0.0026721160099737302</span> <span class="number">0.98533033882104104</span>
|
||||
<span class="number">50</span><span class="special">,</span> <span class="number">0.0022846591885275322</span> <span class="number">0.98761499800956853</span>
|
||||
<span class="number">51</span><span class="special">,</span> <span class="number">0.0019486798960970148</span> <span class="number">0.98956367790566557</span>
|
||||
<span class="number">52</span><span class="special">,</span> <span class="number">0.0016582516423517923</span> <span class="number">0.99122192954801736</span>
|
||||
<span class="number">53</span><span class="special">,</span> <span class="number">0.0014079495076571762</span> <span class="number">0.99262987905567457</span>
|
||||
<span class="number">54</span><span class="special">,</span> <span class="number">0.0011928461106539983</span> <span class="number">0.99382272516632852</span>
|
||||
<span class="number">55</span><span class="special">,</span> <span class="number">0.0010084971662802015</span> <span class="number">0.99483122233260868</span>
|
||||
<span class="number">56</span><span class="special">,</span> <span class="number">0.00085091948404891532</span> <span class="number">0.99568214181665760</span>
|
||||
<span class="number">57</span><span class="special">,</span> <span class="number">0.00071656377604119542</span> <span class="number">0.99639870559269883</span>
|
||||
<span class="number">58</span><span class="special">,</span> <span class="number">0.00060228420831048650</span> <span class="number">0.99700098980100937</span>
|
||||
<span class="number">59</span><span class="special">,</span> <span class="number">0.00050530624256557675</span> <span class="number">0.99750629604357488</span>
|
||||
<span class="number">60</span><span class="special">,</span> <span class="number">0.00042319397814867202</span> <span class="number">0.99792949002172360</span>
|
||||
<span class="number">61</span><span class="special">,</span> <span class="number">0.00035381791615708398</span> <span class="number">0.99828330793788067</span>
|
||||
<span class="number">62</span><span class="special">,</span> <span class="number">0.00029532382517950324</span> <span class="number">0.99857863176306016</span>
|
||||
<span class="number">63</span><span class="special">,</span> <span class="number">0.00024610318764958566</span> <span class="number">0.99882473495070978</span>
|
||||
</pre>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="negative_binomial_example1.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../neg_binom_eg.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="../normal_example.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,53 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Normal Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="neg_binom_eg/negative_binomial_example2.html" title="Negative Binomial Table Printing Example.">
|
||||
<link rel="next" href="normal_example/normal_misc.html" title="Some Miscellaneous Examples of the Normal (Gaussian) 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="neg_binom_eg/negative_binomial_example2.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="normal_example/normal_misc.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example"></a><a class="link" href="normal_example.html" title="Normal Distribution Examples">Normal Distribution
|
||||
Examples</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc"><dt><span class="section"><a href="normal_example/normal_misc.html">Some
|
||||
Miscellaneous Examples of the Normal (Gaussian) Distribution</a></span></dt></dl></div>
|
||||
<p>
|
||||
(See also the reference documentation for the <a class="link" href="../../dist_ref/dists/normal_dist.html" title="Normal (Gaussian) Distribution">Normal
|
||||
Distribution</a>.)
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="neg_binom_eg/negative_binomial_example2.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="normal_example/normal_misc.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,518 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Some Miscellaneous Examples of the Normal (Gaussian) Distribution</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../normal_example.html" title="Normal Distribution Examples">
|
||||
<link rel="prev" href="../normal_example.html" title="Normal Distribution Examples">
|
||||
<link rel="next" href="../inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example">
|
||||
</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="../normal_example.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../normal_example.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="../inverse_chi_squared_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc"></a><a class="link" href="normal_misc.html" title="Some Miscellaneous Examples of the Normal (Gaussian) Distribution">Some
|
||||
Miscellaneous Examples of the Normal (Gaussian) Distribution</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
The sample program <a href="../../../../../../example/normal_misc_examples.cpp" target="_top">normal_misc_examples.cpp</a>
|
||||
illustrates their use.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h0"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.traditional_tables"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.traditional_tables">Traditional
|
||||
Tables</a>
|
||||
</h5>
|
||||
<p>
|
||||
First we need some includes to access the normal distribution (and some
|
||||
std output of course).
|
||||
</p>
|
||||
<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">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for normal_distribution</span>
|
||||
<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>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<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> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">left</span><span class="special">;</span> <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpoint</span><span class="special">;</span> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</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> <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="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Example: Normal distribution, Miscellaneous Applications."</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
<span class="special">{</span> <span class="comment">// Traditional tables and values.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Let's start by printing some traditional tables.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">step</span> <span class="special">=</span> <span class="number">1.</span><span class="special">;</span> <span class="comment">// in z</span>
|
||||
<span class="keyword">double</span> <span class="identifier">range</span> <span class="special">=</span> <span class="number">4</span><span class="special">;</span> <span class="comment">// min and max z = -range to +range.</span>
|
||||
<span class="keyword">int</span> <span class="identifier">precision</span> <span class="special">=</span> <span class="number">17</span><span class="special">;</span> <span class="comment">// traditional tables are only computed to much lower precision.</span>
|
||||
<span class="comment">// but std::numeric_limits<double>::max_digits10; on new Standard Libraries gives</span>
|
||||
<span class="comment">// 17, the maximum number of digits that can possibly be significant.</span>
|
||||
<span class="comment">// std::numeric_limits<double>::digits10; == 15 is number of guaranteed digits,</span>
|
||||
<span class="comment">// the other two digits being 'noisy'.</span>
|
||||
|
||||
<span class="comment">// Construct a standard normal distribution s</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">s</span><span class="special">;</span> <span class="comment">// (default mean = zero, and standard deviation = unity)</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard normal distribution, mean = "</span><span class="special"><<</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", standard deviation = "</span> <span class="special"><<</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
First the probability distribution function (pdf).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Probability distribution function values"</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" z "</span> <span class="string">" pdf "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<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>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">range</span><span class="special">;</span> <span class="identifier">z</span> <span class="special"><</span> <span class="identifier">range</span> <span class="special">+</span> <span class="identifier">step</span><span class="special">;</span> <span class="identifier">z</span> <span class="special">+=</span> <span class="identifier">step</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">6</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="identifier">precision</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">12</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">6</span><span class="special">);</span> <span class="comment">// default</span>
|
||||
</pre>
|
||||
<p>
|
||||
And the area under the normal curve from -∞ up to z, the cumulative distribution
|
||||
function (cdf).
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// For a standard normal distribution</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Standard normal mean = "</span><span class="special"><<</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">", standard deviation = "</span> <span class="special"><<</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Integral (area under the curve) from - infinity up to z "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" z "</span> <span class="string">" cdf "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">range</span><span class="special">;</span> <span class="identifier">z</span> <span class="special"><</span> <span class="identifier">range</span> <span class="special">+</span> <span class="identifier">step</span><span class="special">;</span> <span class="identifier">z</span> <span class="special">+=</span> <span class="identifier">step</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">6</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="identifier">precision</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">12</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">6</span><span class="special">);</span> <span class="comment">// default</span>
|
||||
</pre>
|
||||
<p>
|
||||
And all this you can do with a nanoscopic amount of work compared to
|
||||
the team of <span class="bold"><strong>human computers</strong></span> toiling
|
||||
with Milton Abramovitz and Irene Stegen at the US National Bureau of
|
||||
Standards (now <a href="http://www.nist.gov" target="_top">NIST</a>). Starting
|
||||
in 1938, their "Handbook of Mathematical Functions with Formulas,
|
||||
Graphs and Mathematical Tables", was eventually published in 1964,
|
||||
and has been reprinted numerous times since. (A major replacement is
|
||||
planned at <a href="http://dlmf.nist.gov" target="_top">Digital Library of Mathematical
|
||||
Functions</a>).
|
||||
</p>
|
||||
<p>
|
||||
Pretty-printing a traditional 2-dimensional table is left as an exercise
|
||||
for the student, but why bother now that the Math Toolkit lets you write
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="number">2.</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Area for z = "</span> <span class="special"><<</span> <span class="identifier">z</span> <span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// to get the area for z.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Correspondingly, we can obtain the traditional 'critical' values for
|
||||
significance levels. For the 95% confidence level, the significance level
|
||||
usually called alpha, is 0.05 = 1 - 0.95 (for a one-sided test), so we
|
||||
can write
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"95% of area has a z below "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="number">0.95</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// 95% of area has a z below 1.64485</span>
|
||||
</pre>
|
||||
<p>
|
||||
and a two-sided test (a comparison between two levels, rather than a
|
||||
one-sided test)
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"95% of area has a z between "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="number">0.975</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="special">-</span><span class="identifier">quantile</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="number">0.975</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// 95% of area has a z between 1.95996 and -1.95996</span>
|
||||
</pre>
|
||||
<p>
|
||||
First, define a table of significance levels: these are the probabilities
|
||||
that the true occurrence frequency lies outside the calculated interval.
|
||||
</p>
|
||||
<p>
|
||||
It is convenient to have an alpha level for the probability that z lies
|
||||
outside just one standard deviation. This will not be some nice neat
|
||||
number like 0.05, but we can easily calculate it,
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha1</span> <span class="special">=</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="number">2</span><span class="special">;</span> <span class="comment">// 0.3173105078629142</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">17</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"Significance level for z == 1 is "</span> <span class="special"><<</span> <span class="identifier">alpha1</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
and place in our array of favorite alpha values.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">0.3173105078629142</span><span class="special">,</span> <span class="comment">// z for 1 standard deviation.</span>
|
||||
<span class="number">0.20</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Confidence value as % is (1 - alpha) * 100 (so alpha 0.05 == 95% confidence)
|
||||
that the true occurrence frequency lies <span class="bold"><strong>inside</strong></span>
|
||||
the calculated interval.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"level of significance (alpha)"</span> <span class="special"><<</span> <span class="identifier">setprecision</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="identifier">cout</span> <span class="special"><<</span> <span class="string">"2-sided 1 -sided z(alpha) "</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">15</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">/</span><span class="number">2</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</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">s</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// Use quantile(complement(s, alpha[i]/2)) to avoid potential loss of accuracy from quantile(s, 1 - alpha[i]/2)</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Notice the distinction between one-sided (also called one-tailed) where
|
||||
we are using a > <span class="bold"><strong>or</strong></span> < test (and
|
||||
not both) and considering the area of the tail (integral) from z up to
|
||||
+∞, and a two-sided test where we are using two > <span class="bold"><strong>and</strong></span>
|
||||
< tests, and thus considering two tails, from -∞ up to z low and z high
|
||||
up to +∞.
|
||||
</p>
|
||||
<p>
|
||||
So the 2-sided values alpha[i] are calculated using alpha[i]/2.
|
||||
</p>
|
||||
<p>
|
||||
If we consider a simple example of alpha = 0.05, then for a two-sided
|
||||
test, the lower tail area from -∞ up to -1.96 is 0.025 (alpha/2) and the
|
||||
upper tail area from +z up to +1.96 is also 0.025 (alpha/2), and the
|
||||
area between -1.96 up to 12.96 is alpha = 0.95. and the sum of the two
|
||||
tails is 0.025 + 0.025 = 0.05,
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h1"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.standard_deviations_either_side_"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.standard_deviations_either_side_">Standard
|
||||
deviations either side of the Mean</a>
|
||||
</h5>
|
||||
<p>
|
||||
Armed with the cumulative distribution function, we can easily calculate
|
||||
the easy to remember proportion of values that lie within 1, 2 and 3
|
||||
standard deviations from the mean.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">showpoint</span> <span class="special"><<</span> <span class="string">"cdf(s, s.standard_deviation()) = "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">())</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// from -infinity to 1 sd</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"cdf(complement(s, s.standard_deviation())) = "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction 1 standard deviation within either side of mean is "</span>
|
||||
<span class="special"><<</span> <span class="number">1</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()))</span> <span class="special">*</span> <span class="number">2</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction 2 standard deviations within either side of mean is "</span>
|
||||
<span class="special"><<</span> <span class="number">1</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="number">2</span> <span class="special">*</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()))</span> <span class="special">*</span> <span class="number">2</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction 3 standard deviations within either side of mean is "</span>
|
||||
<span class="special"><<</span> <span class="number">1</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="number">3</span> <span class="special">*</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()))</span> <span class="special">*</span> <span class="number">2</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
To a useful precision, the 1, 2 & 3 percentages are 68, 95 and 99.7,
|
||||
and these are worth memorising as useful 'rules of thumb', as, for example,
|
||||
in <a href="http://en.wikipedia.org/wiki/Standard_deviation" target="_top">standard
|
||||
deviation</a>:
|
||||
</p>
|
||||
<pre class="programlisting">Fraction 1 standard deviation within either side of mean is 0.683
|
||||
Fraction 2 standard deviations within either side of mean is 0.954
|
||||
Fraction 3 standard deviations within either side of mean is 0.997
|
||||
</pre>
|
||||
<p>
|
||||
We could of course get some really accurate values for these <a href="http://en.wikipedia.org/wiki/Confidence_interval" target="_top">confidence
|
||||
intervals</a> by using cout.precision(15);
|
||||
</p>
|
||||
<pre class="programlisting">Fraction 1 standard deviation within either side of mean is 0.682689492137086
|
||||
Fraction 2 standard deviations within either side of mean is 0.954499736103642
|
||||
Fraction 3 standard deviations within either side of mean is 0.997300203936740
|
||||
</pre>
|
||||
<p>
|
||||
But before you get too excited about this impressive precision, don't
|
||||
forget that the <span class="bold"><strong>confidence intervals of the standard
|
||||
deviation</strong></span> are surprisingly wide, especially if you have estimated
|
||||
the standard deviation from only a few measurements.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h2"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.some_simple_examples"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.some_simple_examples">Some
|
||||
simple examples</a>
|
||||
</h5>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h3"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.life_of_light_bulbs"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.life_of_light_bulbs">Life
|
||||
of light bulbs</a>
|
||||
</h5>
|
||||
<p>
|
||||
Examples from K. Krishnamoorthy, Handbook of Statistical Distributions
|
||||
with Applications, ISBN 1 58488 635 8, page 125... implemented using
|
||||
the Math Toolkit library.
|
||||
</p>
|
||||
<p>
|
||||
A few very simple examples are shown here:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// K. Krishnamoorthy, Handbook of Statistical Distributions with Applications,</span>
|
||||
<span class="comment">// ISBN 1 58488 635 8, page 125, example 10.3.5</span>
|
||||
</pre>
|
||||
<p>
|
||||
Mean lifespan of 100 W bulbs is 1100 h with standard deviation of 100
|
||||
h. Assuming, perhaps with little evidence and much faith, that the distribution
|
||||
is normal, we construct a normal distribution called <span class="emphasis"><em>bulbs</em></span>
|
||||
with these values:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">mean_life</span> <span class="special">=</span> <span class="number">1100.</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">life_standard_deviation</span> <span class="special">=</span> <span class="number">100.</span><span class="special">;</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">bulbs</span><span class="special">(</span><span class="identifier">mean_life</span><span class="special">,</span> <span class="identifier">life_standard_deviation</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">expected_life</span> <span class="special">=</span> <span class="number">1000.</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The we can use the Cumulative distribution function to predict fractions
|
||||
(or percentages, if * 100) that will last various lifetimes.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction of bulbs that will last at best (<=) "</span> <span class="comment">// P(X <= 1000)</span>
|
||||
<span class="special"><<</span> <span class="identifier">expected_life</span> <span class="special"><<</span> <span class="string">" is "</span><span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bulbs</span><span class="special">,</span> <span class="identifier">expected_life</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction of bulbs that will last at least (>) "</span> <span class="comment">// P(X > 1000)</span>
|
||||
<span class="special"><<</span> <span class="identifier">expected_life</span> <span class="special"><<</span> <span class="string">" is "</span><span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">bulbs</span><span class="special">,</span> <span class="identifier">expected_life</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">min_life</span> <span class="special">=</span> <span class="number">900</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">max_life</span> <span class="special">=</span> <span class="number">1200</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction of bulbs that will last between "</span>
|
||||
<span class="special"><<</span> <span class="identifier">min_life</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">max_life</span> <span class="special"><<</span> <span class="string">" is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bulbs</span><span class="special">,</span> <span class="identifier">max_life</span><span class="special">)</span> <span class="comment">// P(X <= 1200)</span>
|
||||
<span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bulbs</span><span class="special">,</span> <span class="identifier">min_life</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// P(X <= 900)</span>
|
||||
</pre>
|
||||
<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>
|
||||
Real-life failures are often very ab-normal, with a significant number
|
||||
that 'dead-on-arrival' or suffer failure very early in their life:
|
||||
the lifetime of the survivors of 'early mortality' may be well described
|
||||
by the normal distribution.
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h4"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.how_many_onions"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.how_many_onions">How
|
||||
many onions?</a>
|
||||
</h5>
|
||||
<p>
|
||||
Weekly demand for 5 lb sacks of onions at a store is normally distributed
|
||||
with mean 140 sacks and standard deviation 10.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">mean</span> <span class="special">=</span> <span class="number">140.</span><span class="special">;</span> <span class="comment">// sacks per week.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">standard_deviation</span> <span class="special">=</span> <span class="number">10</span><span class="special">;</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">sacks</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">stock</span> <span class="special">=</span> <span class="number">160.</span><span class="special">;</span> <span class="comment">// per week.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Percentage of weeks overstocked "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">sacks</span><span class="special">,</span> <span class="identifier">stock</span><span class="special">)</span> <span class="special">*</span> <span class="number">100.</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// P(X <=160)</span>
|
||||
<span class="comment">// Percentage of weeks overstocked 97.7</span>
|
||||
</pre>
|
||||
<p>
|
||||
So there will be lots of mouldy onions! So we should be able to say what
|
||||
stock level will meet demand 95% of the weeks.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">stock_95</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">sacks</span><span class="special">,</span> <span class="number">0.95</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Store should stock "</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">stock_95</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" sacks to meet 95% of demands."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
And it is easy to estimate how to meet 80% of demand, and waste even
|
||||
less.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">stock_80</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">sacks</span><span class="special">,</span> <span class="number">0.80</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Store should stock "</span> <span class="special"><<</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">stock_80</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" sacks to meet 8 out of 10 demands."</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h5"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.packing_beef"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.packing_beef">Packing
|
||||
beef</a>
|
||||
</h5>
|
||||
<p>
|
||||
A machine is set to pack 3 kg of ground beef per pack. Over a long period
|
||||
of time it is found that the average packed was 3 kg with a standard
|
||||
deviation of 0.1 kg. Assuming the packing is normally distributed, we
|
||||
can find the fraction (or %) of packages that weigh more than 3.1 kg.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">mean</span> <span class="special">=</span> <span class="number">3.</span><span class="special">;</span> <span class="comment">// kg</span>
|
||||
<span class="keyword">double</span> <span class="identifier">standard_deviation</span> <span class="special">=</span> <span class="number">0.1</span><span class="special">;</span> <span class="comment">// kg</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">packs</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">max_weight</span> <span class="special">=</span> <span class="number">3.1</span><span class="special">;</span> <span class="comment">// kg</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Percentage of packs > "</span> <span class="special"><<</span> <span class="identifier">max_weight</span> <span class="special"><<</span> <span class="string">" is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">packs</span><span class="special">,</span> <span class="identifier">max_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// P(X > 3.1)</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">under_weight</span> <span class="special">=</span> <span class="number">2.9</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"fraction of packs <= "</span> <span class="special"><<</span> <span class="identifier">under_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">packs</span><span class="special">,</span> <span class="identifier">under_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// fraction of packs <= 2.9 with a mean of 3 is 0.841345</span>
|
||||
<span class="comment">// This is 0.84 - more than the target 0.95</span>
|
||||
<span class="comment">// Want 95% to be over this weight, so what should we set the mean weight to be?</span>
|
||||
<span class="comment">// KK StatCalc says:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">over_mean</span> <span class="special">=</span> <span class="number">3.0664</span><span class="special">;</span>
|
||||
<span class="identifier">normal</span> <span class="identifier">xpacks</span><span class="special">(</span><span class="identifier">over_mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">under_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">xpacks</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">xpacks</span><span class="special">,</span> <span class="identifier">under_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">// fraction of packs >= 2.9 with a mean of 3.06449 is 0.950005</span>
|
||||
<span class="keyword">double</span> <span class="identifier">under_fraction</span> <span class="special">=</span> <span class="number">0.05</span><span class="special">;</span> <span class="comment">// so 95% are above the minimum weight mean - sd = 2.9</span>
|
||||
<span class="keyword">double</span> <span class="identifier">low_limit</span> <span class="special">=</span> <span class="identifier">standard_deviation</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">offset</span> <span class="special">=</span> <span class="identifier">mean</span> <span class="special">-</span> <span class="identifier">low_limit</span> <span class="special">-</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">packs</span><span class="special">,</span> <span class="identifier">under_fraction</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">nominal_mean</span> <span class="special">=</span> <span class="identifier">mean</span> <span class="special">+</span> <span class="identifier">offset</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">normal</span> <span class="identifier">nominal_packs</span><span class="special">(</span><span class="identifier">nominal_mean</span><span class="special">,</span> <span class="identifier">standard_deviation</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Setting the packer to "</span> <span class="special"><<</span> <span class="identifier">nominal_mean</span> <span class="special"><<</span> <span class="string">" will mean that "</span>
|
||||
<span class="special"><<</span> <span class="string">"fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">under_weight</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">nominal_packs</span><span class="special">,</span> <span class="identifier">under_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Setting the packer to 3.06449 will mean that fraction of packs >=
|
||||
2.9 is 0.95.
|
||||
</p>
|
||||
<p>
|
||||
Setting the packer to 3.13263 will mean that fraction of packs >=
|
||||
2.9 is 0.99, but will more than double the mean loss from 0.0644 to 0.133.
|
||||
</p>
|
||||
<p>
|
||||
Alternatively, we could invest in a better (more precise) packer with
|
||||
a lower standard deviation.
|
||||
</p>
|
||||
<p>
|
||||
To estimate how much better (how much smaller standard deviation) it
|
||||
would have to be, we need to get the 5% quantile to be located at the
|
||||
under_weight limit, 2.9
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">p</span> <span class="special">=</span> <span class="number">0.05</span><span class="special">;</span> <span class="comment">// wanted p th quantile.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quantile of "</span> <span class="special"><<</span> <span class="identifier">p</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">packs</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">", mean = "</span> <span class="special"><<</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span> <span class="special"><<</span> <span class="string">", sd = "</span> <span class="special"><<</span> <span class="identifier">packs</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">//</span>
|
||||
</pre>
|
||||
<p>
|
||||
Quantile of 0.05 = 2.83551, mean = 3, sd = 0.1
|
||||
</p>
|
||||
<p>
|
||||
With the current packer (mean = 3, sd = 0.1), the 5% quantile is at 2.8551
|
||||
kg, a little below our target of 2.9 kg. So we know that the standard
|
||||
deviation is going to have to be smaller.
|
||||
</p>
|
||||
<p>
|
||||
Let's start by guessing that it (now 0.1) needs to be halved, to a standard
|
||||
deviation of 0.05
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">pack05</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="number">0.05</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quantile of "</span> <span class="special"><<</span> <span class="identifier">p</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">pack05</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">", mean = "</span> <span class="special"><<</span> <span class="identifier">pack05</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span> <span class="special"><<</span> <span class="string">", sd = "</span> <span class="special"><<</span> <span class="identifier">pack05</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">under_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack05</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack05</span><span class="special">,</span> <span class="identifier">under_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="comment">//</span>
|
||||
</pre>
|
||||
<p>
|
||||
Fraction of packs >= 2.9 with a mean of 3 and standard deviation of
|
||||
0.05 is 0.9772
|
||||
</p>
|
||||
<p>
|
||||
So 0.05 was quite a good guess, but we are a little over the 2.9 target,
|
||||
so the standard deviation could be a tiny bit more. So we could do some
|
||||
more guessing to get closer, say by increasing to 0.06
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">pack06</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="number">0.06</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Quantile of "</span> <span class="special"><<</span> <span class="identifier">p</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">pack06</span><span class="special">,</span> <span class="identifier">p</span><span class="special">)</span>
|
||||
<span class="special"><<</span> <span class="string">", mean = "</span> <span class="special"><<</span> <span class="identifier">pack06</span><span class="special">.</span><span class="identifier">mean</span><span class="special">()</span> <span class="special"><<</span> <span class="string">", sd = "</span> <span class="special"><<</span> <span class="identifier">pack06</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">under_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack06</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack06</span><span class="special">,</span> <span class="identifier">under_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Fraction of packs >= 2.9 with a mean of 3 and standard deviation of
|
||||
0.06 is 0.9522
|
||||
</p>
|
||||
<p>
|
||||
Now we are getting really close, but to do the job properly, we could
|
||||
use root finding method, for example the tools provided, and used elsewhere,
|
||||
in the Math Toolkit, see <a class="link" href="../../../roots/roots_noderiv.html" title="Root Finding Without Derivatives">root-finding
|
||||
without derivatives</a>.
|
||||
</p>
|
||||
<p>
|
||||
But in this normal distribution case, we could be even smarter and make
|
||||
a direct calculation.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">normal</span> <span class="identifier">s</span><span class="special">;</span> <span class="comment">// For standard normal distribution,</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd</span> <span class="special">=</span> <span class="number">0.1</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">2.9</span><span class="special">;</span> <span class="comment">// Our required limit.</span>
|
||||
<span class="comment">// then probability p = N((x - mean) / sd)</span>
|
||||
<span class="comment">// So if we want to find the standard deviation that would be required to meet this limit,</span>
|
||||
<span class="comment">// so that the p th quantile is located at x,</span>
|
||||
<span class="comment">// in this case the 0.95 (95%) quantile at 2.9 kg pack weight, when the mean is 3 kg.</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">prob</span> <span class="special">=</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">mean</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">sd</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">qp</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="number">0.95</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"prob = "</span> <span class="special"><<</span> <span class="identifier">prob</span> <span class="special"><<</span> <span class="string">", quantile(p) "</span> <span class="special"><<</span> <span class="identifier">qp</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// p = 0.241971, quantile(p) 1.64485</span>
|
||||
<span class="comment">// Rearranging, we can directly calculate the required standard deviation:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sd95</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">((</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">mean</span><span class="special">))</span> <span class="special">/</span> <span class="identifier">qp</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"If we want the "</span><span class="special"><<</span> <span class="identifier">p</span> <span class="special"><<</span> <span class="string">" th quantile to be located at "</span>
|
||||
<span class="special"><<</span> <span class="identifier">x</span> <span class="special"><<</span> <span class="string">", would need a standard deviation of "</span> <span class="special"><<</span> <span class="identifier">sd95</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">normal</span> <span class="identifier">pack95</span><span class="special">(</span><span class="identifier">mean</span><span class="special">,</span> <span class="identifier">sd95</span><span class="special">);</span> <span class="comment">// Distribution of the 'ideal better' packer.</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span><span class="string">"Fraction of packs >= "</span> <span class="special"><<</span> <span class="identifier">under_weight</span> <span class="special"><<</span> <span class="string">" with a mean of "</span> <span class="special"><<</span> <span class="identifier">mean</span>
|
||||
<span class="special"><<</span> <span class="string">" and standard deviation of "</span> <span class="special"><<</span> <span class="identifier">pack95</span><span class="special">.</span><span class="identifier">standard_deviation</span><span class="special">()</span>
|
||||
<span class="special"><<</span> <span class="string">" is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">pack95</span><span class="special">,</span> <span class="identifier">under_weight</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Fraction of packs >= 2.9 with a mean of 3 and standard deviation of 0.0608 is 0.95</span>
|
||||
</pre>
|
||||
<p>
|
||||
Notice that these two deceptively simple questions (do we over-fill or
|
||||
measure better) are actually very common. The weight of beef might be
|
||||
replaced by a measurement of more or less anything. But the calculations
|
||||
rely on the accuracy of the standard deviation - something that is almost
|
||||
always less good than we might wish, especially if based on a few measurements.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.h6"></a>
|
||||
<span class="phrase"><a name="math_toolkit.stat_tut.weg.normal_example.normal_misc.length_of_bolts"></a></span><a class="link" href="normal_misc.html#math_toolkit.stat_tut.weg.normal_example.normal_misc.length_of_bolts">Length
|
||||
of bolts</a>
|
||||
</h5>
|
||||
<p>
|
||||
A bolt is usable if between 3.9 and 4.1 long. From a large batch of bolts,
|
||||
a sample of 50 show a mean length of 3.95 with standard deviation 0.1.
|
||||
Assuming a normal distribution, what proportion is usable? The true sample
|
||||
mean is unknown, but we can use the sample mean and standard deviation
|
||||
to find approximate solutions.
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="identifier">normal</span> <span class="identifier">bolts</span><span class="special">(</span><span class="number">3.95</span><span class="special">,</span> <span class="number">0.1</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">top</span> <span class="special">=</span> <span class="number">4.1</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">bottom</span> <span class="special">=</span> <span class="number">3.9</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction long enough [ P(X <= "</span> <span class="special"><<</span> <span class="identifier">top</span> <span class="special"><<</span> <span class="string">") ] is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bolts</span><span class="special">,</span> <span class="identifier">top</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction too short [ P(X <= "</span> <span class="special"><<</span> <span class="identifier">bottom</span> <span class="special"><<</span> <span class="string">") ] is "</span> <span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bolts</span><span class="special">,</span> <span class="identifier">bottom</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction OK -between "</span> <span class="special"><<</span> <span class="identifier">bottom</span> <span class="special"><<</span> <span class="string">" and "</span> <span class="special"><<</span> <span class="identifier">top</span>
|
||||
<span class="special"><<</span> <span class="string">"[ P(X <= "</span> <span class="special"><<</span> <span class="identifier">top</span> <span class="special"><<</span> <span class="string">") - P(X<= "</span> <span class="special"><<</span> <span class="identifier">bottom</span> <span class="special"><<</span> <span class="string">" ) ] is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bolts</span><span class="special">,</span> <span class="identifier">top</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">bolts</span><span class="special">,</span> <span class="identifier">bottom</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Fraction too long [ P(X > "</span> <span class="special"><<</span> <span class="identifier">top</span> <span class="special"><<</span> <span class="string">") ] is "</span>
|
||||
<span class="special"><<</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">bolts</span><span class="special">,</span> <span class="identifier">top</span><span class="special">))</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"95% of bolts are shorter than "</span> <span class="special"><<</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">bolts</span><span class="special">,</span> <span class="number">0.95</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
</pre>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../normal_example.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../normal_example.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="../inverse_chi_squared_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,60 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Student's t Distribution Examples</title>
|
||||
<link rel="stylesheet" href="../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../weg.html" title="Worked Examples">
|
||||
<link rel="prev" href="dist_construct_eg.html" title="Distribution Construction Examples">
|
||||
<link rel="next" href="st_eg/tut_mean_intervals.html" title="Calculating confidence intervals on the mean with the Students-t 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="dist_construct_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="st_eg/tut_mean_intervals.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.st_eg"></a><a class="link" href="st_eg.html" title="Student's t Distribution Examples">Student's t Distribution
|
||||
Examples</a>
|
||||
</h4></div></div></div>
|
||||
<div class="toc"><dl class="toc">
|
||||
<dt><span class="section"><a href="st_eg/tut_mean_intervals.html">Calculating
|
||||
confidence intervals on the mean with the Students-t distribution</a></span></dt>
|
||||
<dt><span class="section"><a href="st_eg/tut_mean_test.html">Testing
|
||||
a sample mean for difference from a "true" mean</a></span></dt>
|
||||
<dt><span class="section"><a href="st_eg/tut_mean_size.html">Estimating
|
||||
how large a sample size would have to become in order to give a significant
|
||||
Students-t test result with a single sample test</a></span></dt>
|
||||
<dt><span class="section"><a href="st_eg/two_sample_students_t.html">Comparing
|
||||
the means of two samples with the Students-t test</a></span></dt>
|
||||
<dt><span class="section"><a href="st_eg/paired_st.html">Comparing
|
||||
two paired samples with the Student's t distribution</a></span></dt>
|
||||
</dl></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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="dist_construct_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="st_eg/tut_mean_intervals.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,81 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Comparing two paired samples with the Student's t distribution</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../st_eg.html" title="Student's t Distribution Examples">
|
||||
<link rel="prev" href="two_sample_students_t.html" title="Comparing the means of two samples with the Students-t test">
|
||||
<link rel="next" href="../cs_eg.html" title="Chi Squared Distribution Examples">
|
||||
</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="two_sample_students_t.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="../cs_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.st_eg.paired_st"></a><a class="link" href="paired_st.html" title="Comparing two paired samples with the Student's t distribution">Comparing
|
||||
two paired samples with the Student's t distribution</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine that we have a before and after reading for each item in the
|
||||
sample: for example we might have measured blood pressure before and
|
||||
after administration of a new drug. We can't pool the results and compare
|
||||
the means before and after the change, because each patient will have
|
||||
a different baseline reading. Instead we calculate the difference between
|
||||
before and after measurements in each patient, and calculate the mean
|
||||
and standard deviation of the differences. To test whether a significant
|
||||
change has taken place, we can then test the null-hypothesis that the
|
||||
true mean is zero using the same procedure we used in the single sample
|
||||
cases previously discussed.
|
||||
</p>
|
||||
<p>
|
||||
That means we can:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
<a class="link" href="tut_mean_intervals.html" title="Calculating confidence intervals on the mean with the Students-t distribution">Calculate
|
||||
confidence intervals of the mean</a>. If the endpoints of the
|
||||
interval differ in sign then we are unable to reject the null-hypothesis
|
||||
that there is no change.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a class="link" href="tut_mean_test.html" title='Testing a sample mean for difference from a "true" mean'>Test
|
||||
whether the true mean is zero</a>. If the result is consistent
|
||||
with a true mean of zero, then we are unable to reject the null-hypothesis
|
||||
that there is no change.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<a class="link" href="tut_mean_size.html" title="Estimating how large a sample size would have to become in order to give a significant Students-t test result with a single sample test">Calculate
|
||||
how many pairs of readings we would need in order to obtain a significant
|
||||
result</a>.
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="two_sample_students_t.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="../cs_eg.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,267 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Calculating confidence intervals on the mean with the Students-t distribution</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../st_eg.html" title="Student's t Distribution Examples">
|
||||
<link rel="prev" href="../st_eg.html" title="Student's t Distribution Examples">
|
||||
<link rel="next" href="tut_mean_test.html" title='Testing a sample mean for difference from a "true" mean'>
|
||||
</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="../st_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="tut_mean_test.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.st_eg.tut_mean_intervals"></a><a class="link" href="tut_mean_intervals.html" title="Calculating confidence intervals on the mean with the Students-t distribution">Calculating
|
||||
confidence intervals on the mean with the Students-t distribution</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Let's say you have a sample mean, you may wish to know what confidence
|
||||
intervals you can place on that mean. Colloquially: "I want an interval
|
||||
that I can be P% sure contains the true mean". (On a technical point,
|
||||
note that the interval either contains the true mean or it does not:
|
||||
the meaning of the confidence level is subtly different from this colloquialism.
|
||||
More background information can be found on the <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda352.htm" target="_top">NIST
|
||||
site</a>).
|
||||
</p>
|
||||
<p>
|
||||
The formula for the interval can be expressed as:
|
||||
</p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../../../../../equations/dist_tutorial4.svg"></span>
|
||||
</p>
|
||||
<p>
|
||||
Where, <span class="emphasis"><em>Y<sub>s</sub></em></span> is the sample mean, <span class="emphasis"><em>s</em></span>
|
||||
is the sample standard deviation, <span class="emphasis"><em>N</em></span> is the sample
|
||||
size, /α/ is the desired significance level and <span class="emphasis"><em>t<sub>(α/2,N-1)</sub></em></span>
|
||||
is the upper critical value of the Students-t distribution with <span class="emphasis"><em>N-1</em></span>
|
||||
degrees of freedom.
|
||||
</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 quantity α   is the maximum acceptable risk of falsely rejecting the
|
||||
null-hypothesis. The smaller the value of α the greater the strength
|
||||
of the test.
|
||||
</p>
|
||||
<p>
|
||||
The confidence level of the test is defined as 1 - α, and often expressed
|
||||
as a percentage. So for example a significance level of 0.05, is equivalent
|
||||
to a 95% confidence level. Refer to <a href="http://www.itl.nist.gov/div898/handbook/prc/section1/prc14.htm" target="_top">"What
|
||||
are confidence intervals?"</a> in <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a> for more information.
|
||||
</p>
|
||||
</td></tr>
|
||||
</table></div>
|
||||
<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 usual assumptions of <a href="http://en.wikipedia.org/wiki/Independent_and_identically-distributed_random_variables" target="_top">independent
|
||||
and identically distributed (i.i.d.)</a> variables and <a href="http://en.wikipedia.org/wiki/Normal_distribution" target="_top">normal
|
||||
distribution</a> of course apply here, as they do in other examples.
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
From the formula, it should be clear that:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
The width of the confidence interval decreases as the sample size
|
||||
increases.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
The width increases as the standard deviation increases.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
The width increases as the <span class="emphasis"><em>confidence level increases</em></span>
|
||||
(0.5 towards 0.99999 - stronger).
|
||||
</li>
|
||||
<li class="listitem">
|
||||
The width increases as the <span class="emphasis"><em>significance level decreases</em></span>
|
||||
(0.5 towards 0.00000...01 - stronger).
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
The following example code is taken from the example program <a href="../../../../../../example/students_t_single_sample.cpp" target="_top">students_t_single_sample.cpp</a>.
|
||||
</p>
|
||||
<p>
|
||||
We'll begin by defining a procedure to calculate intervals for various
|
||||
confidence levels; the procedure will print these out as a table:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Needed includes:</span>
|
||||
<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">students_t</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<span class="comment">// Bring everything into global namespace for ease of use:</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">confidence_limits_on_mean</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sm</span><span class="special">,</span> <span class="comment">// Sm = Sample Mean.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sd</span><span class="special">,</span> <span class="comment">// Sd = Sample Standard Deviation.</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">Sn</span><span class="special">)</span> <span class="comment">// Sn = Sample Size.</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Print out general info:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span>
|
||||
<span class="string">"__________________________________\n"</span>
|
||||
<span class="string">"2-Sided Confidence Limits For Mean\n"</span>
|
||||
<span class="string">"__________________________________\n\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">7</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Number of Observations"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">Sn</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Mean"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">Sm</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">40</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">Sd</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
We'll define a table of significance/risk levels for which we'll compute
|
||||
intervals:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that these are the complements of the confidence/probability levels:
|
||||
0.5, 0.75, 0.9 .. 0.99999).
|
||||
</p>
|
||||
<p>
|
||||
Next we'll declare the distribution object we'll need, note that the
|
||||
<span class="emphasis"><em>degrees of freedom</em></span> parameter is the sample size
|
||||
less one:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">students_t</span> <span class="identifier">dist</span><span class="special">(</span><span class="identifier">Sn</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
Most of what follows in the program is pretty printing, so let's focus
|
||||
on the calculation of the interval. First we need the t-statistic, computed
|
||||
using the <span class="emphasis"><em>quantile</em></span> function and our significance
|
||||
level. Note that since the significance levels are the complement of
|
||||
the probability, we have to wrap the arguments in a call to <span class="emphasis"><em>complement(...)</em></span>:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">T</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">dist</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">/</span> <span class="number">2</span><span class="special">));</span>
|
||||
</pre>
|
||||
<p>
|
||||
Note that alpha was divided by two, since we'll be calculating both the
|
||||
upper and lower bounds: had we been interested in a single sided interval
|
||||
then we would have omitted this step.
|
||||
</p>
|
||||
<p>
|
||||
Now to complete the picture, we'll get the (one-sided) width of the interval
|
||||
from the t-statistic by multiplying by the standard deviation, and dividing
|
||||
by the square root of the sample size:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">w</span> <span class="special">=</span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">Sd</span> <span class="special">/</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="keyword">double</span><span class="special">(</span><span class="identifier">Sn</span><span class="special">));</span>
|
||||
</pre>
|
||||
<p>
|
||||
The two-sided interval is then the sample mean plus and minus this width.
|
||||
</p>
|
||||
<p>
|
||||
And apart from some more pretty-printing that completes the procedure.
|
||||
</p>
|
||||
<p>
|
||||
Let's take a look at some sample output, first using the <a href="http://www.itl.nist.gov/div898/handbook/eda/section4/eda428.htm" target="_top">Heat
|
||||
flow data</a> from the NIST site. The data set was collected by Bob
|
||||
Zarr of NIST in January, 1990 from a heat flow meter calibration and
|
||||
stability analysis. The corresponding dataplot output for this test can
|
||||
be found in <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda352.htm" target="_top">section
|
||||
3.5.2</a> of the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>.
|
||||
</p>
|
||||
<pre class="programlisting"> __________________________________
|
||||
2-Sided Confidence Limits For Mean
|
||||
__________________________________
|
||||
|
||||
Number of Observations = 195
|
||||
Mean = 9.26146
|
||||
Standard Deviation = 0.02278881
|
||||
|
||||
|
||||
___________________________________________________________________
|
||||
Confidence T Interval Lower Upper
|
||||
Value (%) Value Width Limit Limit
|
||||
___________________________________________________________________
|
||||
50.000 0.676 1.103e-003 9.26036 9.26256
|
||||
75.000 1.154 1.883e-003 9.25958 9.26334
|
||||
90.000 1.653 2.697e-003 9.25876 9.26416
|
||||
95.000 1.972 3.219e-003 9.25824 9.26468
|
||||
99.000 2.601 4.245e-003 9.25721 9.26571
|
||||
99.900 3.341 5.453e-003 9.25601 9.26691
|
||||
99.990 3.973 6.484e-003 9.25498 9.26794
|
||||
99.999 4.537 7.404e-003 9.25406 9.26886
|
||||
</pre>
|
||||
<p>
|
||||
As you can see the large sample size (195) and small standard deviation
|
||||
(0.023) have combined to give very small intervals, indeed we can be
|
||||
very confident that the true mean is 9.2.
|
||||
</p>
|
||||
<p>
|
||||
For comparison the next example data output is taken from <span class="emphasis"><em>P.K.Hou,
|
||||
O. W. Lau & M.C. Wong, Analyst (1983) vol. 108, p 64. and from Statistics
|
||||
for Analytical Chemistry, 3rd ed. (1994), pp 54-55 J. C. Miller and J.
|
||||
N. Miller, Ellis Horwood ISBN 0 13 0309907.</em></span> The values result
|
||||
from the determination of mercury by cold-vapour atomic absorption.
|
||||
</p>
|
||||
<pre class="programlisting"> __________________________________
|
||||
2-Sided Confidence Limits For Mean
|
||||
__________________________________
|
||||
|
||||
Number of Observations = 3
|
||||
Mean = 37.8000000
|
||||
Standard Deviation = 0.9643650
|
||||
|
||||
|
||||
___________________________________________________________________
|
||||
Confidence T Interval Lower Upper
|
||||
Value (%) Value Width Limit Limit
|
||||
___________________________________________________________________
|
||||
50.000 0.816 0.455 37.34539 38.25461
|
||||
75.000 1.604 0.893 36.90717 38.69283
|
||||
90.000 2.920 1.626 36.17422 39.42578
|
||||
95.000 4.303 2.396 35.40438 40.19562
|
||||
99.000 9.925 5.526 32.27408 43.32592
|
||||
99.900 31.599 17.594 20.20639 55.39361
|
||||
99.990 99.992 55.673 -17.87346 93.47346
|
||||
99.999 316.225 176.067 -138.26683 213.86683
|
||||
</pre>
|
||||
<p>
|
||||
This time the fact that there are only three measurements leads to much
|
||||
wider intervals, indeed such large intervals that it's hard to be very
|
||||
confident in the location of the mean.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="../st_eg.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="tut_mean_test.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,179 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Estimating how large a sample size would have to become in order to give a significant Students-t test result with a single sample test</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../st_eg.html" title="Student's t Distribution Examples">
|
||||
<link rel="prev" href="tut_mean_test.html" title='Testing a sample mean for difference from a "true" mean'>
|
||||
<link rel="next" href="two_sample_students_t.html" title="Comparing the means of two samples with the Students-t test">
|
||||
</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="tut_mean_test.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="two_sample_students_t.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.st_eg.tut_mean_size"></a><a class="link" href="tut_mean_size.html" title="Estimating how large a sample size would have to become in order to give a significant Students-t test result with a single sample test">Estimating
|
||||
how large a sample size would have to become in order to give a significant
|
||||
Students-t test result with a single sample test</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine you have conducted a Students-t test on a single sample in order
|
||||
to check for systematic errors in your measurements. Imagine that the
|
||||
result is borderline. At this point one might go off and collect more
|
||||
data, but it might be prudent to first ask the question "How much
|
||||
more?". The parameter estimators of the students_t_distribution
|
||||
class can provide this information.
|
||||
</p>
|
||||
<p>
|
||||
This section is based on the example code in <a href="../../../../../../example/students_t_single_sample.cpp" target="_top">students_t_single_sample.cpp</a>
|
||||
and we begin by defining a procedure that will print out a table of estimated
|
||||
sample sizes for various confidence levels:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Needed includes:</span>
|
||||
<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">students_t</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<span class="comment">// Bring everything into global namespace for ease of use:</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">single_sample_find_df</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">M</span><span class="special">,</span> <span class="comment">// M = true mean.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sm</span><span class="special">,</span> <span class="comment">// Sm = Sample Mean.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sd</span><span class="special">)</span> <span class="comment">// Sd = Sample Standard Deviation.</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
Next we define a table of significance levels:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0.5</span><span class="special">,</span> <span class="number">0.25</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.05</span><span class="special">,</span> <span class="number">0.01</span><span class="special">,</span> <span class="number">0.001</span><span class="special">,</span> <span class="number">0.0001</span><span class="special">,</span> <span class="number">0.00001</span> <span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
Printing out the table of sample sizes required for various confidence
|
||||
levels begins with the table header:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\n\n"</span>
|
||||
<span class="string">"_______________________________________________________________\n"</span>
|
||||
<span class="string">"Confidence Estimated Estimated\n"</span>
|
||||
<span class="string">" Value (%) Sample Size Sample Size\n"</span>
|
||||
<span class="string">" (one sided test) (two sided test)\n"</span>
|
||||
<span class="string">"_______________________________________________________________\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
And now the important part: the sample sizes required. Class <code class="computeroutput"><span class="identifier">students_t_distribution</span></code> has a static
|
||||
member function <code class="computeroutput"><span class="identifier">find_degrees_of_freedom</span></code>
|
||||
that will calculate how large a sample size needs to be in order to give
|
||||
a definitive result.
|
||||
</p>
|
||||
<p>
|
||||
The first argument is the difference between the means that you wish
|
||||
to be able to detect, here it's the absolute value of the difference
|
||||
between the sample mean, and the true mean.
|
||||
</p>
|
||||
<p>
|
||||
Then come two probability values: alpha and beta. Alpha is the maximum
|
||||
acceptable risk of rejecting the null-hypothesis when it is in fact true.
|
||||
Beta is the maximum acceptable risk of failing to reject the null-hypothesis
|
||||
when in fact it is false. Also note that for a two-sided test, alpha
|
||||
must be divided by 2.
|
||||
</p>
|
||||
<p>
|
||||
The final parameter of the function is the standard deviation of the
|
||||
sample.
|
||||
</p>
|
||||
<p>
|
||||
In this example, we assume that alpha and beta are the same, and call
|
||||
<code class="computeroutput"><span class="identifier">find_degrees_of_freedom</span></code>
|
||||
twice: once with alpha for a one-sided test, and once with alpha/2 for
|
||||
a two-sided test.
|
||||
</p>
|
||||
<pre class="programlisting"> <span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">alpha</span><span class="special">[</span><span class="number">0</span><span class="special">]);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// Confidence value:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="number">100</span> <span class="special">*</span> <span class="special">(</span><span class="number">1</span><span class="special">-</span><span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
|
||||
<span class="comment">// calculate df for single sided test:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">df</span> <span class="special">=</span> <span class="identifier">students_t</span><span class="special">::</span><span class="identifier">find_degrees_of_freedom</span><span class="special">(</span>
|
||||
<span class="identifier">fabs</span><span class="special">(</span><span class="identifier">M</span> <span class="special">-</span> <span class="identifier">Sm</span><span class="special">),</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">Sd</span><span class="special">);</span>
|
||||
<span class="comment">// convert to sample size:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">df</span><span class="special">)</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
|
||||
<span class="comment">// Print size:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">16</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">size</span><span class="special">;</span>
|
||||
<span class="comment">// calculate df for two sided test:</span>
|
||||
<span class="identifier">df</span> <span class="special">=</span> <span class="identifier">students_t</span><span class="special">::</span><span class="identifier">find_degrees_of_freedom</span><span class="special">(</span>
|
||||
<span class="identifier">fabs</span><span class="special">(</span><span class="identifier">M</span> <span class="special">-</span> <span class="identifier">Sm</span><span class="special">),</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">]/</span><span class="number">2</span><span class="special">,</span> <span class="identifier">alpha</span><span class="special">[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">Sd</span><span class="special">);</span>
|
||||
<span class="comment">// convert to sample size:</span>
|
||||
<span class="identifier">size</span> <span class="special">=</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">df</span><span class="special">)</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
|
||||
<span class="comment">// Print size:</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">16</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">right</span> <span class="special"><<</span> <span class="identifier">size</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
Let's now look at some sample output using data taken from <span class="emphasis"><em>P.K.Hou,
|
||||
O. W. Lau & M.C. Wong, Analyst (1983) vol. 108, p 64. and from Statistics
|
||||
for Analytical Chemistry, 3rd ed. (1994), pp 54-55 J. C. Miller and J.
|
||||
N. Miller, Ellis Horwood ISBN 0 13 0309907.</em></span> The values result
|
||||
from the determination of mercury by cold-vapour atomic absorption.
|
||||
</p>
|
||||
<p>
|
||||
Only three measurements were made, and the Students-t test above gave
|
||||
a borderline result, so this example will show us how many samples would
|
||||
need to be collected:
|
||||
</p>
|
||||
<pre class="programlisting">_____________________________________________________________
|
||||
Estimated sample sizes required for various confidence levels
|
||||
_____________________________________________________________
|
||||
|
||||
True Mean = 38.90000
|
||||
Sample Mean = 37.80000
|
||||
Sample Standard Deviation = 0.96437
|
||||
|
||||
|
||||
_______________________________________________________________
|
||||
Confidence Estimated Estimated
|
||||
Value (%) Sample Size Sample Size
|
||||
(one sided test) (two sided test)
|
||||
_______________________________________________________________
|
||||
75.000 3 4
|
||||
90.000 7 9
|
||||
95.000 11 13
|
||||
99.000 20 22
|
||||
99.900 35 37
|
||||
99.990 50 53
|
||||
99.999 66 68
|
||||
</pre>
|
||||
<p>
|
||||
So in this case, many more measurements would have had to be made, for
|
||||
example at the 95% level, 14 measurements in total for a two-sided test.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="tut_mean_test.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="two_sample_students_t.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,334 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Testing a sample mean for difference from a "true" mean</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../st_eg.html" title="Student's t Distribution Examples">
|
||||
<link rel="prev" href="tut_mean_intervals.html" title="Calculating confidence intervals on the mean with the Students-t distribution">
|
||||
<link rel="next" href="tut_mean_size.html" title="Estimating how large a sample size would have to become in order to give a significant Students-t test result with a single sample test">
|
||||
</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="tut_mean_intervals.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="tut_mean_size.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.st_eg.tut_mean_test"></a><a class="link" href="tut_mean_test.html" title='Testing a sample mean for difference from a "true" mean'>Testing
|
||||
a sample mean for difference from a "true" mean</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
When calibrating or comparing a scientific instrument or measurement
|
||||
method of some kind, we want to be answer the question "Does an
|
||||
observed sample mean differ from the "true" mean in any significant
|
||||
way?". If it does, then we have evidence of a systematic difference.
|
||||
This question can be answered with a Students-t test: more information
|
||||
can be found <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda352.htm" target="_top">on
|
||||
the NIST site</a>.
|
||||
</p>
|
||||
<p>
|
||||
Of course, the assignment of "true" to one mean may be quite
|
||||
arbitrary, often this is simply a "traditional" method of measurement.
|
||||
</p>
|
||||
<p>
|
||||
The following example code is taken from the example program <a href="../../../../../../example/students_t_single_sample.cpp" target="_top">students_t_single_sample.cpp</a>.
|
||||
</p>
|
||||
<p>
|
||||
We'll begin by defining a procedure to determine which of the possible
|
||||
hypothesis are rejected or not-rejected at a given significance level:
|
||||
</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>
|
||||
Non-statisticians might say 'not-rejected' means 'accepted', (often
|
||||
of the null-hypothesis) implying, wrongly, that there really <span class="bold"><strong>IS</strong></span> no difference, but statisticans eschew this
|
||||
to avoid implying that there is positive evidence of 'no difference'.
|
||||
'Not-rejected' here means there is <span class="bold"><strong>no evidence</strong></span>
|
||||
of difference, but there still might well be a difference. For example,
|
||||
see <a href="http://en.wikipedia.org/wiki/Argument_from_ignorance" target="_top">argument
|
||||
from ignorance</a> and <a href="http://www.bmj.com/cgi/content/full/311/7003/485" target="_top">Absence
|
||||
of evidence does not constitute evidence of absence.</a>
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<pre class="programlisting"><span class="comment">// Needed includes:</span>
|
||||
<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">students_t</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<span class="comment">// Bring everything into global namespace for ease of use:</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">single_sample_t_test</span><span class="special">(</span><span class="keyword">double</span> <span class="identifier">M</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">Sm</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">Sd</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">Sn</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// M = true mean.</span>
|
||||
<span class="comment">// Sm = Sample Mean.</span>
|
||||
<span class="comment">// Sd = Sample Standard Deviation.</span>
|
||||
<span class="comment">// Sn = Sample Size.</span>
|
||||
<span class="comment">// alpha = Significance Level.</span>
|
||||
</pre>
|
||||
<p>
|
||||
Most of the procedure is pretty-printing, so let's just focus on the
|
||||
calculation, we begin by calculating the t-statistic:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Difference in means:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">diff</span> <span class="special">=</span> <span class="identifier">Sm</span> <span class="special">-</span> <span class="identifier">M</span><span class="special">;</span>
|
||||
<span class="comment">// Degrees of freedom:</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">Sn</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span>
|
||||
<span class="comment">// t-statistic:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t_stat</span> <span class="special">=</span> <span class="identifier">diff</span> <span class="special">*</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="keyword">double</span><span class="special">(</span><span class="identifier">Sn</span><span class="special">))</span> <span class="special">/</span> <span class="identifier">Sd</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Finally calculate the probability from the t-statistic. If we're interested
|
||||
in simply whether there is a difference (either less or greater) or not,
|
||||
we don't care about the sign of the t-statistic, and we take the complement
|
||||
of the probability for comparison to the significance level:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">students_t</span> <span class="identifier">dist</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">q</span> <span class="special">=</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">fabs</span><span class="special">(</span><span class="identifier">t_stat</span><span class="special">)));</span>
|
||||
</pre>
|
||||
<p>
|
||||
The procedure then prints out the results of the various tests that can
|
||||
be done, these can be summarised in the following table:
|
||||
</p>
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
Hypothesis
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
Test
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Null-hypothesis: there is <span class="bold"><strong>no difference</strong></span>
|
||||
in means
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if complement of CDF for |t| < significance level
|
||||
/ 2:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">fabs</span><span class="special">(</span><span class="identifier">t</span><span class="special">)))</span>
|
||||
<span class="special"><</span> <span class="identifier">alpha</span>
|
||||
<span class="special">/</span> <span class="number">2</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Alternative-hypothesis: there <span class="bold"><strong>is
|
||||
difference</strong></span> in means
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if complement of CDF for |t| > significance level
|
||||
/ 2:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">fabs</span><span class="special">(</span><span class="identifier">t</span><span class="special">)))</span>
|
||||
<span class="special">></span> <span class="identifier">alpha</span>
|
||||
<span class="special">/</span> <span class="number">2</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Alternative-hypothesis: the sample mean <span class="bold"><strong>is
|
||||
less</strong></span> than the true mean.
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if CDF of t > 1 - significance level:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">t</span><span class="special">))</span>
|
||||
<span class="special"><</span> <span class="identifier">alpha</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Alternative-hypothesis: the sample mean <span class="bold"><strong>is
|
||||
greater</strong></span> than the true mean.
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if complement of CDF of t < significance level:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">t</span><span class="special">)</span>
|
||||
<span class="special"><</span> <span class="identifier">alpha</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<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>
|
||||
Notice that the comparisons are against <code class="computeroutput"><span class="identifier">alpha</span>
|
||||
<span class="special">/</span> <span class="number">2</span></code>
|
||||
for a two-sided test and against <code class="computeroutput"><span class="identifier">alpha</span></code>
|
||||
for a one-sided test
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
Now that we have all the parts in place, let's take a look at some sample
|
||||
output, first using the <a href="http://www.itl.nist.gov/div898/handbook/eda/section4/eda428.htm" target="_top">Heat
|
||||
flow data</a> from the NIST site. The data set was collected by Bob
|
||||
Zarr of NIST in January, 1990 from a heat flow meter calibration and
|
||||
stability analysis. The corresponding dataplot output for this test can
|
||||
be found in <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda352.htm" target="_top">section
|
||||
3.5.2</a> of the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>.
|
||||
</p>
|
||||
<pre class="programlisting">__________________________________
|
||||
Student t test for a single sample
|
||||
__________________________________
|
||||
|
||||
Number of Observations = 195
|
||||
Sample Mean = 9.26146
|
||||
Sample Standard Deviation = 0.02279
|
||||
Expected True Mean = 5.00000
|
||||
|
||||
Sample Mean - Expected Test Mean = 4.26146
|
||||
Degrees of Freedom = 194
|
||||
T Statistic = 2611.28380
|
||||
Probability that difference is due to chance = 0.000e+000
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Mean != 5.000 NOT REJECTED
|
||||
Mean < 5.000 REJECTED
|
||||
Mean > 5.000 NOT REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
You will note the line that says the probability that the difference
|
||||
is due to chance is zero. From a philosophical point of view, of course,
|
||||
the probability can never reach zero. However, in this case the calculated
|
||||
probability is smaller than the smallest representable double precision
|
||||
number, hence the appearance of a zero here. Whatever its "true"
|
||||
value is, we know it must be extraordinarily small, so the alternative
|
||||
hypothesis - that there is a difference in means - is not rejected.
|
||||
</p>
|
||||
<p>
|
||||
For comparison the next example data output is taken from <span class="emphasis"><em>P.K.Hou,
|
||||
O. W. Lau & M.C. Wong, Analyst (1983) vol. 108, p 64. and from Statistics
|
||||
for Analytical Chemistry, 3rd ed. (1994), pp 54-55 J. C. Miller and J.
|
||||
N. Miller, Ellis Horwood ISBN 0 13 0309907.</em></span> The values result
|
||||
from the determination of mercury by cold-vapour atomic absorption.
|
||||
</p>
|
||||
<pre class="programlisting">__________________________________
|
||||
Student t test for a single sample
|
||||
__________________________________
|
||||
|
||||
Number of Observations = 3
|
||||
Sample Mean = 37.80000
|
||||
Sample Standard Deviation = 0.96437
|
||||
Expected True Mean = 38.90000
|
||||
|
||||
Sample Mean - Expected Test Mean = -1.10000
|
||||
Degrees of Freedom = 2
|
||||
T Statistic = -1.97566
|
||||
Probability that difference is due to chance = 1.869e-001
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Mean != 38.900 REJECTED
|
||||
Mean < 38.900 NOT REJECTED
|
||||
Mean > 38.900 NOT REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
As you can see the small number of measurements (3) has led to a large
|
||||
uncertainty in the location of the true mean. So even though there appears
|
||||
to be a difference between the sample mean and the expected true mean,
|
||||
we conclude that there is no significant difference, and are unable to
|
||||
reject the null hypothesis. However, if we were to lower the bar for
|
||||
acceptance down to alpha = 0.1 (a 90% confidence level) we see a different
|
||||
output:
|
||||
</p>
|
||||
<pre class="programlisting">__________________________________
|
||||
Student t test for a single sample
|
||||
__________________________________
|
||||
|
||||
Number of Observations = 3
|
||||
Sample Mean = 37.80000
|
||||
Sample Standard Deviation = 0.96437
|
||||
Expected True Mean = 38.90000
|
||||
|
||||
Sample Mean - Expected Test Mean = -1.10000
|
||||
Degrees of Freedom = 2
|
||||
T Statistic = -1.97566
|
||||
Probability that difference is due to chance = 1.869e-001
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.1000
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Mean != 38.900 REJECTED
|
||||
Mean < 38.900 NOT REJECTED
|
||||
Mean > 38.900 REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
In this case, we really have a borderline result, and more data (and/or
|
||||
more accurate data), is needed for a more convincing conclusion.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="tut_mean_intervals.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="tut_mean_size.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,359 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Comparing the means of two samples with the Students-t test</title>
|
||||
<link rel="stylesheet" href="../../../../math.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../../../../index.html" title="Math Toolkit 2.5.1">
|
||||
<link rel="up" href="../st_eg.html" title="Student's t Distribution Examples">
|
||||
<link rel="prev" href="tut_mean_size.html" title="Estimating how large a sample size would have to become in order to give a significant Students-t test result with a single sample test">
|
||||
<link rel="next" href="paired_st.html" title="Comparing two paired samples with the Student's t 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="tut_mean_size.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="paired_st.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h5 class="title">
|
||||
<a name="math_toolkit.stat_tut.weg.st_eg.two_sample_students_t"></a><a class="link" href="two_sample_students_t.html" title="Comparing the means of two samples with the Students-t test">Comparing
|
||||
the means of two samples with the Students-t test</a>
|
||||
</h5></div></div></div>
|
||||
<p>
|
||||
Imagine that we have two samples, and we wish to determine whether their
|
||||
means are different or not. This situation often arises when determining
|
||||
whether a new process or treatment is better than an old one.
|
||||
</p>
|
||||
<p>
|
||||
In this example, we'll be using the <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3531.htm" target="_top">Car
|
||||
Mileage sample data</a> from the <a href="http://www.itl.nist.gov" target="_top">NIST
|
||||
website</a>. The data compares miles per gallon of US cars with miles
|
||||
per gallon of Japanese cars.
|
||||
</p>
|
||||
<p>
|
||||
The sample code is in <a href="../../../../../../example/students_t_two_samples.cpp" target="_top">students_t_two_samples.cpp</a>.
|
||||
</p>
|
||||
<p>
|
||||
There are two ways in which this test can be conducted: we can assume
|
||||
that the true standard deviations of the two samples are equal or not.
|
||||
If the standard deviations are assumed to be equal, then the calculation
|
||||
of the t-statistic is greatly simplified, so we'll examine that case
|
||||
first. In real life we should verify whether this assumption is valid
|
||||
with a Chi-Squared test for equal variances.
|
||||
</p>
|
||||
<p>
|
||||
We begin by defining a procedure that will conduct our test assuming
|
||||
equal variances:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Needed headers:</span>
|
||||
<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">students_t</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
|
||||
<span class="comment">// Simplify usage:</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">void</span> <span class="identifier">two_samples_t_test_equal_sd</span><span class="special">(</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sm1</span><span class="special">,</span> <span class="comment">// Sm1 = Sample 1 Mean.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sd1</span><span class="special">,</span> <span class="comment">// Sd1 = Sample 1 Standard Deviation.</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">Sn1</span><span class="special">,</span> <span class="comment">// Sn1 = Sample 1 Size.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sm2</span><span class="special">,</span> <span class="comment">// Sm2 = Sample 2 Mean.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">Sd2</span><span class="special">,</span> <span class="comment">// Sd2 = Sample 2 Standard Deviation.</span>
|
||||
<span class="keyword">unsigned</span> <span class="identifier">Sn2</span><span class="special">,</span> <span class="comment">// Sn2 = Sample 2 Size.</span>
|
||||
<span class="keyword">double</span> <span class="identifier">alpha</span><span class="special">)</span> <span class="comment">// alpha = Significance Level.</span>
|
||||
<span class="special">{</span>
|
||||
</pre>
|
||||
<p>
|
||||
Our procedure will begin by calculating the t-statistic, assuming equal
|
||||
variances the needed formulae are:
|
||||
</p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../../../../../equations/dist_tutorial1.svg"></span>
|
||||
</p>
|
||||
<p>
|
||||
where Sp is the "pooled" standard deviation of the two samples,
|
||||
and <span class="emphasis"><em>v</em></span> is the number of degrees of freedom of the
|
||||
two combined samples. We can now write the code to calculate the t-statistic:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Degrees of freedom:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">Sn1</span> <span class="special">+</span> <span class="identifier">Sn2</span> <span class="special">-</span> <span class="number">2</span><span class="special">;</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Degrees of Freedom"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">v</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="comment">// Pooled variance:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">sp</span> <span class="special">=</span> <span class="identifier">sqrt</span><span class="special">(((</span><span class="identifier">Sn1</span><span class="special">-</span><span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">Sd1</span> <span class="special">*</span> <span class="identifier">Sd1</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">Sn2</span><span class="special">-</span><span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">Sd2</span> <span class="special">*</span> <span class="identifier">Sd2</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">v</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Pooled Standard Deviation"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">sp</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="comment">// t-statistic:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t_stat</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">Sm1</span> <span class="special">-</span> <span class="identifier">Sm2</span><span class="special">)</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">sp</span> <span class="special">*</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="number">1.0</span> <span class="special">/</span> <span class="identifier">Sn1</span> <span class="special">+</span> <span class="number">1.0</span> <span class="special">/</span> <span class="identifier">Sn2</span><span class="special">));</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"T Statistic"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">t_stat</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The next step is to define our distribution object, and calculate the
|
||||
complement of the probability:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">students_t</span> <span class="identifier">dist</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">q</span> <span class="special">=</span> <span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span> <span class="identifier">fabs</span><span class="special">(</span><span class="identifier">t_stat</span><span class="special">)));</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Probability that difference is due to chance"</span> <span class="special"><<</span> <span class="string">"= "</span>
|
||||
<span class="special"><<</span> <span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">scientific</span> <span class="special"><<</span> <span class="number">2</span> <span class="special">*</span> <span class="identifier">q</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Here we've used the absolute value of the t-statistic, because we initially
|
||||
want to know simply whether there is a difference or not (a two-sided
|
||||
test). However, we can also test whether the mean of the second sample
|
||||
is greater or is less (one-sided test) than that of the first: all the
|
||||
possible tests are summed up in the following table:
|
||||
</p>
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
Hypothesis
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
Test
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Null-hypothesis: there is <span class="bold"><strong>no difference</strong></span>
|
||||
in means
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if complement of CDF for |t| < significance level
|
||||
/ 2:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">fabs</span><span class="special">(</span><span class="identifier">t</span><span class="special">)))</span>
|
||||
<span class="special"><</span> <span class="identifier">alpha</span>
|
||||
<span class="special">/</span> <span class="number">2</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Alternative-hypothesis: there is a <span class="bold"><strong>difference</strong></span>
|
||||
in means
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if complement of CDF for |t| > significance level
|
||||
/ 2:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">fabs</span><span class="special">(</span><span class="identifier">t</span><span class="special">)))</span>
|
||||
<span class="special"><</span> <span class="identifier">alpha</span>
|
||||
<span class="special">/</span> <span class="number">2</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Alternative-hypothesis: Sample 1 Mean is <span class="bold"><strong>less</strong></span>
|
||||
than Sample 2 Mean.
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if CDF of t > significance level:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">t</span><span class="special">)</span>
|
||||
<span class="special">></span> <span class="identifier">alpha</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
The Alternative-hypothesis: Sample 1 Mean is <span class="bold"><strong>greater</strong></span>
|
||||
than Sample 2 Mean.
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Reject if complement of CDF of t > significance level:
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">cdf</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">dist</span><span class="special">,</span>
|
||||
<span class="identifier">t</span><span class="special">))</span>
|
||||
<span class="special">></span> <span class="identifier">alpha</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<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>
|
||||
For a two-sided test we must compare against alpha / 2 and not alpha.
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
Most of the rest of the sample program is pretty-printing, so we'll skip
|
||||
over that, and take a look at the sample output for alpha=0.05 (a 95%
|
||||
probability level). For comparison the dataplot output for the same data
|
||||
is in <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda353.htm" target="_top">section
|
||||
1.3.5.3</a> of the <a href="http://www.itl.nist.gov/div898/handbook/" target="_top">NIST/SEMATECH
|
||||
e-Handbook of Statistical Methods.</a>.
|
||||
</p>
|
||||
<pre class="programlisting"> ________________________________________________
|
||||
Student t test for two samples (equal variances)
|
||||
________________________________________________
|
||||
|
||||
Number of Observations (Sample 1) = 249
|
||||
Sample 1 Mean = 20.145
|
||||
Sample 1 Standard Deviation = 6.4147
|
||||
Number of Observations (Sample 2) = 79
|
||||
Sample 2 Mean = 30.481
|
||||
Sample 2 Standard Deviation = 6.1077
|
||||
Degrees of Freedom = 326
|
||||
Pooled Standard Deviation = 6.3426
|
||||
T Statistic = -12.621
|
||||
Probability that difference is due to chance = 5.273e-030
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Sample 1 Mean != Sample 2 Mean NOT REJECTED
|
||||
Sample 1 Mean < Sample 2 Mean NOT REJECTED
|
||||
Sample 1 Mean > Sample 2 Mean REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
So with a probability that the difference is due to chance of just 5.273e-030,
|
||||
we can safely conclude that there is indeed a difference.
|
||||
</p>
|
||||
<p>
|
||||
The tests on the alternative hypothesis show that we must also reject
|
||||
the hypothesis that Sample 1 Mean is greater than that for Sample 2:
|
||||
in this case Sample 1 represents the miles per gallon for Japanese cars,
|
||||
and Sample 2 the miles per gallon for US cars, so we conclude that Japanese
|
||||
cars are on average more fuel efficient.
|
||||
</p>
|
||||
<p>
|
||||
Now that we have the simple case out of the way, let's look for a moment
|
||||
at the more complex one: that the standard deviations of the two samples
|
||||
are not equal. In this case the formula for the t-statistic becomes:
|
||||
</p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../../../../../equations/dist_tutorial2.svg"></span>
|
||||
</p>
|
||||
<p>
|
||||
And for the combined degrees of freedom we use the <a href="http://en.wikipedia.org/wiki/Welch-Satterthwaite_equation" target="_top">Welch-Satterthwaite</a>
|
||||
approximation:
|
||||
</p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../../../../../equations/dist_tutorial3.svg"></span>
|
||||
</p>
|
||||
<p>
|
||||
Note that this is one of the rare situations where the degrees-of-freedom
|
||||
parameter to the Student's t distribution is a real number, and not an
|
||||
integer value.
|
||||
</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>
|
||||
Some statistical packages truncate the effective degrees of freedom
|
||||
to an integer value: this may be necessary if you are relying on lookup
|
||||
tables, but since our code fully supports non-integer degrees of freedom
|
||||
there is no need to truncate in this case. Also note that when the
|
||||
degrees of freedom is small then the Welch-Satterthwaite approximation
|
||||
may be a significant source of error.
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
Putting these formulae into code we get:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">// Degrees of freedom:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">Sd1</span> <span class="special">*</span> <span class="identifier">Sd1</span> <span class="special">/</span> <span class="identifier">Sn1</span> <span class="special">+</span> <span class="identifier">Sd2</span> <span class="special">*</span> <span class="identifier">Sd2</span> <span class="special">/</span> <span class="identifier">Sn2</span><span class="special">;</span>
|
||||
<span class="identifier">v</span> <span class="special">*=</span> <span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t1</span> <span class="special">=</span> <span class="identifier">Sd1</span> <span class="special">*</span> <span class="identifier">Sd1</span> <span class="special">/</span> <span class="identifier">Sn1</span><span class="special">;</span>
|
||||
<span class="identifier">t1</span> <span class="special">*=</span> <span class="identifier">t1</span><span class="special">;</span>
|
||||
<span class="identifier">t1</span> <span class="special">/=</span> <span class="special">(</span><span class="identifier">Sn1</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t2</span> <span class="special">=</span> <span class="identifier">Sd2</span> <span class="special">*</span> <span class="identifier">Sd2</span> <span class="special">/</span> <span class="identifier">Sn2</span><span class="special">;</span>
|
||||
<span class="identifier">t2</span> <span class="special">*=</span> <span class="identifier">t2</span><span class="special">;</span>
|
||||
<span class="identifier">t2</span> <span class="special">/=</span> <span class="special">(</span><span class="identifier">Sn2</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
|
||||
<span class="identifier">v</span> <span class="special">/=</span> <span class="special">(</span><span class="identifier">t1</span> <span class="special">+</span> <span class="identifier">t2</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"Degrees of Freedom"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">v</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
<span class="comment">// t-statistic:</span>
|
||||
<span class="keyword">double</span> <span class="identifier">t_stat</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">Sm1</span> <span class="special">-</span> <span class="identifier">Sm2</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">Sd1</span> <span class="special">*</span> <span class="identifier">Sd1</span> <span class="special">/</span> <span class="identifier">Sn1</span> <span class="special">+</span> <span class="identifier">Sd2</span> <span class="special">*</span> <span class="identifier">Sd2</span> <span class="special">/</span> <span class="identifier">Sn2</span><span class="special">);</span>
|
||||
<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">setw</span><span class="special">(</span><span class="number">55</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">left</span> <span class="special"><<</span> <span class="string">"T Statistic"</span> <span class="special"><<</span> <span class="string">"= "</span> <span class="special"><<</span> <span class="identifier">t_stat</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Thereafter the code and the tests are performed the same as before. Using
|
||||
are car mileage data again, here's what the output looks like:
|
||||
</p>
|
||||
<pre class="programlisting"> __________________________________________________
|
||||
Student t test for two samples (unequal variances)
|
||||
__________________________________________________
|
||||
|
||||
Number of Observations (Sample 1) = 249
|
||||
Sample 1 Mean = 20.145
|
||||
Sample 1 Standard Deviation = 6.4147
|
||||
Number of Observations (Sample 2) = 79
|
||||
Sample 2 Mean = 30.481
|
||||
Sample 2 Standard Deviation = 6.1077
|
||||
Degrees of Freedom = 136.87
|
||||
T Statistic = -12.946
|
||||
Probability that difference is due to chance = 1.571e-025
|
||||
|
||||
Results for Alternative Hypothesis and alpha = 0.0500
|
||||
|
||||
Alternative Hypothesis Conclusion
|
||||
Sample 1 Mean != Sample 2 Mean NOT REJECTED
|
||||
Sample 1 Mean < Sample 2 Mean NOT REJECTED
|
||||
Sample 1 Mean > Sample 2 Mean REJECTED
|
||||
</pre>
|
||||
<p>
|
||||
This time allowing the variances in the two samples to differ has yielded
|
||||
a higher likelihood that the observed difference is down to chance alone
|
||||
(1.571e-025 compared to 5.273e-030 when equal variances were assumed).
|
||||
However, the conclusion remains the same: US cars are less fuel efficient
|
||||
than Japanese models.
|
||||
</p>
|
||||
</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 © 2006-2010, 2012-2014 Nikhar Agrawal,
|
||||
Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
|
||||
Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
|
||||
Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<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="tut_mean_size.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../st_eg.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="paired_st.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user