Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:55:38

0001 //  (C) Copyright Matt Borland 2021.
0002 //  Use, modification and distribution are subject to the
0003 //  Boost Software License, Version 1.0. (See accompanying file
0004 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0005 
0006 #ifndef BOOST_MATH_STATISTICS_Z_TEST_HPP
0007 #define BOOST_MATH_STATISTICS_Z_TEST_HPP
0008 
0009 #include <boost/math/distributions/normal.hpp>
0010 #include <boost/math/statistics/univariate_statistics.hpp>
0011 #include <iterator>
0012 #include <type_traits>
0013 #include <utility>
0014 #include <cmath>
0015 
0016 namespace boost { namespace math { namespace statistics { namespace detail {
0017 
0018 template<typename ReturnType, typename T>
0019 ReturnType one_sample_z_test_impl(T sample_mean, T sample_variance, T sample_size, T assumed_mean)
0020 {
0021     using Real = typename std::tuple_element<0, ReturnType>::type;
0022     using std::sqrt;
0023     using no_promote_policy = boost::math::policies::policy<boost::math::policies::promote_float<false>, boost::math::policies::promote_double<false>>;
0024 
0025     Real test_statistic = (sample_mean - assumed_mean) / (sample_variance / sqrt(sample_size));
0026     auto z = boost::math::normal_distribution<Real, no_promote_policy>(sample_size - 1);
0027     Real pvalue;
0028     if(test_statistic > 0)
0029     {
0030         pvalue = 2*boost::math::cdf<Real>(z, -test_statistic);
0031     }
0032     else
0033     {
0034         pvalue = 2*boost::math::cdf<Real>(z, test_statistic);
0035     }
0036 
0037     return std::make_pair(test_statistic, pvalue);
0038 }
0039 
0040 template<typename ReturnType, typename ForwardIterator>
0041 ReturnType one_sample_z_test_impl(ForwardIterator begin, ForwardIterator end, typename std::iterator_traits<ForwardIterator>::value_type assumed_mean) 
0042 {
0043     using Real = typename std::tuple_element<0, ReturnType>::type;
0044     std::pair<Real, Real> temp = mean_and_sample_variance(begin, end);
0045     Real mu = std::get<0>(temp);
0046     Real s_sq = std::get<1>(temp);
0047     return one_sample_z_test_impl<ReturnType>(mu, s_sq, Real(std::distance(begin, end)), Real(assumed_mean));
0048 }
0049 
0050 template<typename ReturnType, typename T>
0051 ReturnType two_sample_z_test_impl(T mean_1, T variance_1, T size_1, T mean_2, T variance_2, T size_2)
0052 {
0053     using Real = typename std::tuple_element<0, ReturnType>::type;
0054     using std::sqrt;
0055     using no_promote_policy = boost::math::policies::policy<boost::math::policies::promote_float<false>, boost::math::policies::promote_double<false>>;
0056 
0057     Real test_statistic = (mean_1 - mean_2) / sqrt(variance_1/size_1 + variance_2/size_2);
0058     auto z = boost::math::normal_distribution<Real, no_promote_policy>(size_1 + size_2 - 1);
0059     Real pvalue;
0060     if(test_statistic > 0)
0061     {
0062         pvalue = 2*boost::math::cdf<Real>(z, -test_statistic);
0063     }
0064     else
0065     {
0066         pvalue = 2*boost::math::cdf<Real>(z, test_statistic);
0067     }
0068 
0069     return std::make_pair(test_statistic, pvalue);
0070 }
0071 
0072 template<typename ReturnType, typename ForwardIterator>
0073 ReturnType two_sample_z_test_impl(ForwardIterator begin_1, ForwardIterator end_1, ForwardIterator begin_2, ForwardIterator end_2)
0074 {
0075     using Real = typename std::tuple_element<0, ReturnType>::type;
0076     using std::sqrt;
0077     auto n1 = std::distance(begin_1, end_1);
0078     auto n2 = std::distance(begin_2, end_2);
0079 
0080     ReturnType temp_1 = mean_and_sample_variance(begin_1, end_1);
0081     Real mean_1 = std::get<0>(temp_1);
0082     Real variance_1 = std::get<1>(temp_1);
0083 
0084     ReturnType temp_2 = mean_and_sample_variance(begin_2, end_2);
0085     Real mean_2 = std::get<0>(temp_2);
0086     Real variance_2 = std::get<1>(temp_2);
0087 
0088     return two_sample_z_test_impl<ReturnType>(mean_1, variance_1, Real(n1), mean_2, variance_2, Real(n2));
0089 }
0090 
0091 } // detail
0092 
0093 template<typename Real, typename std::enable_if<std::is_integral<Real>::value, bool>::type = true>
0094 inline auto one_sample_z_test(Real sample_mean, Real sample_variance, Real sample_size, Real assumed_mean) -> std::pair<double, double>
0095 {
0096     return detail::one_sample_z_test_impl<std::pair<double, double>>(sample_mean, sample_variance, sample_size, assumed_mean);
0097 }
0098 
0099 template<typename Real, typename std::enable_if<!std::is_integral<Real>::value, bool>::type = true>
0100 inline auto one_sample_z_test(Real sample_mean, Real sample_variance, Real sample_size, Real assumed_mean) -> std::pair<Real, Real>
0101 {
0102     return detail::one_sample_z_test_impl<std::pair<Real, Real>>(sample_mean, sample_variance, sample_size, assumed_mean);
0103 }
0104 
0105 template<typename ForwardIterator, typename Real = typename std::iterator_traits<ForwardIterator>::value_type, 
0106          typename std::enable_if<std::is_integral<Real>::value, bool>::type = true>
0107 inline auto one_sample_z_test(ForwardIterator begin, ForwardIterator end, Real assumed_mean) -> std::pair<double, double>
0108 {
0109     return detail::one_sample_z_test_impl<std::pair<double, double>>(begin, end, assumed_mean);
0110 }
0111 
0112 template<typename ForwardIterator, typename Real = typename std::iterator_traits<ForwardIterator>::value_type, 
0113          typename std::enable_if<!std::is_integral<Real>::value, bool>::type = true>
0114 inline auto one_sample_z_test(ForwardIterator begin, ForwardIterator end, Real assumed_mean) -> std::pair<Real, Real>
0115 {
0116     return detail::one_sample_z_test_impl<std::pair<Real, Real>>(begin, end, assumed_mean);
0117 }
0118 
0119 template<typename Container, typename Real = typename Container::value_type,
0120          typename std::enable_if<std::is_integral<Real>::value, bool>::type = true>
0121 inline auto one_sample_z_test(Container const & v, Real assumed_mean) -> std::pair<double, double>
0122 {
0123     return detail::one_sample_z_test_impl<std::pair<double, double>>(std::begin(v), std::end(v), assumed_mean);
0124 }
0125 
0126 template<typename Container, typename Real = typename Container::value_type,
0127          typename std::enable_if<!std::is_integral<Real>::value, bool>::type = true>
0128 inline auto one_sample_z_test(Container const & v, Real assumed_mean) -> std::pair<Real, Real>
0129 {
0130     return detail::one_sample_z_test_impl<std::pair<Real, Real>>(std::begin(v), std::end(v), assumed_mean);
0131 }
0132 
0133 template<typename ForwardIterator, typename Real = typename std::iterator_traits<ForwardIterator>::value_type, 
0134          typename std::enable_if<std::is_integral<Real>::value, bool>::type = true>
0135 inline auto two_sample_z_test(ForwardIterator begin_1, ForwardIterator end_1, ForwardIterator begin_2, ForwardIterator end_2) -> std::pair<double, double>
0136 {
0137     return detail::two_sample_z_test_impl<std::pair<double, double>>(begin_1, end_1, begin_2, end_2);
0138 }
0139 
0140 template<typename ForwardIterator, typename Real = typename std::iterator_traits<ForwardIterator>::value_type, 
0141          typename std::enable_if<!std::is_integral<Real>::value, bool>::type = true>
0142 inline auto two_sample_z_test(ForwardIterator begin_1, ForwardIterator end_1, ForwardIterator begin_2, ForwardIterator end_2) -> std::pair<Real, Real>
0143 {
0144     return detail::two_sample_z_test_impl<std::pair<Real, Real>>(begin_1, end_1, begin_2, end_2);
0145 }
0146 
0147 template<typename Container, typename Real = typename Container::value_type, typename std::enable_if<std::is_integral<Real>::value, bool>::type = true>
0148 inline auto two_sample_z_test(Container const & u, Container const & v) -> std::pair<double, double>
0149 {
0150     return detail::two_sample_z_test_impl<std::pair<double, double>>(std::begin(u), std::end(u), std::begin(v), std::end(v));
0151 }
0152 
0153 template<typename Container, typename Real = typename Container::value_type, typename std::enable_if<!std::is_integral<Real>::value, bool>::type = true>
0154 inline auto two_sample_z_test(Container const & u, Container const & v) -> std::pair<Real, Real>
0155 {
0156     return detail::two_sample_z_test_impl<std::pair<Real, Real>>(std::begin(u), std::end(u), std::begin(v), std::end(v));
0157 }
0158 
0159 }}} // boost::math::statistics
0160 
0161 #endif // BOOST_MATH_STATISTICS_Z_TEST_HPP