mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
	
	
		
			179 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | // 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 | ||
|  | */ | ||
|  | 
 |