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