I’m expressing a model as

\text{treatment} = \text{baseline} + \text{delta}

where \text{baseline} \sim \text{TruncatedNormal(5, 10, low=0)} and \text{delta} \sim N(0, 10)

and treatment = numpyro.deterministic(“treatment”, baseline + delta)

I know for a fact that both baseline and treatment are positive. I have enforced constraint on baseline by using a TruncatedNormal, but how do I make sure that the posterior samples of treatment only contains positive samples?

i don’t think there’s any particularly easy way of doing so.

you can either revisit your priors on `baseline`

and `delta`

and ensure their sum is always positive by definition of the priors or you can put a soft constraint on treatment with a factor statement, e.g.

```
penalty = penalty_strength * (jnp.fabs(treatment) - treatment)
numpyro.factor("soft_constraint", -penalty)
```

but note this not a hard constraint so `treatment`

may still be (slightly) negative depending on the strength of the penalty

2 Likes

Hi @martinjankowiak. Thank you, this helped. Could you please tell me where this penalty is getting added?

`factor`

is added directly to the log density of the model.