mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-25 01:50:30 -04: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
 | |
| 
 | |
| */
 | |
| 
 |