# Run Generated Quantities¶

The generated quantities block
computes *quantities of interest* (QOIs) based on the data,
transformed data, parameters, and transformed parameters.
It can be used to:

- generate simulated data for model testing by forward sampling
- generate predictions for new data
- calculate posterior event probabilities, including multiple comparisons, sign tests, etc.
- calculating posterior expectations
- transform parameters for reporting
- apply full Bayesian decision theory
- calculate log likelihoods, deviances, etc. for model comparison

The CmdStanModel class `generate_quantities`

method is useful once you
have successfully fit a model to your data and have a valid
sample from the posterior and a version of the original model
where the generated quantities block contains the necessary statements
to compute additional quantities of interest.

By running the `generate_quantities`

method on the new model with
a sample generated by the existing model, the sampler uses the
per-draw parameter estimates from the sample to compute the
generated quantities block of the new model.

The `generate_quantities`

method returns a `CmdStanGQ`

object
which provides properties to retrieve information about the sample:

`chains`

`column_names`

`generated_quantities`

`generated_quantities_pd`

`sample_plus_quantities`

`save_csvfiles()`

The `sample_plus_quantities`

combines the existing sample
and new quantities of interest into a pandas DataFrame object
which can be used for downstream analysis and visualization.
In this way you add more columns of information to an existing sample.

## Configuration¶

`mcmc_sample`

- either a`CmdStanMCMC`

object or a list of stan-csv files`data`

: Values for all data variables in the model, specified either as a dictionary with entries matching the data variables, or as the path of a data file in JSON or Rdump format.`seed`

: The seed for random number generator.`gq_output_dir`

: A path or file name which will be used as the basename for the CmdStan output files.

## Example: add posterior predictive checks to `bernoulli.stan`

¶

In this example we use the CmdStan example model
bernoulli.stan
and data file
bernoulli.data.json
as our existing model and data.
We create the program
bernoulli_ppc.stan
by adding a `generated quantities`

block to bernoulli.stan
which generates a new data vector `y_rep`

using the current estimate of theta.

```
generated quantities {
int y_sim[N];
real<lower=0,upper=1> theta_rep;
for (n in 1:N)
y_sim[n] = bernoulli_rng(theta);
theta_rep = sum(y) / N;
}
```

The first step is to fit model `bernoulli`

to the data:

```
import os
from cmdstanpy import CmdStanModel, cmdstan_path
bernoulli_dir = os.path.join(cmdstan_path(), 'examples', 'bernoulli')
bernoulli_path = os.path.join(bernoulli_dir, 'bernoulli.stan')
bernoulli_data = os.path.join(bernoulli_dir, 'bernoulli.data.json')
# instantiate, compile bernoulli model
bernoulli_model = CmdStanModel(stan_file=bernoulli_path)
# fit the model to the data
bern_fit = bernoulli_model.sample(data=bernoulli_data)
```

Then we compile the model `bernoulli_ppc`

and use the fit parameter estimates
to generate quantities of interest:

```
bernoulli_ppc_model = CmdStanModel(stan_file='bernoulli_ppc.stan')
bernoulli_ppc_model.compile()
new_quantities = bernoulli_ppc_model.generate_quantities(data=bern_data, mcmc_sample=bern_fit)
```

The `generate_quantities`

method returns a `CmdStanGQ`

object which
contains the values for all variables in the generated quantitites block
of the program `bernoulli_ppc.stan`

. Unlike the output from the
`sample`

method, it doesn’t contain any information on the joint log
probability density, sampler state, or parameters or transformed
parameter values.

```
new_quantities.column_names
new_quantities.generated_quantities.shape
for i in range(len(new_quantities.column_names)):
print(new_quantities.generated_quantities[:,i].mean())
```

The method `sample_plus_quantities`

returns a pandas DataFrame which
combines the input drawset with the generated quantities.

```
sample_plus = new_quantities.sample_plus_quantities
print(sample_plus.shape)
print(sample_plus.columns)
```