def test_mean_variance(self): g = Gamma.from_mean_variance(2.0, 3.0) self.assertEqual(g.mean(), 2.0) self.assertEqual(g.variance(), 3.0) g = Gamma.from_mean_variance(2.0123, 3.01283) self.assertEqual(g.mean(), 2.0123) self.assertEqual(g.variance(), 3.01283)
def test_inverse_cdf(self): g = Gamma.from_mean_variance(2.34, 4) self.assertAlmostEqual(3.9, g.inverse_cdf(g.cdf(3.9))) self.assertAlmostEqual(1.92, g.inverse_cdf(g.cdf(1.92))) g = Gamma.from_mean_variance(10.34, 2) self.assertAlmostEqual(3.9, g.inverse_cdf(g.cdf(3.9))) self.assertAlmostEqual(10.92, g.inverse_cdf(g.cdf(10.92))) g = Gamma.from_mean_variance(10.34, 2) self.assertAlmostEqual(0.975, g.cdf(g.inverse_cdf(0.975))) self.assertAlmostEqual(0.025, g.cdf(g.inverse_cdf(0.025))) g = Gamma.from_mean_variance(1.34, 4) self.assertAlmostEqual(0.975, g.cdf(g.inverse_cdf(0.975))) self.assertAlmostEqual(0.025, g.cdf(g.inverse_cdf(0.025)))
def test_sample(self): m = 10.0 v = 2.0 g = Gamma.from_mean_variance(m, v) # print(g.alpha, g.beta) S = 1000 total = 0.0 for s in range(S): total += g.sample() mean = total / S # The estimated mean will differ from true mean by a small amount error = 4.0 * sqrt(g.variance() / S) # print(mean, m, error) self.assertTrue(abs(mean - m) < error)
def test_cdf(self): m = 3.0 v = 2.0 g = Gamma.from_mean_variance(m, v) # Numerical integration S = 1000 M = 10.0 total_p = 0.0 epsilon = 1e-4 last = 0.0 for s in range(S): x = s * M / S p = g.pdf(x) * M / S total_p += (last - p) / 2.0 last = p # print(x, total_p, g.cdf(x)) self.assertTrue((total_p - g.cdf(x)) < epsilon)
def test_pdf(self): m = 3.0 v = 2.0 g = Gamma.from_mean_variance(m, v) upper = 30.0 norm = integrate(g.pdf, 0, upper) self.assertAlmostEqual(norm, 1.0) def fx(x): return x * g.pdf(x) mean = integrate(fx, 0, upper) self.assertAlmostEqual(mean, m) def fx2(x): return x * x * g.pdf(x) x2 = integrate(fx2, 0, upper) var = x2 - mean**2 self.assertAlmostEqual(var, v)