How do I best simulate an arbitrary univariate random variate using its probability function?

后端 未结 4 487
温柔的废话
温柔的废话 2020-12-02 17:54

In R, what\'s the best way to simulate an arbitrary univariate random variate if only its probability density function is available?

4条回答
  •  囚心锁ツ
    2020-12-02 18:20

    This is a comment but I don't have enough reputation to drop a comment to Ben Bolker's answer.

    I am new to Metropolis, but IMHO this code is wrong because:

    a) the newval is drawn from a normal distribution whereas in other codes it is drawn from a uniform distribution; this value must be drawn from the range covered by the random number. For example, for a gaussian distribution this should be something like runif(1, -5, +5).

    b) the prob value must be updated only if acceptance.

    Hope this help and hope that someone with reputation could correct this answer (especially mine if I am wrong).

    # the distribution 
    ddist <- dnorm
    # number of random number
    n <- 100000
    # the center of the range is taken as init
    init <- 0
    # the following should go into a function
    vals <- numeric(n)
    vals[1] <- init 
    oldprob <- 0
    for (i in 2:n) {
      newval <- runif(1, -5, +5)
      newprob <- ddist(newval)
      if (runif(1) < newprob/oldprob) {
        vals[i] <- newval
        oldprob <- newprob
      } else vals[i] <- vals[i-1]
    }
    # Final view
    hist(vals, breaks = 100)
    # and comparison
    hist(rnorm(length(vals)), breaks = 100)
    

提交回复
热议问题