t_test.hpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // (C) Copyright Nick Thompson 2019.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_MATH_STATISTICS_T_TEST_HPP
  6. #define BOOST_MATH_STATISTICS_T_TEST_HPP
  7. #include <cmath>
  8. #include <iterator>
  9. #include <utility>
  10. #include <boost/math/distributions/students_t.hpp>
  11. #include <boost/math/statistics/univariate_statistics.hpp>
  12. namespace boost::math::statistics {
  13. template<typename Real>
  14. std::pair<Real, Real> one_sample_t_test(Real sample_mean, Real sample_variance, Real num_samples, Real assumed_mean) {
  15. using std::sqrt;
  16. typedef boost::math::policies::policy<
  17. boost::math::policies::promote_float<false>,
  18. boost::math::policies::promote_double<false> >
  19. no_promote_policy;
  20. Real test_statistic = (sample_mean - assumed_mean)/sqrt(sample_variance/num_samples);
  21. auto student = boost::math::students_t_distribution<Real, no_promote_policy>(num_samples - 1);
  22. Real pvalue;
  23. if (test_statistic > 0) {
  24. pvalue = 2*boost::math::cdf<Real>(student, -test_statistic);;
  25. }
  26. else {
  27. pvalue = 2*boost::math::cdf<Real>(student, test_statistic);
  28. }
  29. return std::make_pair(test_statistic, pvalue);
  30. }
  31. template<class ForwardIterator>
  32. auto one_sample_t_test(ForwardIterator begin, ForwardIterator end, typename std::iterator_traits<ForwardIterator>::value_type assumed_mean) {
  33. using Real = typename std::iterator_traits<ForwardIterator>::value_type;
  34. auto [mu, s_sq] = mean_and_sample_variance(begin, end);
  35. return one_sample_t_test(mu, s_sq, Real(std::distance(begin, end)), assumed_mean);
  36. }
  37. template<class Container>
  38. auto one_sample_t_test(Container const & v, typename Container::value_type assumed_mean) {
  39. return one_sample_t_test(v.begin(), v.end(), assumed_mean);
  40. }
  41. }
  42. #endif