# Problem in Using target += function

Hi everyone,

I am trying to predict the failure probability as a part of structural reliability analysis. I want to use bayesian concept to predict the failure probability thus considering the joint distribution of influence paremeters directly in the failure surface. I tried first to use a very simple example with hypothetical values to see if the concept works or not then I devlope the original concept. This is my problem:

simple there is a failure surface G = x - y[i] while x is an uncertain parameter and y is the observation. I want to estimate the probability the G<0. I used target function in stan to tranfoming the G values to an increment log sacle and then in generate quantities tried to predic the posterior of G<0. one i use hypothetic data, surpring i see that always for all cases the values are G<0 no matter what value i use!! here is my simple code:

``````data {
int<lower=0> N;       // Number of inputs
vector[N] y;          // Inputs for y
}

parameters {
real x;               // Parameter a
}

model {
// Prior distribution for parameters a and b

x ~ normal(0.5, 0.1); // Specify prior distribution for b

for (i in 1:N) {
real G = x - y[i];
target += if_else(G < 0, 0, negative_infinity()); // Increment the log density when G < 0
}
}

generated quantities {
int<lower=0, upper=1> G_less_than_zero[N];  // Indicator variable for G < 0

// Compute indicator variable
for (i in 1:N) {
real G = x - y[i];
G_less_than_zero[i] = (G < 0) ? 1 : 0;
}
}
``````

i used these values to test the code:

``````N <- 100
y <- rnorm(N, mean = 0.4, sd = 0.1)

# Fit the Stan model to the data
fit <- sampling(stan_model, data = list(N = N, y = y))

# Extract the posterior samples for G_less_than_zero and G
G_less_than_zero_samples <- extract(fit)\$G_less_than_zero
G_samples <- extract(fit)\$G

# Compute the posterior probability that G < 0
posterior_prob_G_less_than_zero <- mean(G_less_than_zero_samples)

# Plot the posterior distribution for G < 0
hist(G_less_than_zero_samples, main = "Posterior Distribution for G < 0", xlab = "G < 0")

# Plot the posterior distribution for G
hist(G_samples, main = "Posterior Distribution for G", xlab = "G")
``````

I will be thankful if you kindly advice me if I am doing wrong in using target function and have your valubale advice to solve the issue.

I’m not sure what you’re trying to do, but this:

``````target += if_else(G < 0, 0, negative_infinity());
``````

is going to cause the sampler to reject the current proposal if `G < 0`. Maybe you want to just impose a penalty? Or not constrain at all and just count in generated quantities?

P.S. The more idiomatic way to code the target increment is

``````target += G < 0 ? 0 : negative_infinity();
``````

or

``````if (G < 0)
target += negative_infinity();
``````

P.P.S. Rather than this,

``````  real x;               // Parameter a
``````

I’d suggest just naming the parameter `a`.

``````  real a;
``````