...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This example computes a table of the power of the χ2 test at the 5% significance level, for various degrees of freedom and non-centrality parameters. The table is deliberately the same as Table 6 from "The Non-Central χ2 and F-Distributions and their applications.", P. B. Patnaik, Biometrika, Vol. 36, No. 1/2 (June 1949), 202-232.
First we need some includes to access the non-central chi squared distribution (and some basic std output of course).
#include <boost/math/distributions/non_central_chi_squared.hpp> using boost::math::chi_squared; using boost::math::non_central_chi_squared; #include <iostream> using std::cout; using std::endl; using std::setprecision; int main() {
Create a table of the power of the χ2 test at 5% significance level, start with a table header:
cout << "[table\n[[[nu]]"; for(int lam = 2; lam <= 20; lam += 2) { cout << "[[lambda]=" << lam << "]"; } cout << "]\n";
(Note: the enclosing [] brackets are to format as a table in Boost.Quickbook).
Enumerate the rows and columns and print the power of the test for each table cell:
for(int n = 2; n <= 20; ++n) { cout << "[[" << n << "]"; for(int lam = 2; lam <= 20; lam += 2) {
Calculate the χ2 statistic for a 5% significance:
double cs = quantile(complement(chi_squared(n), 0.05));
The power of the test is given by the complement of the CDF of the non-central χ2 distribution:
double beta = cdf(complement(non_central_chi_squared(n, lam), cs));
Then output the cell value:
cout << "[" << setprecision(3) << beta << "]"; } cout << "]" << endl; } cout << "]" << endl; }
The output from this program is a table in Boost.Quickbook format as shown below.
We can interpret this as follows - for example if ν=10 and λ=10 then the power of the test is 0.542 - so we have only a 54% chance of correctly detecting that our null hypothesis is false, and a 46% chance of incurring a type II error (failing to reject the null hypothesis when it is in fact false):
ν |
λ=2 |
λ=4 |
λ=6 |
λ=8 |
λ=10 |
λ=12 |
λ=14 |
λ=16 |
λ=18 |
λ=20 |
---|---|---|---|---|---|---|---|---|---|---|
2 |
0.226 |
0.415 |
0.584 |
0.718 |
0.815 |
0.883 |
0.928 |
0.957 |
0.974 |
0.985 |
3 |
0.192 |
0.359 |
0.518 |
0.654 |
0.761 |
0.84 |
0.896 |
0.934 |
0.959 |
0.975 |
4 |
0.171 |
0.32 |
0.47 |
0.605 |
0.716 |
0.802 |
0.866 |
0.912 |
0.943 |
0.964 |
5 |
0.157 |
0.292 |
0.433 |
0.564 |
0.677 |
0.769 |
0.839 |
0.89 |
0.927 |
0.952 |
6 |
0.146 |
0.27 |
0.403 |
0.531 |
0.644 |
0.738 |
0.813 |
0.869 |
0.911 |
0.94 |
7 |
0.138 |
0.252 |
0.378 |
0.502 |
0.614 |
0.71 |
0.788 |
0.849 |
0.895 |
0.928 |
8 |
0.131 |
0.238 |
0.357 |
0.477 |
0.588 |
0.685 |
0.765 |
0.829 |
0.879 |
0.915 |
9 |
0.125 |
0.225 |
0.339 |
0.454 |
0.564 |
0.661 |
0.744 |
0.811 |
0.863 |
0.903 |
10 |
0.121 |
0.215 |
0.323 |
0.435 |
0.542 |
0.64 |
0.723 |
0.793 |
0.848 |
0.891 |
11 |
0.117 |
0.206 |
0.309 |
0.417 |
0.523 |
0.62 |
0.704 |
0.775 |
0.833 |
0.878 |
12 |
0.113 |
0.198 |
0.297 |
0.402 |
0.505 |
0.601 |
0.686 |
0.759 |
0.818 |
0.866 |
13 |
0.11 |
0.191 |
0.286 |
0.387 |
0.488 |
0.584 |
0.669 |
0.743 |
0.804 |
0.854 |
14 |
0.108 |
0.185 |
0.276 |
0.374 |
0.473 |
0.567 |
0.653 |
0.728 |
0.791 |
0.842 |
15 |
0.105 |
0.179 |
0.267 |
0.362 |
0.459 |
0.552 |
0.638 |
0.713 |
0.777 |
0.83 |
16 |
0.103 |
0.174 |
0.259 |
0.351 |
0.446 |
0.538 |
0.623 |
0.699 |
0.764 |
0.819 |
17 |
0.101 |
0.169 |
0.251 |
0.341 |
0.434 |
0.525 |
0.609 |
0.686 |
0.752 |
0.807 |
18 |
0.0992 |
0.165 |
0.244 |
0.332 |
0.423 |
0.512 |
0.596 |
0.673 |
0.74 |
0.796 |
19 |
0.0976 |
0.161 |
0.238 |
0.323 |
0.412 |
0.5 |
0.584 |
0.66 |
0.728 |
0.786 |
20 |
0.0961 |
0.158 |
0.232 |
0.315 |
0.402 |
0.489 |
0.572 |
0.648 |
0.716 |
0.775 |
See nc_chi_sq_example.cpp for the full C++ source code.