mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			425 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			425 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// 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)
 | 
						|
 | 
						|
#ifdef _MSC_VER
 | 
						|
#  pragma warning(disable: 4512) // assignment operator could not be generated.
 | 
						|
#  pragma warning(disable: 4510) // default constructor could not be generated.
 | 
						|
#  pragma warning(disable: 4610) // can never be instantiated - user defined constructor required.
 | 
						|
#endif
 | 
						|
 | 
						|
#include <boost/math/distributions/students_t.hpp>
 | 
						|
 | 
						|
// avoid "using namespace std;" and "using namespace boost::math;"
 | 
						|
// to avoid potential ambiguity with names in std random.
 | 
						|
#include <iostream>
 | 
						|
using std::cout; using std::endl;
 | 
						|
using std::left; using std::fixed; using std::right; using std::scientific;
 | 
						|
#include <iomanip>
 | 
						|
using std::setw;
 | 
						|
using std::setprecision;
 | 
						|
 | 
						|
void confidence_limits_on_mean(double Sm, double Sd, unsigned Sn)
 | 
						|
{
 | 
						|
   //
 | 
						|
   // Sm = Sample Mean.
 | 
						|
   // Sd = Sample Standard Deviation.
 | 
						|
   // Sn = Sample Size.
 | 
						|
   //
 | 
						|
   // Calculate confidence intervals for the mean.
 | 
						|
   // For example if we set the confidence limit to
 | 
						|
   // 0.95, we know that if we repeat the sampling
 | 
						|
   // 100 times, then we expect that the true mean
 | 
						|
   // will be between out limits on 95 occations.
 | 
						|
   // Note: this is not the same as saying a 95%
 | 
						|
   // confidence interval means that there is a 95%
 | 
						|
   // probability that the interval contains the true mean.
 | 
						|
   // The interval computed from a given sample either
 | 
						|
   // contains the true mean or it does not.
 | 
						|
   // See http://www.itl.nist.gov/div898/handbook/eda/section3/eda352.htm
 | 
						|
 | 
						|
   using boost::math::students_t;
 | 
						|
 | 
						|
   // Print out general info:
 | 
						|
   cout <<
 | 
						|
      "__________________________________\n"
 | 
						|
      "2-Sided Confidence Limits For Mean\n"
 | 
						|
      "__________________________________\n\n";
 | 
						|
   cout << setprecision(7);
 | 
						|
   cout << setw(40) << left << "Number of Observations" << "=  " << Sn << "\n";
 | 
						|
   cout << setw(40) << left << "Mean" << "=  " << Sm << "\n";
 | 
						|
   cout << setw(40) << left << "Standard Deviation" << "=  " << Sd << "\n";
 | 
						|
   //
 | 
						|
   // Define a table of significance/risk levels:
 | 
						|
   //
 | 
						|
   double alpha[] = { 0.5, 0.25, 0.1, 0.05, 0.01, 0.001, 0.0001, 0.00001 };
 | 
						|
   //
 | 
						|
   // Start by declaring the distribution we'll need:
 | 
						|
   //
 | 
						|
   students_t dist(Sn - 1);
 | 
						|
   //
 | 
						|
   // Print table header:
 | 
						|
   //
 | 
						|
   cout << "\n\n"
 | 
						|
           "_______________________________________________________________\n"
 | 
						|
           "Confidence       T           Interval          Lower          Upper\n"
 | 
						|
           " Value (%)     Value          Width            Limit          Limit\n"
 | 
						|
           "_______________________________________________________________\n";
 | 
						|
   //
 | 
						|
   // Now print out the data for the table rows.
 | 
						|
   //
 | 
						|
   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 T:
 | 
						|
      double T = quantile(complement(dist, alpha[i] / 2));
 | 
						|
      // Print T:
 | 
						|
      cout << fixed << setprecision(3) << setw(10) << right << T;
 | 
						|
      // Calculate width of interval (one sided):
 | 
						|
      double w = T * Sd / sqrt(double(Sn));
 | 
						|
      // Print width:
 | 
						|
      if(w < 0.01)
 | 
						|
         cout << scientific << setprecision(3) << setw(17) << right << w;
 | 
						|
      else
 | 
						|
         cout << fixed << setprecision(3) << setw(17) << right << w;
 | 
						|
      // Print Limits:
 | 
						|
      cout << fixed << setprecision(5) << setw(15) << right << Sm - w;
 | 
						|
      cout << fixed << setprecision(5) << setw(15) << right << Sm + w << endl;
 | 
						|
   }
 | 
						|
   cout << endl;
 | 
						|
} // void confidence_limits_on_mean
 | 
						|
 | 
						|
