| // 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: |
| double sp = sqrt(((Sn1-1) * Sd1 * Sd1 + (Sn2-1) * Sd2 * Sd2) / v); |
| cout << setw(55) << left << "Pooled Standard Deviation" << "= " << v << "\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 |
| ------ Rebuild All started: Project: students_t_two_samples, Configuration: Release Win32 ------ |
| students_t_two_samples.cpp |
| Generating code |
| Finished generating code |
| students_t_two_samples.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Release\students_t_two_samples.exe |
| _______________________________________________ |
| 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 = 326 |
| 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 |
| |
| |
| ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ========== |
| |
| |
| */ |
| |