|
1 | | -import unittest |
2 | | -from nose import SkipTest |
3 | 1 | import numpy as np |
4 | | -import sys |
5 | | -try: |
6 | | - import statsmodels.api as sm |
7 | | -except ImportError: |
8 | | - raise SkipTest("Test requires statsmodels.") |
9 | 2 |
|
10 | | -from pymc3.examples import glm_linear, glm_robust |
| 3 | +from .helpers import SeededTest |
| 4 | +from pymc3 import glm, Model, Uniform, Normal, find_MAP, Slice, sample |
11 | 5 |
|
12 | 6 |
|
13 | | -np.random.seed(1) |
14 | 7 | # Generate data |
15 | | -true_intercept = 0 |
16 | | -true_slope = 3 |
17 | | - |
18 | | - |
19 | | -def generate_data(size=700): |
| 8 | +def generate_data(intercept, slope, size=700): |
20 | 9 | x = np.linspace(-1, 1, size) |
21 | | - y = true_intercept + x * true_slope |
| 10 | + y = intercept + x * slope |
22 | 11 | return x, y |
23 | 12 |
|
24 | | -true_sd = .05 |
25 | | -x_linear, y_linear = generate_data(size=1000) |
26 | | -y_linear += np.random.normal(size=1000, scale=true_sd) |
27 | | -data_linear = dict(x=x_linear, y=y_linear) |
28 | 13 |
|
29 | | -x_logistic, y_logistic = generate_data(size=3000) |
30 | | -y_logistic = 1 / (1 + np.exp(-y_logistic)) |
31 | | -bern_trials = [np.random.binomial(1, i) for i in y_logistic] |
32 | | -data_logistic = dict(x=x_logistic, y=bern_trials) |
| 14 | +class TestGLM(SeededTest): |
| 15 | + @classmethod |
| 16 | + def setUpClass(cls): |
| 17 | + super(TestGLM, cls).setUpClass() |
| 18 | + cls.intercept = 1 |
| 19 | + cls.slope = 3 |
| 20 | + cls.sd = .05 |
| 21 | + x_linear, cls.y_linear = generate_data(cls.intercept, cls.slope, size=1000) |
| 22 | + cls.y_linear += np.random.normal(size=1000, scale=cls.sd) |
| 23 | + cls.data_linear = dict(x=x_linear, y=cls.y_linear) |
33 | 24 |
|
| 25 | + x_logistic, y_logistic = generate_data(cls.intercept, cls.slope, size=3000) |
| 26 | + y_logistic = 1 / (1 + np.exp(-y_logistic)) |
| 27 | + bern_trials = [np.random.binomial(1, i) for i in y_logistic] |
| 28 | + cls.data_logistic = dict(x=x_logistic, y=bern_trials) |
34 | 29 |
|
35 | | -class TestGLM(unittest.TestCase): |
36 | | - |
37 | | - @unittest.skip("Fails only on travis. Investigate") |
38 | 30 | def test_linear_component(self): |
39 | 31 | with Model() as model: |
40 | | - y_est, coeffs = glm.linear_component('y ~ x', data_linear) |
41 | | - for coeff, true_val in zip(coeffs, [true_intercept, true_slope]): |
42 | | - self.assertAlmostEqual(coeff.tag.test_value, true_val, 1) |
| 32 | + y_est, _ = glm.linear_component('y ~ x', self.data_linear) |
43 | 33 | sigma = Uniform('sigma', 0, 20) |
44 | | - y_obs = Normal('y_obs', mu=y_est, sd=sigma, observed=y_linear) |
| 34 | + Normal('y_obs', mu=y_est, sd=sigma, observed=self.y_linear) |
45 | 35 | start = find_MAP(vars=[sigma]) |
46 | 36 | step = Slice(model.vars) |
47 | | - trace = sample(2000, step, start, progressbar=False) |
| 37 | + trace = sample(500, step, start, progressbar=False, random_seed=self.random_seed) |
48 | 38 |
|
49 | | - self.assertAlmostEqual( |
50 | | - np.mean(trace['Intercept']), true_intercept, 1) |
51 | | - self.assertAlmostEqual(np.mean(trace['x']), true_slope, 1) |
52 | | - self.assertAlmostEqual(np.mean(trace['sigma']), true_sd, 1) |
| 39 | + self.assertAlmostEqual(np.mean(trace['Intercept']), self.intercept, 1) |
| 40 | + self.assertAlmostEqual(np.mean(trace['x']), self.slope, 1) |
| 41 | + self.assertAlmostEqual(np.mean(trace['sigma']), self.sd, 1) |
53 | 42 |
|
54 | | - @unittest.skip("Fails only on travis. Investigate") |
55 | 43 | def test_glm(self): |
56 | 44 | with Model() as model: |
57 | | - vars = glm.glm('y ~ x', data_linear) |
58 | | - for coeff, true_val in zip(vars[1:], [true_intercept, true_slope, true_sd]): |
59 | | - self.assertAlmostEqual(coeff.tag.test_value, true_val, 1) |
| 45 | + glm.glm('y ~ x', self.data_linear) |
60 | 46 | step = Slice(model.vars) |
61 | | - trace = sample(2000, step, progressbar=False) |
| 47 | + trace = sample(500, step, progressbar=False, random_seed=self.random_seed) |
62 | 48 |
|
63 | | - self.assertAlmostEqual( |
64 | | - np.mean(trace['Intercept']), true_intercept, 1) |
65 | | - self.assertAlmostEqual(np.mean(trace['x']), true_slope, 1) |
66 | | - self.assertAlmostEqual(np.mean(trace['sigma']), true_sd, 1) |
| 49 | + self.assertAlmostEqual(np.mean(trace['Intercept']), self.intercept, 1) |
| 50 | + self.assertAlmostEqual(np.mean(trace['x']), self.slope, 1) |
| 51 | + self.assertAlmostEqual(np.mean(trace['sd']), self.sd, 1) |
67 | 52 |
|
68 | | - @unittest.skip("Was an error, then a fail, now a skip.") |
69 | 53 | def test_glm_link_func(self): |
70 | 54 | with Model() as model: |
71 | | - vars = glm.glm('y ~ x', data_logistic, |
72 | | - family=glm.families.Binomial(link=glm.families.logit)) |
73 | | - |
74 | | - for coeff, true_val in zip(vars[1:], [true_intercept, true_slope]): |
75 | | - self.assertAlmostEqual(coeff.tag.test_value, true_val, 0) |
| 55 | + glm.glm('y ~ x', self.data_logistic, |
| 56 | + family=glm.families.Binomial(link=glm.families.logit)) |
76 | 57 | step = Slice(model.vars) |
77 | | - trace = sample(2000, step, progressbar=False) |
| 58 | + trace = sample(1000, step, progressbar=False, random_seed=self.random_seed) |
78 | 59 |
|
79 | | - self.assertAlmostEqual( |
80 | | - np.mean(trace['Intercept']), true_intercept, 1) |
81 | | - self.assertAlmostEqual(np.mean(trace['x']), true_slope, 0) |
| 60 | + self.assertAlmostEqual(np.mean(trace['Intercept']), self.intercept, 1) |
| 61 | + self.assertAlmostEqual(np.mean(trace['x']), self.slope, 1) |
0 commit comments