abseil-cpp/absl/random/internal/chi_square.h
Go to the documentation of this file.
1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef ABSL_RANDOM_INTERNAL_CHI_SQUARE_H_
16 #define ABSL_RANDOM_INTERNAL_CHI_SQUARE_H_
17 
18 // The chi-square statistic.
19 //
20 // Useful for evaluating if `D` independent random variables are behaving as
21 // expected, or if two distributions are similar. (`D` is the degrees of
22 // freedom).
23 //
24 // Each bucket should have an expected count of 10 or more for the chi square to
25 // be meaningful.
26 
27 #include <cassert>
28 
29 #include "absl/base/config.h"
30 
31 namespace absl {
33 namespace random_internal {
34 
35 constexpr const char kChiSquared[] = "chi-squared";
36 
37 // Returns the measured chi square value, using a single expected value. This
38 // assumes that the values in [begin, end) are uniformly distributed.
39 template <typename Iterator>
40 double ChiSquareWithExpected(Iterator begin, Iterator end, double expected) {
41  // Compute the sum and the number of buckets.
42  assert(expected >= 10); // require at least 10 samples per bucket.
43  double chi_square = 0;
44  for (auto it = begin; it != end; it++) {
45  double d = static_cast<double>(*it) - expected;
46  chi_square += d * d;
47  }
48  chi_square = chi_square / expected;
49  return chi_square;
50 }
51 
52 // Returns the measured chi square value, taking the actual value of each bucket
53 // from the first set of iterators, and the expected value of each bucket from
54 // the second set of iterators.
55 template <typename Iterator, typename Expected>
56 double ChiSquare(Iterator it, Iterator end, Expected eit, Expected eend) {
57  double chi_square = 0;
58  for (; it != end && eit != eend; ++it, ++eit) {
59  if (*it > 0) {
60  assert(*eit > 0);
61  }
62  double e = static_cast<double>(*eit);
63  double d = static_cast<double>(*it - *eit);
64  if (d != 0) {
65  assert(e > 0);
66  chi_square += (d * d) / e;
67  }
68  }
69  assert(it == end && eit == eend);
70  return chi_square;
71 }
72 
73 // ======================================================================
74 // The following methods can be used for an arbitrary significance level.
75 //
76 
77 // Calculates critical chi-square values to produce the given p-value using a
78 // bisection search for a value within epsilon, relying on the monotonicity of
79 // ChiSquarePValue().
80 double ChiSquareValue(int dof, double p);
81 
82 // Calculates the p-value (probability) of a given chi-square value.
83 double ChiSquarePValue(double chi_square, int dof);
84 
85 } // namespace random_internal
87 } // namespace absl
88 
89 #endif // ABSL_RANDOM_INTERNAL_CHI_SQUARE_H_
regen-readme.it
it
Definition: regen-readme.py:15
begin
char * begin
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1007
ABSL_NAMESPACE_END
#define ABSL_NAMESPACE_END
Definition: third_party/abseil-cpp/absl/base/config.h:171
absl::random_internal::ChiSquareWithExpected
double ChiSquareWithExpected(Iterator begin, Iterator end, double expected)
Definition: abseil-cpp/absl/random/internal/chi_square.h:40
absl::FormatConversionChar::e
@ e
ABSL_NAMESPACE_BEGIN
#define ABSL_NAMESPACE_BEGIN
Definition: third_party/abseil-cpp/absl/base/config.h:170
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
absl::random_internal::ChiSquarePValue
double ChiSquarePValue(double chi_square, int dof)
Definition: abseil-cpp/absl/random/internal/chi_square.cc:157
absl::random_internal::ChiSquareValue
double ChiSquareValue(int dof, double p)
Definition: abseil-cpp/absl/random/internal/chi_square.cc:106
absl::inlined_vector_internal::Iterator
Pointer< A > Iterator
Definition: abseil-cpp/absl/container/internal/inlined_vector.h:64
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
absl::random_internal::kChiSquared
constexpr const char kChiSquared[]
Definition: abseil-cpp/absl/random/internal/chi_square.h:35
absl::random_internal::ChiSquare
double ChiSquare(Iterator it, Iterator end, Expected eit, Expected eend)
Definition: abseil-cpp/absl/random/internal/chi_square.h:56


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:53