mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			246 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			246 lines
		
	
	
		
			9.4 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 <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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/math/distributions/students_t.hpp>
							 | 
						||
| 
								 | 
							
								   using boost::math::students_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void two_samples_t_test_equal_sd(
							 | 
						||
| 
								 | 
							
								        double Sm1, // Sm1 = Sample Mean 1.
							 | 
						||
| 
								 | 
							
								        double Sd1,   // Sd1 = Sample Standard Deviation 1.
							 | 
						||
| 
								 | 
							
								        unsigned Sn1,   // Sn1 = Sample Size 1.
							 | 
						||
| 
								 | 
							
								        double Sm2,   // Sm2 = Sample Mean 2.
							 | 
						||
| 
								 | 
							
								        double Sd2,   // Sd2 = Sample Standard Deviation 2.
							 | 
						||
| 
								 | 
							
								        unsigned Sn2,   // Sn2 = Sample Size 2.
							 | 
						||
| 
								 | 
							
								        double alpha)   // alpha = Significance Level.
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   // A Students t test applied to two sets of data.
							 | 
						||
| 
								 | 
							
								   // We are testing the null hypothesis that the two
							 | 
						||
| 
								 | 
							
								   // samples have the same mean and that any difference
							 | 
						||
| 
								 | 
							
								   // if due to chance.
							 | 
						||
| 
								 | 
							
								   // See http://www.itl.nist.gov/div898/handbook/eda/section3/eda353.htm
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   using namespace std;
							 | 
						||
| 
								 | 
							
								   // using namespace boost::math;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   using boost::math::students_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   // Print header:
							 | 
						||
| 
								 | 
							
								   cout <<
							 | 
						||
| 
								 | 
							
								      "_______________________________________________\n"
							 | 
						||
| 
								 | 
							
								      "Student t test for two samples (equal variances)\n"
							 | 
						||
| 
								 | 
							
								      "_______________________________________________\n\n";
							 | 
						||
| 
								 | 
							
								   cout << setprecision(5);
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Number of Observations (Sample 1)" << "=  " << Sn1 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 1 Mean" << "=  " << Sm1 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 1 Standard Deviation" << "=  " << Sd1 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Number of Observations (Sample 2)" << "=  " << Sn2 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 2 Mean" << "=  " << Sm2 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 2 Standard Deviation" << "=  " << Sd2 << "\n";
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // Now we can calculate and output some stats:
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // Degrees of freedom:
							 | 
						||
| 
								 | 
							
								   double v = Sn1 + Sn2 - 2;
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Degrees of Freedom" << "=  " << v << "\n";
							 | 
						||
| 
								 | 
							
								   // Pooled variance and hence standard deviation:
							 | 
						||
| 
								 | 
							
								   double sp = sqrt(((Sn1-1) * Sd1 * Sd1 + (Sn2-1) * Sd2 * Sd2) / v);
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Pooled Standard Deviation" << "=  " << sp << "\n";
							 | 
						||
| 
								 | 
							
								   // t-statistic:
							 | 
						||
| 
								 | 
							
								   double t_stat = (Sm1 - Sm2) / (sp * sqrt(1.0 / Sn1 + 1.0 / Sn2));
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "T Statistic" << "=  " << t_stat << "\n";
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // 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 << "Sample 1 Mean != Sample 2 Mean       " ;
							 | 
						||
| 
								 | 
							
								   if(q < alpha / 2)
							 | 
						||
| 
								 | 
							
								      cout << "NOT REJECTED\n";
							 | 
						||
| 
								 | 
							
								   else
							 | 
						||
| 
								 | 
							
								      cout << "REJECTED\n";
							 | 
						||
| 
								 | 
							
								   cout << "Sample 1 Mean <  Sample 2 Mean       ";
							 | 
						||
| 
								 | 
							
								   if(cdf(dist, t_stat) < alpha)
							 | 
						||
| 
								 | 
							
								      cout << "NOT REJECTED\n";
							 | 
						||
| 
								 | 
							
								   else
							 | 
						||
| 
								 | 
							
								      cout << "REJECTED\n";
							 | 
						||
| 
								 | 
							
								   cout << "Sample 1 Mean >  Sample 2 Mean       ";
							 | 
						||
| 
								 | 
							
								   if(cdf(complement(dist, t_stat)) < alpha)
							 | 
						||
