def test_update_term_priors_after_init(diabetes_data): model = Model(diabetes_data) model.add('BMI') model.add('S1') model.add(random='age_grp|BP') p1 = Prior('Normal', mu=-10, sd=10) p2 = Prior('Beta', alpha=2, beta=2) model.set_priors({'BMI': 0.3, 'S1': p2}) assert model.terms['S1'].prior.args['beta'] == 2 assert model.terms['BMI'].prior == 0.3 model.set_priors({('S1', 'BMI'): p1}) assert model.terms['S1'].prior.args['sd'] == 10 assert model.terms['BMI'].prior.args['mu'] == -10 p3 = Prior('Normal', mu=0, sd=Prior('Normal', mu=0, sd=7)) model.set_priors(fixed=0.4, random=p3) assert model.terms['BMI'].prior == 0.4 assert model.terms['age_grp|BP'].prior.args['sd'].args['sd'] == 7 # Invalid names should raise error with pytest.raises(ValueError): model.set_priors({'nonexistent_term': 0.3}) # Test for partial names, e.g., 'threecats' should match 'threecats[0]'. model = Model(diabetes_data) model.add(random='age_grp|BP', categorical='age_grp') model.set_priors({'age_grp|BP': 0.5}) assert model.terms['age_grp[T.1]|BP'].prior == 0.5 assert model.terms['1|BP'].prior == 0.5
def test_set_prior_unexisting_term(): data = pd.DataFrame( { "y": np.random.normal(size=100), "x": np.random.normal(size=100), } ) prior = Prior("Uniform", lower=0, upper=50) model = Model("y ~ x", data) with pytest.raises(ValueError): model.set_priors(priors={("x", "z"): prior})
def test_set_prior_with_tuple(): data = pd.DataFrame( { "y": np.random.normal(size=100), "x": np.random.normal(size=100), "z": np.random.normal(size=100), } ) prior = Prior("Uniform", lower=0, upper=50) model = Model("y ~ x + z", data) model.set_priors(priors={("x", "z"): prior}) assert model.terms["x"].prior == prior assert model.terms["z"].prior == prior
def test_set_priors(): data = pd.DataFrame( { "y": np.random.normal(size=100), "x": np.random.normal(size=100), "g": np.random.choice(["A", "B"], size=100), } ) model = Model("y ~ x + (1|g)", data) prior = Prior("Uniform", lower=0, upper=50) # Common model.set_priors(common=prior) assert model.terms["Intercept"].prior == prior assert model.terms["x"].prior == prior # Group-specific model.set_priors(group_specific=prior) assert model.terms["1|g"].prior == prior # By name model = Model("y ~ x + (1|g)", data) model.set_priors(priors={"x": prior}) model.set_priors(priors={"1|g": prior}) assert model.terms["x"].prior == prior assert model.terms["1|g"].prior == prior
def test_update_term_priors_after_init(diabetes_data): model = Model(diabetes_data) model.add("Y ~ BMI") model.add("S1") model.add(random="age_grp|BP") p1 = Prior("Normal", mu=-10, sigma=10) p2 = Prior("Beta", alpha=2, beta=2) model.set_priors({"BMI": 0.3, "S1": p2}) model.build(backend="pymc") assert model.terms["S1"].prior.args["beta"] == 2 assert model.terms["BMI"].prior.scale == 0.3 assert np.isclose(model.terms["BMI"].prior.args["sigma"], 4.7, rtol=0.1)[0] model.set_priors({("S1", "BMI"): p1}) model.build(backend="pymc") assert model.terms["S1"].prior.args["sigma"] == 10 assert model.terms["BMI"].prior.args["mu"] == -10 p3 = Prior("Normal", mu=0, sigma=Prior("Normal", mu=0, sigma=7)) model.set_priors(fixed=0.3, random=p3) model.build(backend="pymc") assert model.terms["BMI"].prior.scale == 0.3 assert np.isclose(model.terms["BMI"].prior.args["sigma"], 4.7, rtol=0.1)[0] assert model.terms["age_grp|BP"].prior.args["sigma"].args["sigma"] == 7 # Invalid names should raise error with pytest.raises(ValueError): model.set_priors({"nonexistent_term": 0.3}) model.build(backend="pymc") # Test for partial names, e.g., 'threecats' should match 'threecats[0]'. model = Model(diabetes_data) model.add("Y ~ 1", random="age_grp|BP", categorical="age_grp") model.set_priors({"age_grp|BP": 0.5}) model.build(backend="pymc") assert model.terms["age_grp[T.1]|BP"].prior.scale == 0.5 assert np.isclose( model.terms["age_grp[T.1]|BP"].prior.args["sigma"].args["sigma"], 94, rtol=0.2 ) assert model.terms["1|BP"].prior.scale == 0.5
def test_set_response_prior(): data = pd.DataFrame({ "y": np.random.randint(3, 10, size=50), "x": np.random.normal(size=50) }) priors = {"sigma": Prior("Uniform", lower=0, upper=50)} model = Model("y ~ x", data) model.set_priors(priors) assert model.response.prior.args["sigma"] == Prior("Uniform", lower=0, upper=50) priors = {"alpha": Prior("Uniform", lower=1, upper=20)} model = Model("y ~ x", data, family="negativebinomial") model.set_priors(priors) assert model.response.prior.args["alpha"] == Prior("Uniform", lower=1, upper=20) priors = {"alpha": Prior("Uniform", lower=0, upper=50)} model = Model("y ~ x", data, family="gamma") model.set_priors(priors) assert model.response.prior.args["alpha"] == Prior("Uniform", lower=0, upper=50)
def test_update_term_priors_after_init(diabetes_data): model = Model(diabetes_data) model.add_term('BMI') model.add_term('S1') model.add_term('age_grp', random=True, over='BP') p1 = Prior('Normal', mu=-10, sd=10) p2 = Prior('Beta', alpha=2, beta=2) model.set_priors({'BMI': 0.3, 'S1': p2}) assert model.terms['S1'].prior.args['beta'] == 2 assert model.terms['BMI'].prior == 0.3 model.set_priors({('S1', 'BMI'): p1}) assert model.terms['S1'].prior.args['sd'] == 10 assert model.terms['BMI'].prior.args['mu'] == -10 p3 = Prior('Normal', mu=0, sd=Prior('Normal', mu=0, sd=7)) model.set_priors(fixed=0.4, random=p3) assert model.terms['BMI'].prior == 0.4 assert model.terms['age_grp|BP'].prior.args['sd'].args['sd'] == 7