1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- // (C) Copyright Nick Thompson 2019.
- // 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)
- #ifndef BOOST_MATH_STATISTICS_T_TEST_HPP
- #define BOOST_MATH_STATISTICS_T_TEST_HPP
- #include <cmath>
- #include <iterator>
- #include <utility>
- #include <boost/math/distributions/students_t.hpp>
- #include <boost/math/statistics/univariate_statistics.hpp>
- namespace boost::math::statistics {
- template<typename Real>
- std::pair<Real, Real> one_sample_t_test(Real sample_mean, Real sample_variance, Real num_samples, Real assumed_mean) {
- using std::sqrt;
- typedef boost::math::policies::policy<
- boost::math::policies::promote_float<false>,
- boost::math::policies::promote_double<false> >
- no_promote_policy;
- Real test_statistic = (sample_mean - assumed_mean)/sqrt(sample_variance/num_samples);
- auto student = boost::math::students_t_distribution<Real, no_promote_policy>(num_samples - 1);
- Real pvalue;
- if (test_statistic > 0) {
- pvalue = 2*boost::math::cdf<Real>(student, -test_statistic);;
- }
- else {
- pvalue = 2*boost::math::cdf<Real>(student, test_statistic);
- }
- return std::make_pair(test_statistic, pvalue);
- }
- template<class ForwardIterator>
- auto one_sample_t_test(ForwardIterator begin, ForwardIterator end, typename std::iterator_traits<ForwardIterator>::value_type assumed_mean) {
- using Real = typename std::iterator_traits<ForwardIterator>::value_type;
- auto [mu, s_sq] = mean_and_sample_variance(begin, end);
- return one_sample_t_test(mu, s_sq, Real(std::distance(begin, end)), assumed_mean);
- }
- template<class Container>
- auto one_sample_t_test(Container const & v, typename Container::value_type assumed_mean) {
- return one_sample_t_test(v.begin(), v.end(), assumed_mean);
- }
- }
- #endif
|