Differences between PyStan and RStan

While PyStan attempts to maintain API compatibility with RStan, there are certain unavoidable differences between Python and R.

Methods and attributes

Methods are invoked in different ways: fit.summary() and fit.extract() (Python) vs. summary(fit) and extract(fit) (R).

Attributes are accessed in a different manner as well: fit.sim (Python) vs. fit@sim (R).

Dictionaries instead of Lists

Where RStan uses lists, PyStan uses (ordered) dictionaries.

Python:

fit.extract()['theta']

R:

extract(fit)$theta

Reusing models and saving objects

PyStan uses pickle to save objects for future use.

Python:

import pickle
import pystan

# bernoulli model
model_code = """
    data {
      int<lower=0> N;
      int<lower=0,upper=1> y[N];
    }
    parameters {
      real<lower=0,upper=1> theta;
    }
    model {
      for (n in 1:N)
          y[n] ~ bernoulli(theta);
    }
    """
data = dict(N=10, y=[0, 1, 0, 0, 0, 0, 0, 0, 0, 1])
model = pystan.StanModel(model_code=model_code)
fit = model.sampling(data=data)

with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)

# load it at some future point

with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

# run with different data
fit = model.sampling(data=dict(N=5, y=[1, 1, 0, 1, 0]))

R:

library(rstan)

model = stan_model(model_code=model_code)
save(model, file='model.rdata')

See also Avoiding recompilation of Stan models.