123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- // 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
- */
|