1 /++
2 Moment of probability distributions.
3 +/
4 /**
5 Authors: [Ilya Yaroshenko](http://9il.github.io)
6 
7 Copyright: © 2014-2015 [Ilya Yaroshenko](http://9il.github.io)
8 
9 License: MIT
10 */
11 module atmosphere.moment;
12 
13 import atmosphere.math: besselKR;
14 
15 import core.stdc.tgmath;
16 
17 import std.typecons;
18 
19 
20 /++
21 Moments of the generalized gamma distribution
22 +/
23 T generalizedGammaMean(T)(T shape, T scale, T power, uint order = 1)
24 {
25 	import std.math : pow;
26 	return scale.pow(order) * (tgamma(shape+order/power) / tgamma(shape));
27 }
28 
29 ///
30 unittest
31 {
32 	auto expectation     = generalizedGammaMean!double(2.0, 3.0, 4.0);
33 	auto secondRowMoment = generalizedGammaMean!double(2.0, 3.0, 4.0, 2);
34 }
35 
36 /++
37 Moments of the generalized variance-gamma distribution
38 +/
39 T generalizedVarianceGammaMean(T)(T shape, T scale, T power, T beta)
40 {
41 	return beta * generalizedGammaMean(shape, scale, power);
42 }
43 
44 ///
45 unittest
46 {
47 	auto expectation = generalizedVarianceGammaMean!double(2.0, 3.0, 4.0, 5.0);
48 }
49 
50 
51 /++
52 Moments of the generalized inverse Gaussian distribution
53 +/
54 T properGeneralizedInverseGaussianMean(T)(T lambda, T eta, T omega, uint order = 1)
55 in {
56 	assert(order);
57 }
58 body {
59 	import std.math : pow;
60 	return eta.pow(order) * besselKR(lambda, omega, order-1);
61 }
62 
63 ///
64 unittest
65 {
66 	auto expectation     = properGeneralizedInverseGaussianMean!double(2.0, 3.0, 4.0);
67 	auto secondRowMoment = properGeneralizedInverseGaussianMean!double(2.0, 3.0, 4.0, 2);
68 }
69 
70 
71 /++
72 Variance of the generalized inverse Gaussian distribution
73 +/
74 //(besselK[x-1, y] * besselK[x+1, y] - besselK[x, y]^2) / besselK[x-1, y]^2
75 T properGeneralizedInverseGaussianVariance(T)(T lambda, T eta, T omega)
76 {
77 	immutable r = besselKR(lambda, omega);
78 	return eta^^2 * (r * (2 * (lambda + 1) / omega - r) + 1);
79 }
80 
81 ///
82 unittest
83 {
84 	import std.math : approxEqual;
85 	auto expectation     = properGeneralizedInverseGaussianMean!double(2.0, 3.0, 4.0);
86 	auto secondRowMoment = properGeneralizedInverseGaussianMean!double(2.0, 3.0, 4.0, 2);
87 	auto variance        = properGeneralizedInverseGaussianVariance!double(2.0, 3.0, 4.0);
88 	assert(approxEqual(secondRowMoment - expectation^^2, variance));
89 }
90 
91 
92 /++
93 Mean of the generalized Hyperbolic distribution
94 +/
95 T generalizedHyperbolicMean(T)(T lambda, T beta, T eta, T omega)
96 {
97 	return beta * properGeneralizedInverseGaussianMean(lambda, eta, omega);
98 }
99 
100 ///
101 unittest
102 {
103 	auto expectation = generalizedHyperbolicMean!double(2.0, 5.0, 3.0, 4.0);
104 }
105 
106 
107 /++
108 Variance of the generalized Hyperbolic distribution
109 +/
110 T generalizedHyperbolicVariance(T)(T lambda, T beta, T eta, T omega)
111 {
112 	immutable r = besselKR(lambda, omega);
113 	return eta * r + (beta * eta) ^^ 2 * (r * (2 * (lambda + 1) / omega - r) + 1);
114 }
115 
116 ///
117 unittest
118 {
119 	auto variance = generalizedHyperbolicVariance!double(2.0, 5.0, 3.0, 4.0);
120 }