# Welcome to binney’s documentation!¶

`binney`

is a package for doing binomial regression
(including logistic regression) with b-splines! See below
for installation instructions.

## Installation¶

You can install `binney`

with `pip`

:

```
pip install binney
```

You will also need to install `ipopt`

, which is an interior
point optimizer, with conda.

```
conda install -c conda-forge cyipopt
```

You can check to see if your installation worked correctly with `pytest`

.

```
# pip install pytest
cd binney
pytest
```

## Documentation¶

For instructions on how to use `binney`

, see the API reference
for `binney.run.run.BinneyRun`

.

## Quick Start¶

Here is a quick introduction to simulate data
and do a `BinneyRun`

. Please refer to
`binney.run.run.BinneyRun`

for documentation on
its arguments and methods.
We will simulate 500 observations from

where \(p(x) = \frac{e^{sin(x)}}{1 + e^{sin(x)}}\). First, let’s create the data frame representing this simulation.

```
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from binney.run.run import BinneyRun
np.random.seed(0)
n = 500
x = np.random.uniform(low=0, high=np.pi, size=n)
p = np.exp(np.sin(x)) / (1 + np.exp(np.sin(x)))
df = pd.DataFrame({
'success': np.random.binomial(n=100, size=len(p), p=p),
'total': np.repeat(100, repeats=len(p)),
'p': p,
'x': x
})
df.sort_values('x', inplace=True)
df['p_hat'] = df['success'] / df['total']
```

Now, we can create the specifications for a binomial regression
model with `binney`

. If you wanted to include a shape
constraint on the spline, you would do so in the `splines`

specifications below. See `binney.run.run.BinneyRun`

for more details on these specs and documentation
about all of the arguments to the function.

```
splines = {
'x': {
'degree': 3,
'knots_num': 4,
'knots_type': 'frequency',
}
}
b_run = BinneyRun(
col_success='success',
col_total='total',
df=df,
splines=splines,
solver_method='scipy',
data_type='binomial'
)
```

We can fit the model and create predictions from it.

```
b_run.fit()
predictions = b_run.predict()
```

(Source code, png, hires.png, pdf)

You can then create uncertainty as well by doing:

```
b_run.make_uncertainty(n_boots=50)
draws = b_run.predict_draws(df=df)
```