| // 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(dist, t_stat) < alpha) |
| 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 << 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 REJECTED |
| Mean > 38.900 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 |
| |
| |
| */ |
| |