Пример #1
0
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
Пример #2
0
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})
Пример #3
0
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
Пример #4
0
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
Пример #6
0
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)
Пример #7
0
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