模拟随机样本的逆 CDF 方法

Inverse CDF method to simulate a random sample

我在编写这段代码时遇到问题,但我认为它可能存在问题。

这是问题: 编写一个名为 pr1 的 R 函数,它模拟来自 CDF 的分布的大小为 n 的随机样本,CDF 给出为..

F_X(x) = 0 for x<=10
     (x-10)^3/1000 for 10<x<20
    1 for x=>20

x = 10 ( 1 + u^(1/3)) #我在这里使用了逆CDF方法,现在我想从分布中模拟一个大小为n的随机样本。

这是我的代码:

 pr1 = function(n)

 { u = runif(n,0,1)
   x = 10 * ( 1 + u^(1/3))
   x }

 pr1(5)

#这只是为了检查 n=5

的例子

我的问题是,由于 CDF 是 10< x <20,这会以任何方式影响我的代码吗?

谢谢

您是否将 X 的范围与样本大小混淆了?前者限制在(10, 20)范围内,后者可以是任意正整数。

您可以通过考虑 U = 0 和 U = 1 来对您的反演进行合理性检查,U = 0 应该(并且确实)产生 X 范围的最小值,并且 U = 1 应该并且确实产生范围的最大值。不需要范围限制你的反演,限制是在输入端使用 U(0,1),结合 CDF 是单调的 non-decreasing 的事实。因此,0 < U < 1 的 U 值不会产生 10 < X < 20 范围之外的结果。

由于您要模拟 piece-wise 函数,因此您的 R 函数应包含一些流程控制,例如 if

这是一个开始:

pr1 = function(n, drawing_range){

    x <- sample(drawing_range, size = n) # random drawing of x

    if (x <= 10)  
         output <- 0
    else if ( 10 < x < 20 )
         output <- (x-10)^3/1000 
    else
         output <- 1

    output
}

n是抽奖次数。 drawing_range 是您抽取的人口;例如它可以来自 [-999, 999] 在这种情况下你输入 -999:999.