123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- // neg_binomial_confidence_limits.cpp
- // Copyright John Maddock 2006
- // Copyright Paul A. Bristow 2007, 2010
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt
- // or copy at http://www.boost.org/LICENSE_1_0.txt)
- // Caution: this file contains quickbook markup as well as code
- // and comments, don't change any of the special comment markups!
- //[neg_binomial_confidence_limits
- /*`
- First we need some includes to access the negative binomial distribution
- (and some basic std output of course).
- */
- #include <boost/math/distributions/negative_binomial.hpp>
- using boost::math::negative_binomial;
- #include <iostream>
- using std::cout; using std::endl;
- #include <iomanip>
- using std::setprecision;
- using std::setw; using std::left; using std::fixed; using std::right;
- /*`
- First define a table of significance levels: these are the
- probabilities that the true occurrence frequency lies outside the calculated
- interval:
- */
- double alpha[] = { 0.5, 0.25, 0.1, 0.05, 0.01, 0.001, 0.0001, 0.00001 };
- /*`
- Confidence value as % is (1 - alpha) * 100, so alpha 0.05 == 95% confidence
- that the true occurrence frequency lies *inside* the calculated interval.
- We need a function to calculate and print confidence limits
- for an observed frequency of occurrence
- that follows a negative binomial distribution.
- */
- void confidence_limits_on_frequency(unsigned trials, unsigned successes)
- {
- // trials = Total number of trials.
- // successes = Total number of observed successes.
- // failures = trials - successes.
- // success_fraction = successes /trials.
- // Print out general info:
- cout <<
- "______________________________________________\n"
- "2-Sided Confidence Limits For Success Fraction\n"
- "______________________________________________\n\n";
- cout << setprecision(7);
- cout << setw(40) << left << "Number of trials" << " = " << trials << "\n";
- cout << setw(40) << left << "Number of successes" << " = " << successes << "\n";
- cout << setw(40) << left << "Number of failures" << " = " << trials - successes << "\n";
- cout << setw(40) << left << "Observed frequency of occurrence" << " = " << double(successes) / trials << "\n";
- // Print table header:
- cout << "\n\n"
- "___________________________________________\n"
- "Confidence Lower Upper\n"
- " Value (%) Limit Limit\n"
- "___________________________________________\n";
- /*`
- And now for the important part - the bounds themselves.
- For each value of /alpha/, we call `find_lower_bound_on_p` and
- `find_upper_bound_on_p` 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: ['"Calculate a lower bound so that we are P%
- sure that the true occurrence frequency is greater than some value"]
- then we would *not* have divided by two.
- */
- // Now print out the upper and lower limits for the alpha table values.
- for(unsigned i = 0; i < sizeof(alpha)/sizeof(alpha[0]); ++i)
- {
- // Confidence value:
- cout << fixed << setprecision(3) << setw(10) << right << 100 * (1-alpha[i]);
- // Calculate bounds:
- double lower = negative_binomial::find_lower_bound_on_p(trials, successes, alpha[i]/2);
- double upper = negative_binomial::find_upper_bound_on_p(trials, successes, alpha[i]/2);
- // Print limits:
- cout << fixed << setprecision(5) << setw(15) << right << lower;
- cout << fixed << setprecision(5) << setw(15) << right << upper << endl;
- }
- cout << endl;
- } // void confidence_limits_on_frequency(unsigned trials, unsigned successes)
- /*`
- And then call confidence_limits_on_frequency with increasing numbers of trials,
- but always the same success fraction 0.1, or 1 in 10.
- */
- int main()
- {
- confidence_limits_on_frequency(20, 2); // 20 trials, 2 successes, 2 in 20, = 1 in 10 = 0.1 success fraction.
- confidence_limits_on_frequency(200, 20); // More trials, but same 0.1 success fraction.
- confidence_limits_on_frequency(2000, 200); // Many more trials, but same 0.1 success fraction.
- return 0;
- } // int main()
- //] [/negative_binomial_confidence_limits_eg end of Quickbook in C++ markup]
- /*
- ______________________________________________
- 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
- ______________________________________________
- 2-Sided Confidence Limits For Success Fraction
- ______________________________________________
- Number of trials = 200
- Number of successes = 20
- Number of failures = 180
- Observed frequency of occurrence = 0.1000000
- ___________________________________________
- Confidence Lower Upper
- Value (%) Limit Limit
- ___________________________________________
- 50.000 0.08462 0.11350
- 75.000 0.07580 0.12469
- 90.000 0.06726 0.13695
- 95.000 0.06216 0.14508
- 99.000 0.05293 0.16170
- 99.900 0.04343 0.18212
- 99.990 0.03641 0.20017
- 99.999 0.03095 0.21664
- ______________________________________________
- 2-Sided Confidence Limits For Success Fraction
- ______________________________________________
- Number of trials = 2000
- Number of successes = 200
- Number of failures = 1800
- Observed frequency of occurrence = 0.1000000
- ___________________________________________
- 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
- */
|