void single_sample_t_test(double M, double Sm, double Sd, unsigned Sn, double alpha)
 | 
						|
{
 | 
						|
   //
 | 
						|
   // M = true mean.
 | 
						|
   // Sm = Sample Mean.
 | 
						|
   // Sd = Sample Standard Deviation.
 | 
						|
   // Sn = Sample Size.
 | 
						|
   // alpha = Significance Level.
 | 
						|
   //
 | 
						|
   // A Students t test applied to a single set of data.
 | 
						|
   // We are testing the null hypothesis that the true
 | 
						|
   // mean of the sample is M, and that any variation is down
 | 
						|
   // to chance.  We can also test the alternative hypothesis
 | 
						|
   // that any difference is not down to chance.
 | 
						|
   // See http://www.itl.nist.gov/div898/handbook/eda/section3/eda352.htm
 | 
						|
   
 | 
						|
   using boost::math::students_t;
 | 
						|
 | 
						|
   // Print header:
 | 
						|
   cout <<
 | 
						|
      "__________________________________\n"
 | 
						|
      "Student t test for a single sample\n"
 | 
						|
      "__________________________________\n\n";
 | 
						|
   cout << setprecision(5);
 | 
						|
   cout << setw(55) << left << "Number of Observations" << "=  " << Sn << "\n";
 | 
						|
   cout << setw(55) << left << "Sample Mean" << "=  " << Sm << "\n";
 | 
						|
   cout << setw(55) << left << "Sample Standard Deviation" << "=  " << Sd << "\n";
 | 
						|
   cout << setw(55) << left << "Expected True Mean" << "=  " << M << "\n\n";
 | 
						|
   //
 | 
						|
   // Now we can calculate and output some stats:
 | 
						|
   //
 | 
						|
   // Difference in means:
 | 
						|
   double diff = Sm - M;
 | 
						|
   cout << setw(55) << left << "Sample Mean - Expected Test Mean" << "=  " << diff << "\n";
 | 
						|
   // Degrees of freedom:
 | 
						|
   unsigned v = Sn - 1;
 | 
						|
   cout << setw(55) << left << "Degrees of Freedom" << "=  " << v << "\n";
 | 
						|
   // t-statistic:
 | 
						|
   double t_stat = diff * sqrt(double(Sn)) / Sd;
 | 
						|
   cout << setw(55) << left << "T Statistic" << "=  " << t_stat << "\n";
 | 
						|
   //
 | 
						|
   // Finally define our distribution, and get the probability:
 | 
						|
   //
 | 
						|
   students_t dist(v);
 | 
						|
   double q = cdf(complement(dist, fabs(t_stat)));
 | 
						|
   cout << setw(55) << left << "Probability that difference is due to chance" << "=  "
 | 
						|
      << setprecision(3) << scientific << 2 * q << "\n\n";
 | 
						|
   //
 | 
						|
   // Finally print out results of alternative hypothesis:
 | 
						|
   //
 | 
						|
   cout << setw(55) << left <<
 | 
						|
      "Results for Alternative Hypothesis and alpha" << "=  "
 | 
						|
      << setprecision(4) << fixed << alpha << "\n\n";
 | 
						|
   cout << "Alternative Hypothesis     Conclusion\n";
 | 
						|
   cout << "Mean != " << setprecision(3) << fixed << M << "            ";
 | 
						|
   if(q < alpha / 2)
 | 
						|
      cout << "NOT REJECTED\n";
 | 
						|
   else
 | 
						|
      cout << "REJECTED\n";
 | 
						|
   cout << "Mean  < " << setprecision(3) << fixed << M << "            ";
 | 
						|
   if(cdf(complement(dist, t_stat)) > alpha)
 | 
						|
      cout << "NOT REJECTED\n";
 | 
						|
   else
 | 
						|
      cout << "REJECTED\n";
 | 
						|
   cout << "Mean  > " << setprecision(3) << fixed << M << "            ";
 | 
						|
   if(cdf(dist, t_stat) > alpha)
 | 
						|
      cout << "NOT REJECTED\n";
 | 
						|
   else
 | 
						|
      cout << "REJECTED\n";
 | 
						|
   cout << endl << endl;
 | 
						|
} // void single_sample_t_test(
 | 
						|
 | 
						|
