Statistics/Chi-squared distribution: Difference between revisions
Content added Content deleted
(New post.) |
(New post.) |
||
Line 87: | Line 87: | ||
<br /><br /><br /> |
<br /><br /><br /> |
||
=={{header|C++}}== |
|||
<syntaxhighlight lang="c++"> |
|||
#include <iostream> |
|||
#include <cmath> |
|||
#include <numbers> |
|||
#include <iomanip> |
|||
#include <array> |
|||
// The normalised lower incomplete gamma function. |
|||
double gamma_cdf(const double aX, const double aK) { |
|||
double result = 0.0; |
|||
for ( uint32_t m = 0; m <= 99; ++m ) { |
|||
result += pow(aX, m) / tgamma(aK + m + 1); |
|||
} |
|||
result *= pow(aX, aK) * exp(-aX); |
|||
return result; |
|||
} |
|||
// The cumulative probability function of the Chi-squared distribution. |
|||
double cdf(const double aX, const double aK) { |
|||
if ( aK > 1'000 && aK < 100 ) { |
|||
return 1.0; |
|||
} |
|||
return ( aX > 0.0 && aK > 0.0 ) ? gamma_cdf(aX / 2, aK / 2) : 0.0; |
|||
} |
|||
// The probability density function of the Chi-squared distribution. |
|||
double pdf(const double aX, const double aK) { |
|||
return ( aX > 0.0 ) ? pow(aX, aK / 2 - 1) * exp(-aX / 2) / ( pow(2, aK / 2) * tgamma(aK / 2) ) : 0.0; |
|||
} |
|||
int main() { |
|||
std::cout << " Values of the Chi-squared probability distribution function" << std::endl; |
|||
std::cout << " x/k 1 2 3 4 5" << std::endl; |
|||
for ( uint32_t x = 0; x <= 10; x++ ) { |
|||
std::cout << std::setw(2) << x; |
|||
for ( uint32_t k = 1; k <= 5; ++k ) { |
|||
std::cout << std::setw(10) << std::fixed << pdf(x, k); |
|||
} |
|||
std::cout << std::endl; |
|||
} |
|||
std::cout << "\n Values for the Chi-squared distribution with 3 degrees of freedom" << std::endl; |
|||
std::cout << "Chi-squared cumulative pdf p-value" << std::endl; |
|||
for ( uint32_t x : { 1, 2, 4, 8, 16, 32 } ) { |
|||
const double cumulative_pdf = cdf(x, 3); |
|||
std::cout << std::setw(6) << x << std::setw(19) << std::fixed << cumulative_pdf |
|||
<< std::setw(14) << ( 1.0 - cumulative_pdf ) << std::endl; |
|||
} |
|||
const std::array<const std::array<int32_t, 2>, 4> observed = |
|||
{ { { 77, 23 }, { 88, 12 }, { 79, 21 }, { 81, 19 } } }; |
|||
const std::array<const std::array<double, 2>, 4> expected = |
|||
{ { { 81.25, 18.75 }, { 81.25, 18.75 }, { 81.25, 18.75 }, { 81.25, 18.75 } } }; |
|||
double testStatistic = 0.0; |
|||
for ( uint64_t i = 0; i < observed.size(); ++i ) { |
|||
for ( uint64_t j = 0; j < observed[0].size(); ++j ) { |
|||
testStatistic += pow(observed[i][j] - expected[i][j], 2.0) / expected[i][j]; |
|||
} |
|||
} |
|||
const uint64_t degreesFreedom = ( observed.size() - 1 ) / ( observed[0].size() - 1 ); |
|||
std::cout << "\nFor the airport data:" << std::endl; |
|||
std::cout << " test statistic : " << std::fixed << testStatistic << std::endl; |
|||
std::cout << " degrees of freedom : " << degreesFreedom << std::endl; |
|||
std::cout << " Chi-squared : " << std::fixed << pdf(testStatistic, degreesFreedom) << std::endl; |
|||
std::cout << " p-value : " << std::fixed << cdf(testStatistic, degreesFreedom) << std::endl; |
|||
} |
|||
</syntaxhighlight> |
|||
{{ out }} |
|||
<pre> |
|||
Values of the Chi-squared probability distribution function |
|||
x/k 1 2 3 4 5 |
|||
0 0.000000 0.000000 0.000000 0.000000 0.000000 |
|||
1 0.241971 0.303265 0.241971 0.151633 0.080657 |
|||
2 0.103777 0.183940 0.207554 0.183940 0.138369 |
|||
3 0.051393 0.111565 0.154180 0.167348 0.154180 |
|||
4 0.026995 0.067668 0.107982 0.135335 0.143976 |
|||
5 0.014645 0.041042 0.073225 0.102606 0.122042 |
|||
6 0.008109 0.024894 0.048652 0.074681 0.097304 |
|||
7 0.004553 0.015099 0.031873 0.052845 0.074371 |
|||
8 0.002583 0.009158 0.020667 0.036631 0.055112 |
|||
9 0.001477 0.005554 0.013296 0.024995 0.039887 |
|||
10 0.000850 0.003369 0.008500 0.016845 0.028335 |
|||
Values for the Chi-squared distribution with 3 degrees of freedom |
|||
Chi-squared cumulative pdf p-value |
|||
1 0.198748 0.801252 |
|||
2 0.427593 0.572407 |
|||
4 0.738536 0.261464 |
|||
8 0.953988 0.046012 |
|||
16 0.998866 0.001134 |
|||
32 0.999999 0.000001 |
|||
For the airport data: |
|||
test statistic : 4.512821 |
|||
degrees of freedom : 3 |
|||
Chi-squared : 0.088754 |
|||
p-value : 0.788850 |
|||
</pre> |
|||
=={{header|Java}}== |
=={{header|Java}}== |