Defining log likelihood in transformed parameters

Hi,

Recently I am writing an Stan code which involves defining the log likelihood of some data which would be used later in the ‘model’ trunk.

First I tried:

transformed parameters{
vector[N] log_lik;
for (i in 1:N){
log_lik[i] += normal_lpdf(y|mu, sigma);
  }
}

But the model returns error like ‘Chain 1: Rejecting initial value:
Chain 1: Log probability evaluates to log(0), i.e. negative infinity.
Chain 1: Stan can’t start sampling from this initial value.’

But when I modified the code as:

transformed parameters{
vector[N] log_lik = rep_vector(0,N);
for (i in 1:N){
log_lik[i] += normal_lpdf(y|mu, sigma);
  }
}

The model could run without any error. May I ask that why this would happen?

Thx!

In the first block, you didn’t initialise log_lik to any value, and so Stan initialises it to NaN by default. Then when you add to it (+=) it doesn’t return a valid number.

In the second block you initialise log_lik to zeros, so the addition returns valid numbers.

The first block would have worked if you had used assignment (i.e., =) instead of addition:

transformed parameters{
vector[N] log_lik;
for (i in 1:N){
log_lik[i] = normal_lpdf(y | mu, sigma);
  }
}

Also, be aware that this loop you’re using is just assigning the exact same value to each element of log_lik, in case that’s not what you want

4 Likes

Thanks so much!

I used to think add a number to NaN by += would return that number but thanks so much for the clarification!

1 Like