void single_sample_find_df(double M, double Sm, double Sd)
 | 
						|
{
 | 
						|
   //
 | 
						|
   // M = true mean.
 | 
						|
   // Sm = Sample Mean.
 | 
						|
   // Sd = Sample Standard Deviation.
 | 
						|
   //
 | 
						|
 
 | 
						|
   using boost::math::students_t;
 | 
						|
 | 
						|
   // Print out general info:
 | 
						|
   cout <<
 | 
						|
      "_____________________________________________________________\n"
 | 
						|
      "Estimated sample sizes required for various confidence levels\n"
 | 
						|
      "_____________________________________________________________\n\n";
 | 
						|
   cout << setprecision(5);
 | 
						|
   cout << setw(40) << left << "True Mean" << "=  " << M << "\n";
 | 
						|
   cout << setw(40) << left << "Sample Mean" << "=  " << Sm << "\n";
 | 
						|
   cout << setw(40) << left << "Sample Standard Deviation" << "=  " << Sd << "\n";
 | 
						|
   //
 | 
						|
   // Define a table of significance intervals:
 | 
						|
   //
 | 
						|
   double alpha[] = { 0.5, 0.25, 0.1, 0.05, 0.01, 0.001, 0.0001, 0.00001 };
 | 
						|
   //
 | 
						|
   // Print table header:
 | 
						|
   //
 | 
						|
   cout << "\n\n"
 | 
						|
           "_______________________________________________________________\n"
 | 
						|
           "Confidence       Estimated          Estimated\n"
 | 
						|
           " Value (%)      Sample Size        Sample Size\n"
 | 
						|
           "              (one sided test)    (two sided test)\n"
 | 
						|
           "_______________________________________________________________\n";
 | 
						|
   //
 | 
						|
   // Now print out the data for the table rows.
 | 
						|
   //
 | 
						|
   for(unsigned i = 1; i < sizeof(alpha)/sizeof(alpha[0]); ++i)
 | 
						|
   {
 | 
						|
      // Confidence value:
 | 
						|
      cout << fixed << setprecision(3) << setw(10) << right << 100 * (1-alpha[i]);
 | 
						|
      // calculate df for single sided test:
 | 
						|
      double df = students_t::find_degrees_of_freedom(
 | 
						|
         fabs(M - Sm), alpha[i], alpha[i], Sd);
 | 
						|
      // convert to sample size, always one more than the degrees of freedom:
 | 
						|
      double size = ceil(df) + 1;
 | 
						|
      // Print size:
 | 
						|
      cout << fixed << setprecision(0) << setw(16) << right << size;
 | 
						|
      // calculate df for two sided test:
 | 
						|
      df = students_t::find_degrees_of_freedom(
 | 
						|
         fabs(M - Sm), alpha[i]/2, alpha[i], Sd);
 | 
						|
      // convert to sample size:
 | 
						|
      size = ceil(df) + 1;
 | 
						|
      // Print size:
 | 
						|
      cout << fixed << setprecision(0) << setw(16) << right << size << endl;
 | 
						|
   }
 | 
						|
   cout << endl;
 | 
						|
} // void single_sample_find_df
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
   //
 | 
						|
   // Run tests for Heat Flow Meter data
 | 
						|
   // see http://www.itl.nist.gov/div898/handbook/eda/section4/eda428.htm
 | 
						|
   // The data was collected while calibrating a heat flow meter
 | 
						|
   // against a known value.
 | 
						|
   //
 | 
						|
   confidence_limits_on_mean(9.261460, 0.2278881e-01, 195);
 | 
						|
   single_sample_t_test(5, 9.261460, 0.2278881e-01, 195, 0.05);
 | 
						|
   single_sample_find_df(5, 9.261460, 0.2278881e-01);
 | 
						|
 | 
						|
   //
 | 
						|
   // Data for this example from:
 | 
						|
   // P.K.Hou, O. W. Lau & M.C. Wong, Analyst (1983) vol. 108, p 64.
 | 
						|
   // from Statistics for Analytical Chemistry, 3rd ed. (1994), pp 54-55
 | 
						|
   // J. C. Miller and J. N. Miller, Ellis Horwood ISBN 0 13 0309907
 | 
						|
   //
 | 
						|
   // Determination of mercury by cold-vapour atomic absorption,
 | 
						|
   // the following values were obtained fusing a trusted
 | 
						|
   // Standard Reference Material containing 38.9% mercury,
 | 
						|
   // which we assume is correct or 'true'.
 | 
						|
   //
 | 
						|
   confidence_limits_on_mean(37.8, 0.964365, 3);
 | 
						|
   // 95% test:
 | 
						|
   single_sample_t_test(38.9, 37.8, 0.964365, 3, 0.05);
 | 
						|
   // 90% test:
 | 
						|
   single_sample_t_test(38.9, 37.8, 0.964365, 3, 0.1);
 | 
						|
   // parameter estimate:
 | 
						|
   single_sample_find_df(38.9, 37.8, 0.964365);
 | 
						|
 | 
						|
   return 0;
 | 
						|
} // int main()
 | 
						|
 | 
						|
