How to get around using a for loop?

Here is a simplification of the current model I am using:

``````   with pm.Model() as mymodel:
precision = pm.Bound(pm.Gamma, lower=.609, upper=33.33)('precision',alpha=Cshape,beta=Crate,shape=nsubj)
mushift = pm.Bound(pm.Normal, lower=-0.2618, upper=0.2618)('mushift',mu=Cshift,sd=Ctau,shape=nsubj)
y = pm.VonMises('y', mu=mushift, kappa=precision, observed=x)
``````

I have a vector, x, of length 14,000, and a vector, m, also of length 14,000. I want to use x as the “observed” input for “y”, and I want to add “m” to “mushift” for each observation of “x”. In other words, for observation x[0] I want mu=mushift+m[0], and for observation x[1] I want mu=mushift+m[1], and so on.

How could I accomplish such a thing without resorting to using a for loop? Thanks greatly for your time, I have been going in circles for a long time trying to find a solution.

Might be easier to do

``````x_shift = x - m
x_shift = x/np.linalg.norm(x)
y = pm.VonMises('y', mu=mushift, kappa=precision, observed=x_shift)
``````

I think maybe if you set `shape=(nsubj,1)` for `m` and `mushift` then you can use `mu=mushift+m` in the VonMises arguments (an easy test is to check that `observed=x[1:]` fails).

1 Like

You’re a genius! I didn’t think about changing the observed variable.