| 
								 | 
							
								      cout << "NOT REJECTED\n";
							 | 
						||
| 
								 | 
							
								   else
							 | 
						||
| 
								 | 
							
								      cout << "REJECTED\n";
							 | 
						||
| 
								 | 
							
								   cout << endl << endl;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void two_samples_t_test_unequal_sd(
							 | 
						||
| 
								 | 
							
								        double Sm1,   // Sm1 = Sample Mean 1.
							 | 
						||
| 
								 | 
							
								        double Sd1,   // Sd1 = Sample Standard Deviation 1.
							 | 
						||
| 
								 | 
							
								        unsigned Sn1,   // Sn1 = Sample Size 1.
							 | 
						||
| 
								 | 
							
								        double Sm2,   // Sm2 = Sample Mean 2.
							 | 
						||
| 
								 | 
							
								        double Sd2,   // Sd2 = Sample Standard Deviation 2.
							 | 
						||
| 
								 | 
							
								        unsigned Sn2,   // Sn2 = Sample Size 2.
							 | 
						||
| 
								 | 
							
								        double alpha)   // alpha = Significance Level.
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   // A Students t test applied to two sets of data.
							 | 
						||
| 
								 | 
							
								   // We are testing the null hypothesis that the two
							 | 
						||
| 
								 | 
							
								   // samples have the same mean and 
							 | 
						||
| 
								 | 
							
								   // that any difference is due to chance.
							 | 
						||
| 
								 | 
							
								   // See http://www.itl.nist.gov/div898/handbook/eda/section3/eda353.htm
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   using namespace std;
							 | 
						||
| 
								 | 
							
								   using boost::math::students_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   // Print header:
							 | 
						||
| 
								 | 
							
								   cout <<
							 | 
						||
| 
								 | 
							
								      "_________________________________________________\n"
							 | 
						||
| 
								 | 
							
								      "Student t test for two samples (unequal variances)\n"
							 | 
						||
| 
								 | 
							
								      "_________________________________________________\n\n";
							 | 
						||
| 
								 | 
							
								   cout << setprecision(5);
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Number of Observations (Sample 1)" << "=  " << Sn1 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 1 Mean" << "=  " << Sm1 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 1 Standard Deviation" << "=  " << Sd1 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Number of Observations (Sample 2)" << "=  " << Sn2 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 2 Mean" << "=  " << Sm2 << "\n";
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Sample 2 Standard Deviation" << "=  " << Sd2 << "\n";
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // Now we can calculate and output some stats:
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // Degrees of freedom:
							 | 
						||
| 
								 | 
							
								   double v = Sd1 * Sd1 / Sn1 + Sd2 * Sd2 / Sn2;
							 | 
						||
| 
								 | 
							
								   v *= v;
							 | 
						||
| 
								 | 
							
								   double t1 = Sd1 * Sd1 / Sn1;
							 | 
						||
| 
								 | 
							
								   t1 *= t1;
							 | 
						||
| 
								 | 
							
								   t1 /=  (Sn1 - 1);
							 | 
						||
| 
								 | 
							
								   double t2 = Sd2 * Sd2 / Sn2;
							 | 
						||
| 
								 | 
							
								   t2 *= t2;
							 | 
						||
| 
								 | 
							
								   t2 /= (Sn2 - 1);
							 | 
						||
| 
								 | 
							
								   v /= (t1 + t2);
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "Degrees of Freedom" << "=  " << v << "\n";
							 | 
						||
| 
								 | 
							
								   // t-statistic:
							 | 
						||
| 
								 | 
							
								   double t_stat = (Sm1 - Sm2) / sqrt(Sd1 * Sd1 / Sn1 + Sd2 * Sd2 / Sn2);
							 | 
						||
| 
								 | 
							
								   cout << setw(55) << left << "T Statistic" << "=  " << t_stat << "\n";
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // 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 << "Sample 1 Mean != Sample 2 Mean       " ;
							 | 
						||
| 
								 | 
							
								   if(q < alpha / 2)
							 | 
						||
| 
								 | 
							
								      cout << "NOT REJECTED\n";
							 | 
						||
| 
								 | 
							
								   else
							 | 
						||
| 
								 | 
							
								      cout << "REJECTED\n";
							 | 
						||
| 
								 | 
							
								   cout << "Sample 1 Mean <  Sample 2 Mean       ";
							 | 
						||
