# Can (Should) I center the observations of an exponential distribution?

Let’s think of a simple exponential model (which works well and fast)

data {
int <lower = 0> N;     // number of observations
int <lower = 0> K;     // number of parameters
row_vector[K] X[N];
real y[N];
}

parameters {
vector[K] beta;
}

model {
beta ~ normal(0, 1);
for(t in 1:N)
y[t] ~ exponential(exp(X[t]*beta));
}

My model is actually more complicated and the chains don’t mix. I am trying to reparameterize the model using the fact that if X \sim Exp(\lambda) then X \times \lambda \sim Exp(1)

data {
int <lower = 0> N;     // number of observations
int <lower = 0> K;     // number of parameters
row_vector[K] X[N];
real y[N];
}

parameters {
vector[K] beta;
}

transformed parameters{
real y_std [N];
for(t in 1:N)
y_std[t] = y[t]* exp(X[t]*beta);
}

model {
beta ~ normal(0, 1);
for(t in 1:N)
y_std[t] ~ exponential(1);
}

But this second model is not right (does not recover the parameters in synthetic data). Does anyone know why? Thanks!

Edit: see code in response below

1 Like

I think the reparametrization introduces a change of variables and you’ll need the Jacobian adjustment.

4 Likes

Thanks, that was it. The following model code produces posterior parameters distributions that match the first code (and the truth). It is is 50% slower for this simple example.

model {
real y_std [N];
for(t in 1:N)
y_std[t] = y[t]* exp(X[t]*beta);
beta ~ normal(0, 1);
for(t in 1:N){
y_std[t] ~ exponential(1);
target += X[t]*beta;
}
}

So that was it. Thanks.

4 Likes

Happy to help! You should mark your own answer as the solution. It has the code. I merely gave a hint.

2 Likes

Thanks. I did now.