Centering data using pm.Deterministic

y.mean().eval will compute the value and put it in the graph as a constant so wont be effected by future set_data. This little example helped clarify things for me…

import pymc as pm
import numpy as np
import pytensor

x = np.random.randn(5)
 
with pm.Model() as model:
    xdata = pm.Data("x_data",x)
    x_centered =  xdata - xdata.mean()

print("xdata - xdata.mean()")
pytensor.dprint(x_centered)

with pm.Model() as model:
    # Priors
    xdata = pm.Data("x_data",x)
    x_centered =  xdata - xdata.mean().eval()
    
print('-'*20)
print("xdata - xdata.mean().eval()")
pytensor.dprint(x_centered)

with model:
    pm.set_data({"x_data": np.zeros_like(x)})
print('-'*20)
print("After pm.set_data")
pytensor.dprint(x_centered)
4 Likes