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