]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/math/statistics/t_test.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / math / statistics / t_test.hpp
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
6 #ifndef BOOST_MATH_STATISTICS_T_TEST_HPP
7 #define BOOST_MATH_STATISTICS_T_TEST_HPP
8
9 #include <cmath>
10 #include <iterator>
11 #include <utility>
12 #include <boost/math/distributions/students_t.hpp>
13 #include <boost/math/statistics/univariate_statistics.hpp>
14
15 namespace boost::math::statistics {
16
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) {
19 using std::sqrt;
20 typedef boost::math::policies::policy<
21 boost::math::policies::promote_float<false>,
22 boost::math::policies::promote_double<false> >
23 no_promote_policy;
24
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);
27 Real pvalue;
28 if (test_statistic > 0) {
29 pvalue = 2*boost::math::cdf<Real>(student, -test_statistic);;
30 }
31 else {
32 pvalue = 2*boost::math::cdf<Real>(student, test_statistic);
33 }
34 return std::make_pair(test_statistic, pvalue);
35 }
36
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);
42 }
43
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);
47 }
48
49 }
50 #endif