/*
 | 
						|
 | 
						|
Output:
 | 
						|
 | 
						|
------ Rebuild All started: Project: students_t_single_sample, Configuration: Release Win32 ------
 | 
						|
  students_t_single_sample.cpp
 | 
						|
  Generating code
 | 
						|
  Finished generating code
 | 
						|
  students_t_single_sample.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Release\students_t_single_sample.exe
 | 
						|
__________________________________
 | 
						|
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
 | 
						|
 | 
						|
__________________________________
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
_____________________________________________________________
 | 
						|
Estimated sample sizes required for various confidence levels
 | 
						|
_____________________________________________________________
 | 
						|
 | 
						|
True Mean                               =  5.00000
 | 
						|
Sample Mean                             =  9.26146
 | 
						|
Sample Standard Deviation               =  0.02279
 | 
						|
 | 
						|
 | 
						|
_______________________________________________________________
 | 
						|
Confidence       Estimated          Estimated
 | 
						|
 Value (%)      Sample Size        Sample Size
 | 
						|
              (one sided test)    (two sided test)
 | 
						|
_______________________________________________________________
 | 
						|
    75.000               2               2
 | 
						|
    90.000               2               2
 | 
						|
    95.000               2               2
 | 
						|
    99.000               2               2
 | 
						|
    99.900               3               3
 | 
						|
    99.990               3               3
 | 
						|
    99.999               4               4
 | 
						|
 | 
						|
__________________________________
 | 
						|
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
 | 
						|
 | 
						|
__________________________________
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
__________________________________
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
_____________________________________________________________
 | 
						|
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
 | 
						|
 | 
						|
*/
 | 
						|
 |