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)
6 #ifndef BOOST_MATH_STATISTICS_T_TEST_HPP
7 #define BOOST_MATH_STATISTICS_T_TEST_HPP
12 #include <boost/math/distributions/students_t.hpp>
13 #include <boost/math/statistics/univariate_statistics.hpp>
15 namespace boost::math::statistics {
17 template<typename Real>
18 std::pair<Real, Real> one_sample_t_test(Real sample_mean, Real sample_variance, Real num_samples, Real assumed_mean) {
20 typedef boost::math::policies::policy<
21 boost::math::policies::promote_float<false>,
22 boost::math::policies::promote_double<false> >
25 Real test_statistic = (sample_mean - assumed_mean)/sqrt(sample_variance/num_samples);
26 auto student = boost::math::students_t_distribution<Real, no_promote_policy>(num_samples - 1);
28 if (test_statistic > 0) {
29 pvalue = 2*boost::math::cdf<Real>(student, -test_statistic);;
32 pvalue = 2*boost::math::cdf<Real>(student, test_statistic);
34 return std::make_pair(test_statistic, pvalue);
37 template<class ForwardIterator>
38 auto one_sample_t_test(ForwardIterator begin, ForwardIterator end, typename std::iterator_traits<ForwardIterator>::value_type assumed_mean) {
39 using Real = typename std::iterator_traits<ForwardIterator>::value_type;
40 auto [mu, s_sq] = mean_and_sample_variance(begin, end);
41 return one_sample_t_test(mu, s_sq, Real(std::distance(begin, end)), assumed_mean);
44 template<class Container>
45 auto one_sample_t_test(Container const & v, typename Container::value_type assumed_mean) {
46 return one_sample_t_test(v.begin(), v.end(), assumed_mean);