R 生成给定概率分布的随机样本

R 生成给定概率分布的随机样本,r,random,statistics,probability,R,Random,Statistics,Probability,我有一个随机变量X,pdf fx=4xe^-X,其中X>0 如何从这个分布中随机抽取一个大小为1000的样本?这是一个shape=a=2,scale=1的样本 q <- rgamma(1000, shape = 2, scale = 1) 一个简单的解决办法是,看看我的评论。一般的拒绝采样算法很容易在R中实现,如果它没有在几个包中实现,我会感到惊讶,我只是没有查找哪些包会有这样的功能: #' Rejection sampling #' #' @param f A function ca

我有一个随机变量X,pdf fx=4xe^-X,其中X>0

如何从这个分布中随机抽取一个大小为1000的样本?

这是一个shape=a=2,scale=1的样本

q <- rgamma(1000, shape = 2, scale = 1)
一个简单的解决办法是,看看我的评论。一般的拒绝采样算法很容易在R中实现,如果它没有在几个包中实现,我会感到惊讶,我只是没有查找哪些包会有这样的功能:

#' Rejection sampling
#' 
#' @param f A function calculating the density of interest
#' @param g A function giving the proposal density
#' @param rg A function providing random samples from g
#' @param M A numeric vector of length one giving a bound on the the ratio
#'   f(x) / g(x). M must be > 1 and greater than or equal to f(x) / g(x) over
#'   the whole support of X.
#' @param n An integer vector of length one giving the number of samples to
#'   draw; the default is ten thousand.
#' @param ... Further arguments to be passed to g and rg
rejection_sampling <- function(f, g, rg, M, n = 10000, ...) {
    result <- numeric(n)
    for ( i in 1:n ) {
        reject <- TRUE
        while ( reject ) {
            y <- rg(n = 1, ...)
            u <- runif(1)
            if ( u < ( f(y) / (M * g(y, ...)) ) ) {
                result[i] <- y
                reject <- FALSE
            }
        }
    }
    return(result)
}
然后,我们可以使用它从您的分布中获得一个样本,并绘制样本的密度和真实概率密度,以查看其工作情况:

x <- seq(0.01, 15, 0.01)
f <- function(x) 4 * x * exp(-x)
y <- f(x)
set.seed(123)
z <- rejection_sampling(f = f, g = dexp, rg = rexp, M = 10, n = 1e3, rate = 1/4)
dens <- density(z, from = 0.01, to = 15)
scaling_constant <- max(y) / max(dens$y)
plot(x, y, type = "l", xlab = "x", ylab = "f(x)", lty = 2, col = "blue")
lines(dens$x, dens$y * scaling_constant, col = "red", lty = 3)
legend("topright", bty = "n", lty = 2:3, col = c("blue", "red"),
       legend = c("True f(x)", "(Re-scaled) density of sample"))
拒绝抽样的工作方式是从标书分发中抽取样本,如果随机均匀偏差大于fx/M gx比率,则拒绝样本,其中gx是您的标书密度,M是fx/gx的界限,如上述Roxygen文档中所述

我在上面使用了一个指数建议分布,速率参数为1/4。你可以用其他的


该p.d.f.与伽马分布成比例,形状为2,比例为1,如所述。也就是说,如果你将这些参数插入伽马p.d.f,你会发现它与你的不同之处只是一个缩放常数。取决于你做这件事的目的,这可能是一个更好的方式,或者说是这样。我不确定你的目标是从任意分布中生成样本,比如这个作为例子,还是你需要这个分布本身的样本,等等。。。。通常,最好识别您的任意p.d.f.是否实际上是已实现分发的一个示例,但如果您不在这种情况下,则需要类似于拒绝抽样的内容。

到目前为止您尝试过的内容是否可能重复?你看过吗?还有,你的初学者问题的背景是什么?作业自学?等等。@maydin你应该把它作为一个答案发布,这样我们就可以投票否决它,因为它根本没有生成正确的分布。@ChrisHaug我不明白你的意思。函数在上面,x值也在上面。那么问题是什么呢?我只是用随机选择的x值生成y值。也许我没有弄清楚这个问题。@maydin我认为你误解了这个问题,因为结果样本没有密度fx=4xe^{-x}的所需分布,对于x>0,仅此而已。您生成的示例以4/e为界,但实际上大多数示例都应该大于4/e。您的评论在哪里?@severinpapadeux抱歉,我是指评论。当我第一次看到你的答案时,我有一个短暂的失误,数学不完全相等。但是,然后我意识到,它当然只是一个比例常数,因此成比例,这就是你所需要的。因此,我的答案的最后一段解释说,你的答案当然是正确的,因此我对它进行了修正,我只提供了更通用的算法,以防OP遇到无法将其自定义p.d.f.表示为伽马分布的情况