Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

libs/math/example/neg_binomial_sample_sizes.cpp

// neg_binomial_sample_sizes.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)

#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial;

// Default RealType is double so this permits use of:
double find_minimum_number_of_trials(
double k,     // number of failures (events), k >= 0.
double p,     // fraction of trails for which event occurs, 0 <= p <= 1.
double probability); // probability threshold, 0 <= probability <= 1.

#include <iostream>
using std::cout;
using std::endl;
using std::fixed;
using std::right;
#include <iomanip>
using std::setprecision;
using std::setw; 

//[neg_binomial_sample_sizes

/*`
It centres around a routine that prints out
a table of minimum sample sizes for various probability thresholds:
*/
  void find_number_of_trials(double failures, double p);
/*`
First define a table of significance levels: these are the maximum 
acceptable probability that /failure/ or fewer events will be observed.
*/
  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 desired number of failures will be observed.

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:

  (int)ceil(negative_binomial::find_minimum_number_of_trials(failures, p, alpha[i]);

*/

/*`

find_minimum_number_of_trials returns a double,
so ceil rounds this up to ensure we have an integral minimum number of trials.

*/
  
void find_number_of_trials(double failures, double p)
{
   // trials = number of trials
   // failures = number of failures before achieving required success(es).
   // p        = success fraction (0 <= p <= 1.).
   //
   // Calculate how many trials we need to ensure the
   // required number of failures DOES exceed "failures".

  cout << "\n""Target number of failures = " << failures;
  cout << ",   Success fraction = " << 100 * p << "%" << endl;
   // Print table header:
   cout << "\n\n"
           "____________________________\n"
           "Confidence        Min Number\n"
           " Value (%)        Of Trials \n"
           "____________________________\n";
   // Now print out the data for the alpha table values.
  for(unsigned i = 0; i < sizeof(alpha)/sizeof(alpha[0]); ++i)
   { // Confidence values %:
      cout << fixed << setprecision(3) << setw(10) << right << 100 * (1-alpha[i]) << "      "
      // find_minimum_number_of_trials
      << setw(6) << right
      << (int)ceil(negative_binomial::find_minimum_number_of_trials(failures, p, alpha[i]))
      << endl;
   }
   cout << endl;
} // void find_number_of_trials(double failures, double p)

/*` finally we can produce some tables of minimum trials for the chosen confidence levels:
*/

int main()
{
    find_number_of_trials(5, 0.5);
    find_number_of_trials(50, 0.5);
    find_number_of_trials(500, 0.5);
    find_number_of_trials(50, 0.1);
    find_number_of_trials(500, 0.1);
    find_number_of_trials(5, 0.9);

    return 0;
} // int main()

//]  [/neg_binomial_sample_sizes.cpp end of Quickbook in C++ markup]

/*

Output is:

Autorun "i:\boost-06-05-03-1300\libs\math\test\Math_test\debug\neg_binomial_sample_sizes.exe"
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
Target number of failures = 50.000,   Success fraction = 50.000%
____________________________
Confidence        Min Number
 Value (%)        Of Trials 
____________________________
    50.000         101
    75.000         109
    90.000         115
    95.000         119
    99.000         128
    99.900         137
    99.990         146
    99.999         154
Target number of failures = 500.000,   Success fraction = 50.000%
____________________________
Confidence        Min Number
 Value (%)        Of Trials 
____________________________
    50.000        1001
    75.000        1023
    90.000        1043
    95.000        1055
    99.000        1078
    99.900        1104
    99.990        1126
    99.999        1146
Target number of failures = 50.000,   Success fraction = 10.000%
____________________________
Confidence        Min Number
 Value (%)        Of Trials 
____________________________
    50.000          56
    75.000          58
    90.000          60
    95.000          61
    99.000          63
    99.900          66
    99.990          68
    99.999          71
Target number of failures = 500.000,   Success fraction = 10.000%
____________________________
Confidence        Min Number
 Value (%)        Of Trials 
____________________________
    50.000         556
    75.000         562
    90.000         567
    95.000         570
    99.000         576
    99.900         583
    99.990         588
    99.999         594
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
Target number of failures = 5.000,   Success fraction = 40.000%
____________________________
Confidence        Min Number
 Value (%)        Of Trials 
____________________________
    50.000          10
    75.000          11
    90.000          13
    95.000          15
    99.000          18
    99.900          21
    99.990          25
    99.999          28

*/