// neg_binomial_confidence_limits.cpp // Copyright John Maddock 2006 // Copyright Paul A. Bristow 2007 // 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 using boost::math::negative_binomial; #include using std::cout; using std::endl; #include 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 occurence 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 */