| 
								 | 
							
								   if(cdf(dist, t_stat) < alpha)
							 | 
						||
| 
								 | 
							
								      cout << "NOT REJECTED\n";
							 | 
						||
| 
								 | 
							
								   else
							 | 
						||
| 
								 | 
							
								      cout << "REJECTED\n";
							 | 
						||
| 
								 | 
							
								   cout << "Sample 1 Mean >  Sample 2 Mean       ";
							 | 
						||
| 
								 | 
							
								   if(cdf(complement(dist, t_stat)) < alpha)
							 | 
						||
| 
								 | 
							
								      cout << "NOT REJECTED\n";
							 | 
						||
| 
								 | 
							
								   else
							 | 
						||
| 
								 | 
							
								      cout << "REJECTED\n";
							 | 
						||
| 
								 | 
							
								   cout << endl << endl;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   // Run tests for Car Mileage sample data
							 | 
						||
| 
								 | 
							
								   // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3531.htm
							 | 
						||
| 
								 | 
							
								   // from the NIST website http://www.itl.nist.gov.  The data compares
							 | 
						||
| 
								 | 
							
								   // miles per gallon of US cars with miles per gallon of Japanese cars.
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								   two_samples_t_test_equal_sd(20.14458, 6.414700, 249, 30.48101, 6.107710, 79, 0.05);
							 | 
						||
| 
								 | 
							
								   two_samples_t_test_unequal_sd(20.14458, 6.414700, 249, 30.48101, 6.107710, 79, 0.05);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   return 0;
							 | 
						||
| 
								 | 
							
								} // int main()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								Output is:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  _______________________________________________
							 | 
						||
| 
								 | 
							
								  Student t test for two samples (equal variances)
							 | 
						||
| 
								 | 
							
								  _______________________________________________
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  Number of Observations (Sample 1)                      =  249
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean                                          =  20.145
							 | 
						||
| 
								 | 
							
								  Sample 1 Standard Deviation                            =  6.4147
							 | 
						||
| 
								 | 
							
								  Number of Observations (Sample 2)                      =  79
							 | 
						||
| 
								 | 
							
								  Sample 2 Mean                                          =  30.481
							 | 
						||
| 
								 | 
							
								  Sample 2 Standard Deviation                            =  6.1077
							 | 
						||
| 
								 | 
							
								  Degrees of Freedom                                     =  326
							 | 
						||
| 
								 | 
							
								  Pooled Standard Deviation                              =  6.3426
							 | 
						||
| 
								 | 
							
								  T Statistic                                            =  -12.621
							 | 
						||
| 
								 | 
							
								  Probability that difference is due to chance           =  5.273e-030
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  Results for Alternative Hypothesis and alpha           =  0.0500
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  Alternative Hypothesis              Conclusion
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean != Sample 2 Mean       NOT REJECTED
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean <  Sample 2 Mean       NOT REJECTED
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean >  Sample 2 Mean       REJECTED
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  _________________________________________________
							 | 
						||
| 
								 | 
							
								  Student t test for two samples (unequal variances)
							 | 
						||
| 
								 | 
							
								  _________________________________________________
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  Number of Observations (Sample 1)                      =  249
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean                                          =  20.14458
							 | 
						||
| 
								 | 
							
								  Sample 1 Standard Deviation                            =  6.41470
							 | 
						||
| 
								 | 
							
								  Number of Observations (Sample 2)                      =  79
							 | 
						||
| 
								 | 
							
								  Sample 2 Mean                                          =  30.48101
							 | 
						||
| 
								 | 
							
								  Sample 2 Standard Deviation                            =  6.10771
							 | 
						||
| 
								 | 
							
								  Degrees of Freedom                                     =  136.87499
							 | 
						||
| 
								 | 
							
								  T Statistic                                            =  -12.94627
							 | 
						||
| 
								 | 
							
								  Probability that difference is due to chance           =  1.571e-025
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  Results for Alternative Hypothesis and alpha           =  0.0500
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  Alternative Hypothesis              Conclusion
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean != Sample 2 Mean       NOT REJECTED
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean <  Sample 2 Mean       NOT REJECTED
							 | 
						||
| 
								 | 
							
								  Sample 1 Mean >  Sample 2 Mean       REJECTED
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 |