mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -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
 | 
						|
  
 | 
						|
 | 
						|
 | 
						|
*/
 | 
						|
 |