Exemplo n.º 1
0
def test_ipopt(df, intercept, slope):
    true_params = [intercept, slope]
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      covariates=['x1'],
                      df=df,
                      solver_method='ipopt')
    b_run.fit()
    rel_error = (b_run.params_opt - true_params) / true_params
    assert all(rel_error < REL_TOL)
Exemplo n.º 2
0
def test_splines(spline_df):
    splines = {'x1': {'degree': 3, 'knots_num': 4, 'knots_type': 'frequency'}}
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      df=spline_df,
                      splines=splines,
                      solver_method='ipopt')
    b_run.fit()
    predictions = b_run.predict()
    np.testing.assert_array_almost_equal(x=predictions,
                                         y=spline_df['p'].values,
                                         decimal=1)
Exemplo n.º 3
0
def test_fractional_outcomes():
    p = np.repeat(np.exp(3) / (1 + np.exp(3)), repeats=1e3)
    np.random.seed(100)
    df = pd.DataFrame({
        'success': np.random.binomial(n=1, size=len(p), p=p),
        'total': np.repeat(1, repeats=len(p))
    })
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      df=df,
                      solver_method='scipy')
    b_run.fit()
    assert np.round(b_run.params_opt) == 3
Exemplo n.º 4
0
def test_scipy_opt(df, intercept, slope):
    true_params = [intercept, slope]
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      covariates=['x1'],
                      df=df,
                      solver_method='scipy',
                      solver_options={'maxiter': 500})
    b_run.fit()
    rel_error = (b_run.params_opt - true_params) / true_params
    assert all(rel_error < REL_TOL)
    assert b_run.solver.predict().shape == (len(df), )
    assert (0 <= b_run.solver.predict()).all()
    assert (1 >= b_run.solver.predict()).all()
Exemplo n.º 5
0
def test_unrecognized_solver(df):
    with pytest.raises(RunException):
        BinneyRun(col_success='success',
                  col_total='total',
                  covariates=['x1'],
                  df=df,
                  solver_method='my_random_solver')
Exemplo n.º 6
0
def test_bootstrap_run(df, n):
    np.random.seed(99)
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      covariates=['x1'],
                      df=df,
                      solver_method='ipopt',
                      data_type='binomial')
    b_run.fit()
    b_run.make_uncertainty(n_boots=15)
    assert np.vstack(b_run.bootstrap.parameters).shape == (15, 2)
    np.testing.assert_array_almost_equal(b_run.bootstrap.parameters[0],
                                         np.array([0.99940296, 1.99394325]))
    np.testing.assert_array_almost_equal(b_run.bootstrap.parameters[5],
                                         np.array([1.01366631, 1.99569274]))
    np.testing.assert_array_almost_equal(np.vstack(
        b_run.bootstrap.parameters).mean(axis=0),
                                         b_run.params_opt,
                                         decimal=1)
    uis = np.quantile(np.vstack(b_run.bootstrap.parameters),
                      q=[0.025, 0.975],
                      axis=0)
    assert all(b_run.params_opt > uis[0, :])
    assert all(b_run.params_opt < uis[1, :])
    draws = b_run.predict_draws(df=df)
    assert draws.shape == (15, n)
    assert all(draws.var(axis=1) > 0)
Exemplo n.º 7
0
def test_spline_constraints_fail(spline_concave_df):
    splines = {
        'x1': {
            'degree': 3,
            'knots_num': 4,
            'knots_type': 'frequency',
            'convex': True
        }
    }
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      df=spline_concave_df,
                      splines=splines,
                      solver_method='ipopt')
    b_run.fit()
    predictions = b_run.predict()
    with pytest.raises(AssertionError):
        np.testing.assert_array_almost_equal(x=predictions,
                                             y=spline_concave_df['p'].values,
                                             decimal=1)
Exemplo n.º 8
0
def test_hierarchy_run(group_data):
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      covariates=['x1'],
                      df=group_data,
                      solver_method='ipopt')
    b_run.fit()
    preds = b_run.predict(new_df=group_data)
    b_run_grp = BinneyRun(col_success='success',
                          col_total='total',
                          covariates=['x1'],
                          df=group_data,
                          solver_method='ipopt',
                          col_group='g',
                          coefficient_prior_var=5.)
    b_run_grp.fit()
    preds_grp = b_run_grp.predict(new_df=group_data)
    res = preds - group_data['p']
    res_grp = preds_grp - group_data['p']
    assert (np.abs(res) > np.abs(res_grp)).mean() >= 0.975
Exemplo n.º 9
0
def test_new_data(df, new_df):
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      covariates=['x1'],
                      df=df,
                      solver_method='ipopt')
    b_run.fit()
    predict_1 = b_run.predict()
    predict_2 = b_run.predict(new_df=new_df)

    assert predict_1.shape == predict_2.shape
    assert all(predict_1 != predict_2)
def test_hierarchical_bootstrap(n, group_data):
    np.random.seed(99)
    n_boots = 30
    b_run = BinneyRun(col_success='success',
                      col_total='total',
                      covariates=['x1'],
                      df=group_data,
                      col_group='g',
                      solver_method='scipy',
                      data_type='bernoulli')
    b_run.fit()
    b_run.make_uncertainty(n_boots=n_boots)
    assert len(b_run.bootstrap.parameters) == n_boots
    for param in b_run.bootstrap.parameters:
        assert isinstance(param, Dict)
        for group, item in param.items():
            assert len(param[group]) == 2
    draws = b_run.predict_draws(df=group_data)
    assert draws.shape == (n_boots, n)
    assert all(draws.var(axis=1) > 0)
    assert (group_data['p'].values > np.quantile(draws, q=0.025, axis=0)).all()
    assert (group_data['p'].values < np.quantile(draws, q=0.975, axis=0)).all()
Exemplo n.º 11
0
def test_hierarchy_spline(group_data_2):
    b_run_grp = BinneyRun(col_success='success',
                          col_total='total',
                          splines={
                              'x1': {
                                  'degree': 3,
                                  'knots_type': 'frequency',
                                  'knots_num': 3
                              },
                              'x2': {
                                  'degree': 3,
                                  'knots_type': 'frequency',
                                  'knots_num': 3
                              }
                          },
                          df=group_data_2,
                          solver_method='ipopt',
                          col_group='g',
                          coefficient_prior_var=5.)
    b_run_grp.fit()
    b_run_grp.predict(group_data_2)