I’m fitting a model, which contains several 2d vectors having the same direction. Currently, I use the very intuitive way to parametrize them:
angle = pm.VonMises(...)
direction = tt.stack(tt.cos(angle), tt.sin(angle))
coeffs = pm.Normal(..., shape=nvec)
vectors = direction * coeffs
this kinda works and leads to a reasonable posterior, but obviously suffers from nonidentifyability: replacing angle
with angle + 180º
and coeffs
with -coeffs
doesn’t affect vectors
. I couldn’t think of any way to fix it: taking angle
as being defined on -90º...90º
leads to a discontinuity (taking angle = arctan(x)
also does); constraining coeffs > 0
in my case doesn’t work because they may have different signs;
What can be done in this case?
1 Like
But how does it help with the angle
- angle + 180
ambiguity? If I parametrize the direction vector as a pair of its cartesian coordinates (a, b)
then it adds yet another ambiguity - (a, b)
with coeffs
and (a / c, b / c)
with c * coeffs
.
Actually, i think you should model the amplitude as always positive. So that direction
becomes a unit vector on the unit circle, and you just scale it with a positive coefficient.
Well, and what if I need some vectors
to be in different (opposite) directions to each other? Like vectors[0] = 1 * direction
and vectors[1] = -1 * direction
.
Hmm, in that case, maybe it would make sense to have model direction between (-\pi/2, \pi/2), Something like:
angle = pm.VonMises(...)
direction = tt.stack(tt.cos(angle/2), tt.sin(angle/2))
coeffs = pm.Normal(..., shape=nvec)
vectors = direction * coeffs
So that angle is still continous between -90º and 90º
Yes, I thought about it and mentioned in the first post. A problem here is that when the angle changes from \pi/2 to -\pi/2 there is a discontinuity: direction
vector changes sign, so all coeffs
also have to.
Oh I see what you meant now in the original post now. So basically you are modelling a set of vectors that have the same mirror angle.
Do you have a notebook with data on this?
Currently, I have a more complex model including these vectors as a part (as they are not directly observed), but will try to make a small example. I just thought that some advice may be possible without too much detail on the exact model :)
More informative prior for theta (angle) should help, but then more details about your model is needed to know what is a good prior.