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, protocol=pickle.HIGHEST_PROTOCOL)
# 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.
If you are saving a large amount of data with pickle.dump
, be sure to use
the highest protocol version available. Earlier versions are limited in the
amount of data they can save in a single file.