How to do: X~N(0,1) w.p. P and X=0 w.p. 1-P

  • Owen

    Hello all,

    I'm struggling to construct a certain distribution within JAGS:

    with probability P, X ~ N( mu, tau )

    with probability 1-P, X = 0

    X can constructed be with a normal random variable and a bernoulli random
    variable feeding a logical node.

    However, I need the result to be a stochastic node.

    I suppose this distribution is a degenerate case of a two component normal
    mixture, with one component having zero variance. But I hesitate to push any
    software into such a corner case.

    I wonder if there is a better approach?

    Thanks for any suggestions.

    Kind regards,


    keywords: mixture, switching

  • Martyn Plummer
    Martyn Plummer

    Well it's a degenerate case. Since the normal distribution is continuous, the
    even X=0 has probability 0. So you know whether you are in the first case or
    the second case depending on whether X==0.

    Can create an indicator variable R st

    R = 1 if X!=0
    R = 0 if X==0

    Then set X to missing (NA) if R==0. Your model is

    R ~ dcat(P)
    X ~ dnorm(mu, tau)

    and that's it.

  • Owen


    Thank you for your suggestion. I think I may not have presented the problem

    If we can solve the problem I first asked (Problem 1), then together with
    dsum(), I can solve Problem 2 described later.

    Restating Problem 1:

    Suppose P = 0.4.

    I would like to construct a stochastic node with a mass a of 0.4 at x=0 and
    the density N(0,1) (scaled by 0.6) for other X values.

    Building on your model, I could have

    R ~ dcat(P)
    X ~ dnorm(mu,tau)
    Y <- equals(R,1)*X + equals(R,0)*0

    So if R is one, then Y is normal, else Y is zero. And Y has the required
    distribution, but it is not a stochastic node.

    Problem 2:

    Let me back up and describe the real problem:

    mu[1] <- 75
    mu[2] <- 65
    tau[1] <- 1/25
    tau[2] <- 1
    R ~ dcat(P)
    index <- 1+R  # index of the Normal distribution chosen by R
    X ~ dnorm( mu[index], tau[index] )

    I have not yet tried this in JAGS, but OpenBUGS disallows the last line of the
    model, and I assume it is also a problem in JAGS. Although X looks like a
    mixture distribution, it is slightly more because the mode variable R is
    exposed, so I can incorporate it into the model in other ways. For example, in
    place of R~dcat(P), R could be the state of a Markov chain.

    Another formulation is to always generate both Normals and then select between

    Z[1] ~ dnorm( mu[1], tau[1] )
    Z[2] ~ dnorm( mu[2], tau[2] )
    R ~ dcat(P)
    X <- equals(R,1)*Z[1] + equals(R,0)*Z[2]

    Again X is not a stochastic node, but it could be made into a stochastic node
    using dsum().

    But only if the quantity "equals(R,1)*Z" could be constructed as a stochastic
    node (and that is Problem 1).

    Thanks and Regards,


  • Owen


    I found a solution for Problem 2 (which is what I really need), but not a
    solution for problem one.

    The OpenBUGS example _Eyes _ gives a proper formulation of how to randomly
    switch the input parameters of a distribution.

    Thanks again Martyn for your time.